嘿,伙计们,我正在用OOP PHP开发数据库连接,但我遇到了这个错误;
警告:mysqli_query()要求参数1为mysqli,在C:\Users中给定null。。。\第26行的function.php。
我是OOP的新手,所以任何帮助都非常感谢
<?php
class MyClass{
var $HOST = "localhost";
var $USER = "user";
var $PASS = "pass";
var $DB = "image_blog";
public $con;
function _construct(){
$this->host = $HOST;
$this->user = $USER;
$this->pass = $PASS;
$this->db = $DB;
$this->con = mysqli_connect($this->host, $this->user, $this->pass, $this->db);
}
public function query($sql)
{
$query = mysqli_query($this->con,$sql);
return $query;
}
}
$obj = new Myclass;
echo $obj->query("SELECT * FROM posts");
构造函数的名称必须是带有两个下划线的__construct
,而不是一个。
你可以自己调试这类问题。从错误向后看,您将首先对$this->con
(mysqli_query()
的第一个参数)执行var_dump()
。这将显示$this->con
未定义。接下来,您将返回到定义和添加die()
语句或类似语句的位置,看看该代码是否正在运行。你会发现事实并非如此。
从那里,你可以尝试从PHP文档中复制/粘贴一个已知的工作函数,然后你会发现构造函数可以工作。然后你所要做的就是比较你的两个构造函数,很可能你会立即发现你的错误。
var $HOST = "localhost";
var $USER = "user";
var $PASS = "pass";
var $DB = "image_blog";
阅读这个答案,您在这里使用了一种过时的语法来声明类属性(事实上,它们本身并不是变量)。在您的构造函数(其他人是对的,缺少第一个下划线)中,您只是引用未定义的局部变量,而不是属性本身。这里的解决方案是:
- 在
_construct
方法之前添加第二个下划线,使其成为__construct
,并且 - 根据这些属性更改构造函数
我建议将变量作为参数传递给构造函数,并以这种方式设置它们(这样就可以执行new MyClass( $host, $user, $pass, $db)
)。我也会更改,而不是使用var
关键字,声明这些属性如下:
protected $host = 'host';
// etc.
另一种选择是将它们定义为常量,因为当您当前使用它们时,它们永远不会真正改变:
const HOST = 'host';
您可以稍后将其引用为:
self::HOST
以下是文档中的相关引用:
为了保持与PHP 4的向后兼容性,PHP 5将仍然接受在属性声明中使用关键字var代替(或除了)公共的、受保护的或私有的。然而不再需要var。在5.0到5.1.3的PHP版本中var的使用被认为是不赞成的,并且会发出E_STRICT警告,但自PHP 5.1.3以来,它不再被弃用发出警告。
构造函数以2个下划线function __construct()
开头
正如其他人所说,构造函数以2个下划线开头,,我正在使用以下课程及其工作
class maindb_con
{
private $hostname;
private $username;
private $password;
private $dbname;
private $con;
function __construct()
{
$this->hostname = "**********";
$this->username = "**********";
$this->password = "**********";
$this->dbname = "**********";
if(!mysql_connect($this->hostname, $this->username, $this->password,$this->dbname))
{
echo'Error:: 1001 Couldnot connect to database. Please update hostname, username and password';
}
else
$this->con=mysql_connect($this->hostname, $this->username, $this->password);
}
/*function maindb_con($hname, $uname, $pwd, $dbname)
{
$this->hostname = $hname;
$this->username = $uname;
$this->password = $pwd;
$this->dbname = $dbname;
}*/
function get_con()
{
mysql_select_db($this->dbname,$this->con);
return $this->con;
}
function get_dbname()
{
return $this->dbname;
}
public function __destruct()
{
mysql_close($this->con);
}
}
您可以添加以下方法来运行查询并获得结果,如果查询不能按要求运行,则返回false
public function runQuery($query)
{
//echo "query on runQuery(): ".$query;
if($result=mysql_query($query,$this->con)) //or die("couldnt run mysql_query on runQuery for ".$query)
return $result;
return false;
}
或者这个类别可以用以下方式
$dbcon=new maindb_con();
$con=$dbcon->get_con();
//echo "query on runQuery(): ".$query;
if($result=mysql_query($query,$con))
......
请访问这里,它将为您提供PHP高级oop编程,并提供反馈。。。。
安全级别更改1
define("DB_HOST", 'yourhostaname');
define("DB_USER", 'dbusername');
define("DB_PASSWORD", 'dbpassword');
define("DB_DATABSE", 'databasename');
安全级别更改2
public到protected成员变量。
1) 您的数据库连接代码是程序样式,不适用于OOP
OOP风格:$this->con=新的mysqli($this->主机,$this->用户,$this->通行证,$this->db)
2) 您应该更改构造函数__construct()
3) 如果($this->con->connect_error)死亡('数据库错误->'.$this->con->connect_error),则检查条件;
4) 更改echo$obj->query("SELECT*FROM posts");打印_r($obj->query("SELECT*FROM posts"));OR var_dumb5)
public function query()
{
return $this->con;
}
6) obj->query("SELECT * FROM posts") or die(obj->error);