2013-04-08 46 views
0
$s = &$_SESSION; 

我在準備語句中使用會話變量時遇到了下面提到的錯誤。工作會話的PDO表格?

// $ s是一個會話變量

我的查詢是:

$s['sQuery'] = 'SELECT * FROM `courses` WHERE (CONVERT(`title` USING utf8) = :search 
OR CONVERT(`description` USING utf8) = :search OR CONVERT(`duration` USING utf8) = :search 
OR CONVERT(`fees` USING utf8) = :search OR CONVERT(`pre_requisites` USING utf8) = :search) 
LIMIT '.$s['limitInc'].', '.$s['limit']; 

$s['rQuery'] = $conn->prepare($s['sQuery']); 

$s['rQuery']->bindValue(':search',$s['sAll'],PDO::PARAM_STR); 
// $s['All'] has post value by user 

$s['rQuery']->execute(); 

我收到此錯誤信息。

Fatal error: Uncaught exception 'PDOException' with message 'You cannot serialize or unserialize PDOStatement instances' in [no active file]:0 Stack trace: #0 [internal function]: PDOStatement->__sleep() #1 {main} thrown in [no active file] on line 0

+1

你想把PDO語句存儲在會話變量中的任何理由? – 2013-04-08 12:19:10

+0

那麼問題是什麼?如何避免錯誤?不要這樣做:) – 2013-04-08 12:23:10

+1

你使用所有這些轉換器的任何原因嗎? – 2013-04-08 12:36:42

回答

8

的問題是 - 無論什麼原因 - 你想存儲陣列$_SESSIONPDOStatement對象。除非您指定了會話中存儲的自定義保存處理程序對象,它將在會話保存中序列化並在會話加載時反序列化。因此,存儲在會話中的對象必須實現Serializable接口,其中PDOStatement不接受。

PDOStatement沒有實現可序列化接口,而是實現了__sleep()方法,該方法在PHP引擎序列化時調用,並拋出Exception。 (這是你所看到的錯誤)。這意味着只是告訴你不要那樣做;)

+0

它實際上實現它,但調用時引發異常:) – 2013-04-08 12:24:42

+1

@Jack確實?你從哪裏得到這些信息? PHP的文檔沒有提到:http://www.php.net/manual/en/class.pdostatement.php – hek2mgl 2013-04-08 12:27:44

+0

那麼,它實現__sleep(),不完全可序列化或許但在任何情況下類似。 – 2013-04-08 12:29:49