我是面向对象PHP的新手,并且遇到以下代码问题。使用Mysqli的数据库查询在类中不起作用,但在外部工作正常。所以我的问题是,我做错了什么?
class webFile {
private $sql, $query;
function __construct() {
$sql = new mysqli('host','user','pass','dbname');
}
function doQuery() {
$queryText = "SELECT * FROM blog_posts WHERE number = '2'";
if($query = $this->sql->query($queryText)) {
$results = $query->fetch_array();
return $results['post_id'];
} else {
return "Error";
}
}
}
$object = new webFile();
echo $object->doQuery();
服务器错误日志显示“PHP致命错误:在非对象上调用成员函数查询()”......我是否犯了另一个愚蠢的错误?我在网上看过,但找不到与此问题相关的任何内容。任何帮助将不胜感激。
答案 0 :(得分:6)
在构造函数中,将mysqli设置为局部变量$sql
将构造函数更改为
function __construct() {
$this->sql = new mysqli('host','user','pass','dbname');
}
答案 1 :(得分:0)
正如Miguelo所说,问题是你在构造函数中写了 $ sql而不是$ this-> sql 。
但还有另一个问题。
如您所见,您的代码中有
private $sql, $query
我认为您不想在课程中的函数之间使用 $ query ,因此我会将其删除并离开:
private $sql;
但是如果你想在 函数之间使用它,那么 函数doQuery() 应该是这样的:
function doQuery() {
$queryText = "SELECT * FROM blog_posts WHERE number = '2'";
if($this->query = $this->sql->query($queryText)) {
$results = $this->query->fetch_array();
return $results['post_id'];
} else {
return "Error";
}
}
答案 2 :(得分:0)
这是一个PHP问题。截至本文,PHP不支持嵌套类。在7.0版本中有可能会发生变化,但据我所知,它还没有出现。
我认为你最好的选择是简单地使用你的类扩展MySQLi类,如下所示:
class webFile extends mysqli {
你可能想把它锁定一些。说到这一点,请注意MySQLi的构造不会被你自己的__construct()方法自动调用,所以你可能需要解决这个问题。
您还可以使用MySQLi的程序功能来实现所需的结果,而无需扩展MySQLi的类,这是我在查找目前有超过2600个视图且对您的问题没有明确正确答案的帖子时所关注的。
PHP的面向对象并不像某些人那样强大,希望这会在未来几年内发生变化。 PHP 7.0支持匿名类实例化,这表明它可能很快支持嵌套类。
编辑:我在PHP.net上发现了一个涵盖覆盖构造的链接。显然你自己的构造不会覆盖MySQLi,但你必须手动调用它,如: parent::__construct($host,$user,$pass,$db);
答案 3 :(得分:-1)
在php 5.3中,在类构造函数中初始化mysqli对象会破坏代码。我必须将mysqli对象作为参数传递给类才能工作。 这是无效的:
function __construct() {
$this->sql = new mysqli('host','user','pass','dbname');
}
但这会奏效:
function __construct($mysqli) {
$this->sql = new mysqli('host','user','pass','dbname');
}
其中$ mysqli参数可以是
new mysqli('host','user','pass','dbname');
从执行的php脚本传递。 mysqli类似乎有一个问题,我希望他们能在php 7中解决这个问题。 另一项工作是将其扩展为php手册页中的大纲。
答案 4 :(得分:-2)
出于某种原因,似乎您的$ SQL变量未被设置为MySQLi对象的实例。
我自己并不经常使用MySQLi;因为我对mysql_connect优先。
我建议如下:
$this->sql = mysql_connect($host,$user,$pass) or die( mysql_error());
$this->db = mysql_select_db($db) or die( mysql_error());
或者如果您设置了MySQLi对象 -
try
{
$this->sql = new mysqli('host','user','pass','dbname');
}
catch(Exception $e)
{
// throw another exception or something
}
假设连接引发错误 - 这会让您知道它已失败并允许您进行更正。