PHP mysql_*转换为mysqli时出现致命错误
我将mysql转换为mysqli,但我遇到了以下问题 php类(Functions.php): 数据库连接(dbconnect.php): 我将上面的文件包括在header.php中PHP mysql_*转换为mysqli时出现致命错误,php,mysqli,Php,Mysqli,我将mysql转换为mysqli,但我遇到了以下问题 php类(Functions.php): 数据库连接(dbconnect.php): 我将上面的文件包括在header.php中 include('inc/dbconnect.php'); include('inc/Functions.php'); 我让我的页面调用类函数,如下所示: $params = Functions::filter($_GET['param']); 加载页面时出现以下错误: 致命错误:在C:\xampp\htdoc
include('inc/dbconnect.php');
include('inc/Functions.php');
我让我的页面调用类函数,如下所示:
$params = Functions::filter($_GET['param']);
加载页面时出现以下错误:
致命错误:在C:\xampp\htdocs\site\inc\functions.php第XX行的非对象上调用成员函数real\u escape\u string()
我不是已经在dbconnect.php中为mysqli创建了一个对象吗?为什么会出现这种错误?它发生在Functions.php中所有相关的mysqli上
请告知,非常感谢 您已经在全局范围内创建了mysqli对象,因此必须添加
global$mysqli
到您的方法,或使用$GLOBALS['mysqli']
代替:
public static function filter($data) {
global $mysqli;
$data = trim(htmlentities(strip_tags($data)));
if(get_magic_quotes_gpc())
$data = stripslashes($data);
$data = $mysqli->real_escape_string($data);
return $data;
}
}
但我建议将对象作为函数参数传递:
public static function filter($data, $mysqli) {
$data = trim(htmlentities(strip_tags($data)));
if(get_magic_quotes_gpc())
$data = stripslashes($data);
$data = $mysqli->real_escape_string($data);
return $data;
}
}
然后:
$params = Functions::filter($_GET['param'], $mysqli);
您试图从全局范围访问
$mysqli
,因此应该在Functions::filter
方法中声明global$mysqli
尽可能不鼓励使用静态类和全局类。您可以通过以下方式编辑函数
类,使其更面向OOP:
class Functions {
private $mysqli;
声明私有属性以保存mysqli
对象。请注意,此处不允许NULL
。因此,我们需要声明一个构造函数来初始化我们的属性:
public function __construct(mysqli $mysqli_) {
$this->mysqli = $mysqli_;
}
通过类型暗示,它将避免任何不是mysqli
对象的东西作为参数传递。现在我们只需要将filter
方法作为实例方法:
public function filter($data){
$data = trim(htmlentities(strip_tags($data)));
if(get_magic_quotes_gpc())
$data = stripslashes($data);
$data = $this->mysqli->real_escape_string($data);
return $data;
}
}
请注意,
$mysqli
现在是$this->mysqli
,因为我们使用的是类的实例属性。您不应该用mysqli这样做,而是使用准备好的语句/参数化查询。否则,您可能会错过在全局范围中创建mysqli对象的要点,因此您必须添加global$mysqli
到您的方法,或者使用$GLOBALS['mysqli']
代替。但是我建议将对象作为函数参数传递。我可以进行练习样本工作吗?@conmen查看答案谢谢..它修复了错误,这是否意味着我必须在所有类型的类方法或函数中使用这种方式?@conmen,不,使用globals是非常糟糕的做法。只需遵循我答案中的提示。向类/方法中注入依赖项是一种很好的做法,而不是依赖于某个全局变量的存在。我尝试了您的提示,但得到了这个错误可捕获的致命错误:参数1传递给函数::u construct()必须是mysqli的一个实例,没有给出…
@conmen,是的,因为您没有将有效的mysqli
对象传递给构造函数。您是否尝试过$functions=新函数($mysqli)$params=$functions->filter($\u GET['param'])代码>?现在是另一个错误,致命错误:无法访问空属性
public function __construct(mysqli $mysqli_) {
$this->mysqli = $mysqli_;
}
public function filter($data){
$data = trim(htmlentities(strip_tags($data)));
if(get_magic_quotes_gpc())
$data = stripslashes($data);
$data = $this->mysqli->real_escape_string($data);
return $data;
}