PHP mysql_ *转换为mysqli致命错误

时间:2013-03-23 20:57:51

标签: php mysqli

我将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。

请指教,非常感谢。

2 个答案:

答案 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因为我们正在使用该类的实例属性。

相关问题