2011-06-20 132 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

相關問題