2011-06-20 135 views
1

我得到这个错误:调用一个成员函数real_escape_string()一个非对象

Call to a member function real_escape_string() on a non-object

和这里的$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

+1

是的。似乎之前没有$ db。 – powtac

+3

*我没有实例化$ db *吗?不知道。你是否? –

+0

对不起,我以前做过。 – bear

回答

12

可能是更好的解决方案是创建一个单独的功能:

function get_my_db() 
{ 
    static $db; 

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

    return $db; 
} 

,并在每一个需要数据库实例功能,使用它像

$db = get_my_db(); 

+0

我不完全确定如何引用它来做real_escape_string检查。 – bear

+0

@Shamil:只需用'$ db替换'global $ db;' = get_my_db();'通常使用它 – zerkms

+0

@ZERKMS:感谢这个解决方案 - 我会推荐它给每个人,因为我的PHP会话处理程序有奇怪的问题在我的PHP - 尽管我给全局变量用于存储mysqli连接它在回调调用之间以某种方式消失,保持一个连接和工作的唯一方法是将连接存储为本地静态,如上所示。谢谢。 – Artur

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()); 
} 
+0

我忘了补充说我早些时候在文件中...以及事实上在它之上。 – bear

+1

嗯,不是真的。他可能已经初始化了,但**已经在其他地方重写了** – zerkms

+0

好的,bemace删除了我的SQL查询,但我假设你,它在那里。我甚至把它放在函数中。 – bear

0

还有,这并不需要一个数据库引用的全局函数。

$sessionId = mysql_real_escape_string($sessionId); 

http://php.net/mysql_real_escape_string

+0

为什么你认为OP有有效的mysql连接通过'mysql_connect'完成?btw,** php中的所有**功能都是全局的 – zerkms

+0

我使用$ db- > real_escape_string与其他一些东西,他们很好:0 – bear

相关问题