我将mysql_ *转换为mysqli,但我遇到了以下问题。
php class(Functions.php):
class Functions{
public static function filter($data){
$data = trim(htmlentities(strip_tags($data)));
if(get_magic_quotes_gpc())
$data = stripslashes($data);
$data = $mysqli->real_escape_string($data);
return $data;
}
}
数据库连接(dbconnect.php):
$dbhost = 'localhost';
$dbuser = 'xxxxxx';
$dbpass = 'xxxxxx';
$dbname = 'xxxxxx';
$mysqli = new mysqli($dbhost, $dbuser, $dbpass, $dbname);
if(mysqli_connect_errno()){
printf("Connect failed: %s\n", mysqli_connect_error());
exit();
}
我在header.php中包含上面的文件,如
include('inc/dbconnect.php');
include('inc/Functions.php');
我的页面调用了类函数,如:
$params = Functions::filter($_GET['param']);
加载页面时出现此错误:
致命错误:在第XX行的C:\ xampp \ htdocs \ site \ inc \ functions.php中的非对象上调用成员函数real_escape_string()
我是不是已经在dbconnect.php中为mysqli创建了一个对象?为什么会出现此错误?它发生在Functions.php中所有相关的mysqli。
请指教,非常感谢。
答案 0 :(得分:1)
您已在全局范围内创建了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);
答案 1 :(得分:0)
您正尝试从全局范围访问$mysqli
,因此您应在global $mysqli
方法中声明Functions::filter
。
尽可能不鼓励使用静态类和全局变量。您可以通过以下方式编辑Functions
类以更加面向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
因为我们正在使用该类的实例属性。