好的,我希望在發佈這個問題之前,我已經把所有東西都很好地列出來了,因爲我發現了一些解決方案,但沒有真正的答案我的問題。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類的析構函數中獲得了它,但也許這不是要走的路; - 我使用這個沒有在其他項目上的傷害,但這裏似乎會話處理器的行爲是不同的,困惑我:)
由於提前,如果你需要更多的信息,我會很樂意提供它。
我沒有聲明爲靜態的,只有實例。 – qwertzman 2010-07-30 00:41:02
顯然,自定義會話處理程序的讀取函數傳遞一個字符串,導致錯誤。我不確定如何繼續進行類型轉換或任何其他轉換我不得不做... – qwertzman 2010-07-30 01:14:49
我希望一些PHP OOP專家可以給我一些關於此的見解 - 我假設它與$有關編號是否序列化? read()函數是唯一產生這個問題的函數:轉義工作在所有其他自定義會話處理函數中。 – qwertzman 2010-07-31 02:15:47