【问题标题】:PDO MySQL call returns unbuffered queries errorPDO MySQL 调用返回无缓冲查询错误
【发布时间】:2011-05-01 11:36:33
【问题描述】:

我在网上进行了研究,但大多数示例或说明似乎不适用于我想要完成的任务。

简而言之,我的代码应该完成以下工作:

从我的 php 脚本调用一个存储过程,它返回一个我想要循环的数据集并在表中生成行(用于在线显示目的)。但是,我的表中的一个字段必须调用一个单独的表(甚至不需要首先使用存储过程)来计算受 UserID 影响的总行数。

我下面的脚本返回此错误:

SQLSTATE[HY000]:一般错误:2014 在其他无缓冲查询处于活动状态时无法执行查询。考虑使用 PDOStatement::fetchAll()。或者,如果您的代码只针对 mysql 运行,您可以通过设置 PDO::MYSQL_ATTR_USE_BUFFERED_QUERY 属性来启用查询缓冲。

代码:

<body>
<table border='0' cellpadding='0' cellspacing='1'>
    <thead>
        <tr bgcolor='#E0EBF1'>
            <th>Agent NO</th>
            <th>Comm Lvl</th>
            <th>Agent Name</th>
            <th>Address</th>
            <th>parent_agent_name</th>
            <th>Contacts</th>
            <th>45 Day</th>
            <th>STS</th>
        </tr>
    </thead>
    <tbody>

<?php

$agetnumber = 123456789;


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

            $stmt = $db->query('CALL hier($agentnumber)');
            foreach($stmt as $row)
            {
                $sql = $db->query("SELECT AGENT FROM activity WHERE AGENT = '$row[AGTNO]");
                $foundrows = $db->query("SELECT FOUND_ROWS()")->fetchColumn();          

                echo sprintf("<tr><td>%s</td><td>%s</td><td>%s</td><td>%s</td><td>%s</td><td>%s</td><td>%s</td><td>%s</td></tr>",
                $row["AGTNO"], $row["AGTCOMMLVL"],
                $row["AGTFNAME"]."<br><i>Contracted: ".$row["KDATE"],
                $row["parent_agent_id"],
                $row["parent_agent_name"],
                $row["commission_level"],
                $foundrows,
                $foot);
            }           
            $db->commit();
        }

    catch (PDOException $e)
        {
            $db->rollback();
            echo $e->getMessage();
            exit;
        }

影响代码的行是:

$sql = $db->query("SELECT AGENT FROM activity WHERE AGENT = '$row[AGTNO]");
$foundrows = $db->query("SELECT FOUND_ROWS()")->fetchColumn();

删除它们“摆脱”错误,但我无法提取每个结果行集所需的 $foundrows 变量。

以前有人遇到过这个问题吗?

【问题讨论】:

  • 您考虑过实际错误信息中的说明吗?
  • @prodigitalson - 因此是我问题的第一行。我已经根据给出的错误进行了搜索,但使用 fetchALL 不适用于我的代码现在的布局方式(它不能因为我的行的循环发生在 foreach 期间)。
  • 也 - 我尝试过使用无缓冲查询:$db->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY);
  • 将整个结果集作为行数组获取和在 Traversable PDOStatement 中循环遍历结果之间有什么区别?您没有显示任何代码可以让您使用其中一个。
  • 我不认为您可以通过 set 属性设置缓冲查询属性...您必须在选项数组中将其设置为 PDO 构造函数。

标签: php mysql stored-procedures pdo


【解决方案1】:

由于您的查询不包含 LIMIT,我不确定您为什么要使用 FOUND_ROWS()。你不能简单地SELECT COUNT(*) FROM activity WHERE AGENT = '$row[AGTNO] 代替吗?

编辑:

事实上,如果我在字里行间多读一点,我认为您可以在一个查询中获得所需的一切。这可能被过度简化了,因为我没有hier 过程的所有细节,但它会是这样的:

SELECT ag.AGTNO, ag.AGTCOMMLVL, /* etc. */, count(ac.AGENT) as foundrows
    FROM agent ag
        LEFT JOIN activity ac
            on ag.AGTNO = ac.AGENT

【讨论】:

  • @Joe - 无论进行何种查询,我都会遇到与上述相同的问题。这是光标设置方式的错误,所以我的主要问题是我无法进行通话期间(我假设因为第一个调用仍在使用 foreach 循环运行。
  • 另外 - 已经在多个地方记录了脚本是 PDO 调用的正确方法:stackoverflow.com/questions/460010/…
  • @JM4:查看我编辑的答案,了解在您的第一个查询中获取计数的可能方法。
  • @Joe - 数量不是问题。请参阅上面发布的错误,不管是否找到了,我必须在上面的 $sql 语句处停止查询,然后再触及 foundrows。
  • @JM4:我想指出的是,我认为您可以将活动计数合并到您的层次过程中,并完全消除对第二次 SQL 调用的需要。
猜你喜欢
  • 1970-01-01
  • 2010-10-24
  • 1970-01-01
  • 2011-06-26
  • 1970-01-01
  • 1970-01-01
  • 2018-02-08
  • 2015-04-26
  • 1970-01-01
相关资源
最近更新 更多