带有OOP的OOPS,PHP数据库连接
嘿,我正在开发与OOP PHP的数据库连接,我卡住了这个错误;
警告:mysqli_query()期望参数1是在第26行的C: Users ... function.php中给出的mysqli,null。
我是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()
上执行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,而不是(或除了)public,protected或private。 但是,var不再是必需的。 在从5.0到5.1.3的PHP版本中,var的使用被认为已被弃用,并会发出E_STRICT警告,但是自PHP 5.1.3开始,它不再被弃用,并且不会发出警告。
构造function __construct()
以2个下划线function __construct()
开头