在PHP类中使用Mysqli的问题
我是面向对象PHP新手,对以下代码有问题。使用Mysqli的数据库查询在类内不起作用,但在类外可以正常工作。所以我的问题是,我做错了什么在PHP类中使用Mysqli的问题,php,oop,mysqli,Php,Oop,Mysqli,我是面向对象PHP新手,对以下代码有问题。使用Mysqli的数据库查询在类内不起作用,但在类外可以正常工作。所以我的问题是,我做错了什么 class webFile { private $sql, $query; function __construct() { $sql = new mysqli('host','user','pass','dbname'); } function doQuery() { $queryText
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致命错误:对非对象调用成员函数query()”。。。我又犯了一个愚蠢的错误吗?我在网上查过了,但是找不到任何与这个问题相关的东西。任何帮助都将不胜感激。在构造函数中,您将mysqli设置为局部变量
$sql
将构造函数更改为
function __construct() {
$this->sql = new mysqli('host','user','pass','dbname');
}
在构造函数中,您将mysqli设置为局部变量
$sql
将构造函数更改为
function __construct() {
$this->sql = new mysqli('host','user','pass','dbname');
}
出于某种原因,$SQL变量似乎没有设置为MySQLi对象的实例 我个人并不经常使用MySQLi;因为我更喜欢mysql\u 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
}
假设连接抛出错误-这将让您知道它已失败,并允许您进行更正。由于某种原因,$SQL变量似乎未设置为MySQLi对象的实例 我个人并不经常使用MySQLi;因为我更喜欢mysql\u 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
}
假设连接抛出错误-这将让您知道它已失败并允许您进行更正。正如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";
}
}
正如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";
}
}
这是一个PHP问题。在本文中,PHP不支持嵌套类。在7.0版中有可能会发生变化,但据我所知,它还没有准备好 我认为您最好的选择是简单地使用您的类来扩展MySQLi类,如下所示:
class webFile extends mysqli {
你可能想把它锁起来。说到这里,请注意MySQLi的构造不会被您自己的_construct()方法自动调用,因此您可能需要解决这个问题
您还可以使用MySQLi的过程功能来实现所需的结果,而无需扩展MySQLi的类。当我发现这篇文章时,我正在研究这个类,它目前有2600多个视图,并且对您的问题没有绝对正确的答案
PHP的面向对象并不像某些面向对象那样健壮,希望在未来几年内这种情况会有所改变。PHP7.0支持匿名类实例化,这表明它可能很快就会支持嵌套类
编辑:我在PHP.net上找到了一个覆盖覆盖该构造的链接。显然,您自己的构造不会覆盖MySQLi,但您必须手动调用它,如中所示:
parent::__construct($host,$user,$pass,$db);
这是一个PHP问题。在本文中,PHP不支持嵌套类。在7.0版中有可能会发生变化,但据我所知,它还没有准备好 我认为您最好的选择是简单地使用您的类来扩展MySQLi类,如下所示:
class webFile extends mysqli {
你可能想把它锁起来。说到这里,请注意MySQLi的构造不会被您自己的_construct()方法自动调用,因此您可能需要解决这个问题
您还可以使用MySQLi的过程功能来实现所需的结果,而无需扩展MySQLi的类。当我发现这篇文章时,我正在研究这个类,它目前有2600多个视图,并且对您的问题没有绝对正确的答案
PHP的面向对象并不像某些面向对象那样健壮,希望在未来几年内这种情况会有所改变。PHP7.0支持匿名类实例化,这表明它可能很快就会支持嵌套类
编辑:我在PHP.net上找到了一个覆盖覆盖该构造的链接。显然,您自己的构造不会覆盖MySQLi,但您必须手动调用它,如中所示:
parent::__construct($host,$user,$pass,$db);
在PHP5.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类似乎有一个问题,我希望他们能在php7中解决这个问题。
另一个解决方法是将其扩展为php手册页面中的大纲。在PHP5.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类似乎有一个问题,我希望他们能在php7中解决这个问题。
另一个解决方法是将其扩展为php手册页面中的大纲。所有mysql_*函数都不受欢迎。很抱歉,php文档中没有最新的内容-我不知道这意味着它不是一个有效的解决方案。谢谢你往下说。答案是正确的,但你把他送进了一条封闭的道路,我自己也认为这是一条崎岖不平的道路,不太可能