【发布时间】: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