Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/233.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP mysql_*转换为mysqli时出现致命错误_Php_Mysqli - Fatal编程技术网

PHP mysql_*转换为mysqli时出现致命错误

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

我将mysql转换为mysqli,但我遇到了以下问题

php类(Functions.php):

数据库连接(dbconnect.php):

我将上面的文件包括在header.php中

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;
    }