";当其他未缓冲的查询处于活动状态时无法执行查询“;循环中出现错误


"Cannot execute queries while other unbuffered queries are active" error in loop

很抱歉问这个问题。我读过很多类似的书,但从未找到一个可以成功实现的解决方案。我发现的所有提示和技巧对我来说都没有用。

我有一个包含数据的大型关联数组,我想使用带有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(),以及connection属性,但没有成功。我还试着为每个电话做一个新的声明:

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

我想出来的东西都试过了。请帮我想办法让它发挥作用。

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

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正在返回第二个行集,在同一连接上执行第二个(及后续)存储过程之前,您需要访问该行集。

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

即插入

$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 (?, ?, ?)