$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();


我收到此错误消息。


  致命错误:[无活动文件]:0中未捕获的异常“ PDOException”,消息为“您无法序列化或反序列化PDOStatement实例”:0堆栈跟踪:#0 [内部函数]:PDOStatement-> __ sleep()#1 {main}被抛出第0行上的[无活动文件]

最佳答案

问题是-出于某种原因-您试图将PDOStatement对象存储在$_SESSION数组中。除非您指定了自定义保存处理程序对象,否则存储在会话中的对象将在会话保存时序列化,并在会话加载时反序列化。因此,存储在会话中的对象必须实现Serializable接口,而PDOStatement则不能。

PDOStatement不仅实现了可序列化的接口,还实现了__sleep()方法,该方法由PHP引擎在序列化时调用,并抛出异常。 (这是您看到的错误)。意思是告诉您不要这样做;)

07-24 17:10