Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 重用PDO语句var会使进程崩溃_Php_Mysql_Pdo - Fatal编程技术网

Php 重用PDO语句var会使进程崩溃

Php 重用PDO语句var会使进程崩溃,php,mysql,pdo,Php,Mysql,Pdo,我正在重用一个变量来存储两个不同的PDO mysql语句: $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/la

我正在重用一个变量来存储两个不同的PDO mysql语句:

$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…”);没有奇怪的事情发生,station执行正常。如果启用prepare emulation,也不会有问题:

$dbh->setAttribute(PDO::ATTR\u EMULATE\u PREPARES,true)

在执行第一条语句后,我尝试了
$stmt->closeCursor()
,也尝试了
unset($stmt)
(以及两者),产生了相同的崩溃。我使用的是PHP5.4.7。为什么会发生这种情况?这是一个bug还是一个非常奇怪的特性

[UPDATE]我从xampp切换到OpenSUSE 12.3默认Apache(2.2.22)和PHP(5.3.17),仍然得到相同的错误,但更详细的转储日志:

[UPDATE 2]我还确认,当使用MySQL 5.5.27而不是MariaDB 5.5.29作为服务器时,会发生这种情况,因此它完全来自我的脚本,并且非常通用(还将尝试centos虚拟机,以防我的发行版中出现与glibc相关的问题…),在不同版本的apache上发生,mysql和php,但仍然不知道原因是什么


[UPDATE 3]看来CentOS 6.4的性能要好得多,让我可以毫无困难地运行我的脚本,而且因为它是我在生产中使用的,我想没什么好担心的。无论如何,我真的很想知道这里发生了什么…

很抱歉更新太晚,但我在PDO(Sybase)上也遇到了类似的问题,我可以确认,一定要避免在不取消设置或设置为null的情况下重复使用语句变量

在PHP中,每当我们覆盖一个变量值时,它首先创建一个新变量,然后替换并销毁旧值。在大多数情况下,这不是一个问题(除了为分配单个变量花费双倍的内存),但是对于语句来说,这是完全不同的,因为它在创建第二个语句时不会关闭第一个语句或游标,并且一些数据库驱动程序不能很好地处理同一PDO连接中的多个语句

根据您使用的驱动程序,
PDOStatement::closeCursor()
可能无法关闭语句,因此问题仍然存在(至少我们可以看到它取决于驱动程序,否则它将使用不关闭语句的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人员报告。任何可能导致C级无效指针错误的php代码都是一个主要错误,需要消除。您使用的是什么驱动程序?比如,什么db类型?MySQL?
mysqld版本5.5.29-MariaDB-log for Linux on x86_64(源代码发行版)
来自OpenSUSE 12.4 x64和Apache 2.4.3,以及最新xampp发行版的PHP5.4.7(顺便说一句,是32位版本)。我和您做的一样,有时我甚至重复使用12次stmt,我只是覆盖了那个变量,现在我没有问题?如果可以覆盖,为什么要取消设置?在重新分配语句变量之前,我尝试取消设置它,但没有帮助。唯一的解决方法是使用不同的方法。我不记得当时的确切设置,但我认为问题可能与我在OpenSUSE中使用的libc版本有关,正如回溯所示,因为我无法在其他发行版中使用相同的apache、PHP和MySQL版本重现该漏洞,而切换apache、MySQL和PHP版本并不能解决该发行版上的问题。