在非对象上调用成员函数real_escape_string()

时间:2011-06-20 23:52:30

标签: php mysql

我收到了这个错误:

  

致电会员功能   非对象上的real_escape_string()

这里是$db

  

$ db = new mysqli(“127.0.0.1”,“username”,“password”,“sch5400”);

代码:

function readSession($sessionId) {
    global $db;
    $sessionId = session_id();
    // escape session ID
    $sessionId = $db->real_escape_string($sessionId);
    $time = time();
    $result = $db->query("SELECT sessiondata FROM sessions WHERE sessionid='$sessionId' AND expiry > $time");
    if ($result->num_rows > 0) {
        $row = $result->fetchRow();
        return $row['sessiondata'];
    }
    // return empty string
    return "";
    }

相对于上面的代码,它出现在第5行。我没有实例化$db吗?

3 个答案:

答案 0 :(得分:14)

可能更好的解决方案是创建一个单例函数:

function get_my_db()
{
    static $db;

    if (!$db) {
        $db = new mysqli("127.0.0.1", "username", "password", "sch5400");
    }

    return $db;
}

并像

一样使用它
$db = get_my_db();

在每个需要db实例的函数中。

答案 1 :(得分:1)

您尚未在显示的代码中的任何位置初始化$db,并且从错误中听起来它还没有在其他地方(尚未)初始化。

如果要在某处初始化$db ,请在调用 readSession之前确保它是。在建立连接时也要检查错误消息。它会在出错时返回false,这不是对象。

从PHP手册

,您应该使用这些错误检查方法之一来确保成功建立连接:

/*
 * This is the "official" OO way to do it,
 * BUT $connect_error was broken until PHP 5.2.9 and 5.3.0.
 */
if ($mysqli->connect_error) {
    die('Connect Error (' . $mysqli->connect_errno . ') '
            . $mysqli->connect_error);
}

/*
 * Use this instead of $connect_error if you need to ensure
 * compatibility with PHP versions prior to 5.2.9 and 5.3.0.
 */
if (mysqli_connect_error()) {
    die('Connect Error (' . mysqli_connect_errno() . ') '
            . mysqli_connect_error());
}

答案 2 :(得分:0)

还有一个不需要db引用的全局函数。

$sessionId = mysql_real_escape_string($sessionId);

http://php.net/mysql_real_escape_string