0

我将 mysql_* 转换为 mysqli,但遇到以下问题。

php 类(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 上。

请指教,非常感谢。

4

2 回答 2

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);
于 2013-03-23T21:10:08.533 回答
0

您正在尝试$mysqli从全局范围访问,因此您应该global $mysqliFunctions::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因为我们正在使用类的实例属性。

于 2013-03-23T21:10:40.373 回答