$s = &$_SESSION;
我在prepare语句中使用会话变量时遇到了下面提到的错误。
// $ 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();
我收到此错误消息。
致命错误:在[无活动文件]中显示消息'您无法序列化或反序列化PDOStatement实例'的未捕获异常'PDOException':0堆栈跟踪:#0 [内部函数]:PDOStatement-> __ sleep()#1 { main}在第0行的[无活动文件]中抛出
答案 0 :(得分:8)
问题在于 - 无论出于何种原因 - 您正试图在PDOStatement
数组中存储$_SESSION
对象。除非您指定了自定义保存处理程序,否则存储在会话中的对象将在会话保存时序列化,并在会话加载时反序列化。因此,存储在会话中的对象必须实现Serializable
接口,PDOStatement
不会。
PDOStatement
不是实现可序列化接口,而是实现了__sleep()
方法,该方法在PHP引擎的序列化中调用,并抛出异常。 (这是你看到的错误)。这意味着只是告诉你不要那样做;)