PDO MySQL调用返回无缓冲的查询错误

时间:2010-10-27 18:17:49

标签: php mysql stored-procedures pdo

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

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

从我的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变量。

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

1 个答案:

答案 0 :(得分:0)

由于您的查询不包含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