2

在我的 php 页面的顶部,我包含了一个连接脚本,该脚本由以下代码调用:

include("connector.php")

连接器.php

<?php

    try
    {
        $db = new PDO('mysql:host=localhost;dbname=DB', 'USER', 'PW');
        $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    }

    catch (PDOException $e)
    {
        echo $e->getMessage();
    }
?>

然后,我会根据需要在我的页面上进行所有后续调用。然而,特别是在一页上,我最初调用了一个 MySQL 存储过程:

$stmt = $db->prepare("CALL Procedure(:id)");
$stmt->bindParam(':id', $id);
$stmt->execute();

while($row=$stmt->fetch()) {
    echo "<tr>
        <td>".$row['ID']."</td>
        <td>".$row['NAME']."</td>
        </tr>";
}

我的存储过程没有问题,但是当我尝试进行任何后续调用时,在页面下方,我得到了通常的 PDO Mysql 无缓冲查询错误:

致命错误:未捕获异常 'PDOException' 并带有消息 'SQLSTATE[HY000]:一般错误:2014 无法在其他无缓冲查询处于活动状态时执行查询。考虑使用 PDOStatement::fetchAll()。或者,如果您的代码只针对 mysql 运行,您可以通过设置 PDO::MYSQL_ATTR_USE_BUFFERED_QUERY 属性来启用查询缓冲。在 C:\page.php:261 堆栈跟踪:#0 C:\page.php(261): PDOStatement->execute(Array) #1 {main} 在第 261 行的 C:\page.php 中抛出

是的,我尝试过使用 FetchAll,但不,我不想使用 PDO::MYSQL_ATTR_USE_BUFFERED_QUERY 属性,因为我们可能会在稍后关闭 MySQL,而且我不希望基于每个 DB 进行重建(更不用说当我确实包含它时它不起作用)。

任何想法为什么会发生这种情况?我可以在每次 DB 调用之前“包含”connector.php 文件,但这似乎是重复的,我必须为每个语句设置 $db->NULL。

注意:这似乎只影响调用存储过程的页面。有任何想法吗?

注意:这是在运行 Apache 2.2.14、PHP 5.3.1 的 XAMPP 1.7.3 的 Windows 机器上运行的

4

2 回答 2

1

显然,这是由 PHP 中的错误和 Windows 机器上缺乏对存储过程的支持引起的。

请尝试以下方法:http ://bugs.php.net/bug.php?id=39858

查看最后一条评论:1221253320似乎已修复,您可以尝试将您的 PHP 更新到最新版本。5.3

我的建议:如果您使用预打包的“服务器”套件,例如 xampp,那么您应该将它们全部废弃,使用存储管理中的存储扩展器对 2GB 硬盘驱动器进行分区,分别安装 MySql、PHP、Apache,然后配置它们。

使用 PHP 的最新快照和最新的 MySql Distro,将您的应用程序和数据库迁移到新安装,启动您的计算机,它应该可以正常运行。

我敢打赌它也可能归结为 MySql 客户端库,升级它们

我遇到的一些相关链接:

于 2011-02-15T22:31:11.487 回答
0

PDO 无缓冲查询和存储过程。

PDO 无缓冲查询

于 2011-02-15T22:42:31.083 回答