“无法在其他未缓冲的查询处于活动状态时执行查询”循环错误

时间:2013-12-16 09:55:36

标签: php mysql pdo

我很抱歉提出这个问题。我已经阅读了很多,但从未找到我成功实施的解决方案。我发现的所有提示和技巧都对我毫无用处。

我有一个大的关联数组,其中包含我想使用PDO存储过程插入mysql数据库的数据。

$data_arr = {a lot of data with keys: Name, Nbr, Val} //This is really 41 columns
$inputs = array('Name','Nbr','Val');
$query = 'CALL add_edit_standard(:Name,:Nbr,:Val)';
$stmt = $db->prepare($query);
foreach($inputs AS $Akey => $Aval){
    $values[$Aval]=0;
    $stmt->bindParam(':'.$Aval,$values[$Aval]);
}
foreach($data_arr AS $key => $val){
    $values = $val;
    $stmt->execute();
    $res = $stmt->fetchAll();
}

这对于$ data_arr中的第一行完全正常,但第二行和其他行引发错误:

  

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

我尝试过fetchAll(),以及没有运气的连接属性。 我还尝试为每个电话做一个新的声明:

foreach($data_arr AS $key => $val)
{
    $values = $val;
    $stmt = $db->prepare($query);
    foreach($inputs AS $Akey => $Aval)
    {
        $stmt->bindValue(':'.$Aval,$values[$Aval]);
    }
    $stmt->execute();
    $res = $stmt->fetchAll();
    $stmt->closeCursor();
}

同样,这适用于第一行,但随后会抛出以下错误:

  

警告:数据包乱序。预计1收到57.数据包大小= 7

我已经尝试过我想出的一切。请帮我找到一种方法让它发挥作用。

2 个答案:

答案 0 :(得分:1)

使用未命名参数进行动态查询比使用命名参数更简单。

即INSERT

$columnNames = array("id","name","address"); 
$columnStr ='';
foreach ($columnNames as $value)
    {
    $columnStr .= $value.",";
    }
$columnStr = substr($columnStr, 0, -1);
$values = array(1,"john","Home"); 
$params  = str_repeat('?, ', count($values) - 1) . '?';
$sql = "INSERT INTO table1 ($columnStr)  VALUES ($params) ";
$stmt = $dbh->prepare($sql); 
$stmt->execute($values);

生成查询

INSERT INTO table1 (id,name,address) VALUES (?, ?, ?)

答案 1 :(得分:1)

在执行循环中获取所有结果后,应该获取下一个行集,然后在尝试再次执行存储过程之前关闭游标。试试这个:

foreach($data_arr AS $key => $val){
    $values = $val;
    $stmt->execute();
    $res = $stmt->fetchAll();
    $stmt->nextRowset();   // NEW: Get the next rowset after fetching your results
    $stmt->closeCursor();  // NEW: Close the cursor
}

这里真正重要的是对nextRowSet()的呼唤。在引擎盖下,PDO返回第二个 rowset ,您需要在同一连接上执行第二个(和后续的)存储过程之前访问它。