脚本宝典收集整理的这篇文章主要介绍了php – 重用PDO语句var会崩溃进程,脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。
$stmt=$dbh->PRepare("SELECT ...."); $stmt->execute(); $stmt=$dbh->prepare("UPDATE ...."); //crash here: //*** Error in `/opt/lampp/bin/httpd': free(): invalid pointer: 0xf4a028dc *** //*** Error in `/opt/lampp/bin/httpd': free(): invalid pointer: 0xf4a028dc *** //[Mon Jun 03 19:53:48.691674 2013] [core:notice] [pid 20249] AH00052: child pid 25933 exIT //signal Aborted (6) //[Mon Jun 03 19:53:48.691727 2013] [core:notice] [pid 20249] AH00052: child pid 25952 exit //signal Aborted (6)
但如果相反我使用$stmt2 = $dbh-> prepare(“UPDATE ….”);没有什么奇怪的事情发生,并且法律执行正常.如果我启用准备仿真,它也没有问题:
$dbh->的setattribute(PDO :: ATTR_EMULATE_PREPARES,真正的);
我在执行第一个语句后尝试了$stmt-> closeCursor(),并且还取消设置($stmt)(以及它们两个),产生相同的崩溃.我使用的是PHP 5.4.7.为什么会这样?这是一个错误还是一个非常奇怪的功能?
[更新]我从xampp切换到OPEnSUSE 12.3默认apache(2.2.22)和PHP(5.3.17)仍然得到相同的错误,但更详细的转储日志:http://paste2.org/d0BtdOHI
[更新2]我也确认在使用MysqL 5.5.27而不是MariaDB 5.5.29作为服务器时会发生这种情况,因此它绝对是从我的脚本中提交的并且几乎是通用的(为了以防万一,还要尝试使用centos虚拟机)这是我的发行版中的一些glibc相关问题…),发生了不同版本的apache,MysqL和PHP,但仍然没有找到可能是什么原因的线索……
[更新3]好吧看起来CentOS 6.4对它来说更好了,让我运行我的脚本没有任何麻烦,因为它是我正在使用的生产,我想没有什么可担心的.无论如何,我真的想知道这里发生了什么……
在PHP中,每当我们覆盖变量值时,它首先创建新变量,然后才会替换并销毁旧值.在大多数情况下,这不是一个问题(除了花费双倍的内存来分配单个变量),但与语句完全不同,因为它不会关闭第一个语句或光标创建第二个语句时,以及一些数据库驱动程序不能很好地处理同一PDO连接中的多个语句.
根据您使用的驱动程序,PDOstatement :: closeCursor()可能不会关闭语句,因此问题仍然存在(在http://www.php.net/manual/en/pdostatement.closecursor.php我们可以看到它依赖于驱动程序,否则它将使用不关闭语句的PDO默认值).
所以在这种情况下,PDO :: prepare()之间的unset()会产生重大影响:
$stmt=$dbh->prepare("SELECT ...."); $stmt->execute(); unset($stmt); // or $stmt = null; --> statement is destroyed at PDO $stmt=$dbh->prepare("UPDATE ....");
以上是脚本宝典为你收集整理的php – 重用PDO语句var会崩溃进程全部内容,希望文章能够帮你解决php – 重用PDO语句var会崩溃进程所遇到的问题。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。