2010-07-29 42 views
0

好的,我希望在發佈這個問題之前,我已經把所有東西都很好地列出來了,因爲我發現了一些解決方案,但沒有真正的答案我的問題。PHP mysqli-> real_escape_string當使用保存在數據庫中的會話時

1:我使用mysqli的單身MySQL連接,不使用存儲過程;

2:我在網上找到解釋session_set_save_handler的代碼,並將它嵌入到名爲MySqlSessionStore的類中;

3:在我的DB類有這樣的公共職能:

public function escapeStringForDB($input) 
{ 
    return $this->_link->real_escape_string($input); 
} 

$this->_link = new mysqli($host, $user, $password, $database)

4:$db = MySQL::getInstance(array(DB_SERVER, DB_USER, DB_PASS, DB_NAME)); 這是我如何調用靜態DB函數(沒有什麼兩樣這裏)

問題:一切正常,直到我取消註釋$id = $db->escapeStringForDB($id);,然後發生以下錯誤:

調用一個成員函數real_escape_string()非對象

示例代碼MySqlSessionStore上:

function read($id) 
{ 
    $db = MySQL::getInstance(array(DB_SERVER, DB_USER, DB_PASS, DB_NAME)); 
    $id = $db->escapeStringForDB($id); 
    $db->query("SELECT data FROM sessions WHERE BINARY id = '". $id ."'"); 
    //echo "SELECT data FROM sessions WHERE id = '". $id ."'"; 
    $result = $db->fetch(); 


    if(isset($result) && !empty($result)) 
    { 
     return $result->data; 
    } 
    //MUST send an empty string if no session data 
    return ""; 
} 

其他問題,備註:

  • 我使用session_regenerate_id()但顯然這需要使用session_set_save_handler刪除;
  • 我到底在哪裏放session_write_close();?我已經在我的db類的析構函數中獲得了它,但也許這不是要走的路;
  • 我使用這個沒有在其他項目上的傷害,但這裏似乎會話處理器的行爲是不同的,困惑我:)

由於提前,如果你需要更多的信息,我會很樂意提供它。

回答

0

這應該工作:

public function escapeStringForDB($input) 
{ 
    $this->connect(); 
    return $this->_link->real_escape_string($input); 
} 
+0

我沒有聲明爲靜態的,只有實例。 – qwertzman 2010-07-30 00:41:02

+0

顯然,自定義會話處理程序的讀取函數傳遞一個字符串,導致錯誤。我不確定如何繼續進行類型轉換或任何其他轉換我不得不做... – qwertzman 2010-07-30 01:14:49

+0

我希望一些PHP OOP專家可以給我一些關於此的見解 - 我假設它與$有關編號是否序列化? read()函數是唯一產生這個問題的函數:轉義工作在所有其他自定義會話處理函數中。 – qwertzman 2010-07-31 02:15:47

相關問題