php准备stmt问题 - 在每个结果循环更新数据

时间:2010-07-07 08:32:55

标签: php prepared-statement

如果我想通过准备好的stmt每个查询循环更新数据,但为什么会失败。错误消息msg是“必须在新语句准备发生之前获取所有数据”

$link = mysqli_connect("localhost", "admin", "", "test");

if (!$link) {
    die('Connect Error: ' . mysqli_connect_error());
}

//field_1 is PK

if ($stmt = mysqli_prepare($link, "SELECT field_1, field_2 FROM table_data")) {
    mysqli_stmt_execute($stmt);    
    mysqli_stmt_bind_result($stmt, $col1, $col2);    

    while (mysqli_stmt_fetch($stmt)) {    
    $updateC= "update table_data set  field_3=? where field_1=?"    

    if ($stmt2= mysqli_prepare($link, $updateC)) {
        mysqli_stmt_execute($stmt2);
        $status='test'; //get return value from function            
        mysqli_stmt_bind_param($stmt2, 'ss', $status, $col1);
    }
  mysqli_stmt_close($stmt2);
 }


    mysqli_stmt_close($stmt);
}


mysqli_close($link);

1 个答案:

答案 0 :(得分:0)

您正在循环中准备第二个语句,该循环从第一个语句中检索数据。您可以通过创建两个连接来解决此问题。看这篇文章:

http://osdir.com/ml/php.zend.framework.db/2007-07/msg00027.html

您也可以将第一个查询中的所有行读入数组,然后遍历数组,将第二个查询放在该循环中。

可能可能(我还没试过),提前准备第二个声明。在循环中时,将变量绑定到它并执行它。这样的事情(完全未经测试!):

$stmt1 = mysqli_prepare($link, "SELECT field_1, field_2 FROM table_data");
$stmt2= mysqli_prepare($link, "update table_data set  field_3=? where field_1=?");

if ($stmt1 && $stmt2) {
    mysqli_stmt_execute($stmt1);    
    mysqli_stmt_bind_result($stmt1, $col1, $col2);

    while (mysqli_stmt_fetch($stmt)) {
        $status='test'; //get return value from function 
        mysqli_stmt_bind_param($stmt2, 'ss', $status, $col1);
        mysqli_stmt_execute($stmt2);
    }

    mysqli_stmt_close($stmt2);
    mysqli_stmt_close($stmt1);
}