mysql准备语句在查询while循环时

时间:2018-03-20 09:25:07

标签: php mysql

我试图在返回查询的while循环的每次迭代中运行mysql查询。如果我使用普通查询函数(mysqli_query),它可以工作。但是,如果我将它作为预备语句运行,它就不再起作用了。我不确定问题出在哪里。

以下是工作代码:

function pagGenerateResult(){

    $pgSql = "SELECT * from table1 ;"
    $result = $conn->query($pgSql);
    if ($result->num_rows > 0) {
        while($row = $result->fetch_assoc()) {    
            $var1=$row["r1"] ;
            $var2=$row["r2"] ;
            $var3=$row["r3"] ;
            $var3=$row["r3"] ;

           $insertSql= " UPDATE pg_rd SET num1='$var1' ,num2='$var2',num3='$var3' WHERE num4='$var4' ";

        mysqli_query($conn,$insertSql);
        }
    } else {
        echo "MySQL Error: 0 result ";
    }
    $result->free();
    $conn->close();
    die();
}

如果我将while循环中的逻辑更改为如下所示的预准备语句,它就会停止工作。

function pagGenerateResult(){

    $conn=new mysqli($servername,$username,$password,$dbname);
    $pgSql = "SELECT * from table1 ;"
    $result = $conn->query($pgSql);

    if ($result->num_rows > 0) {
        while($row = $result->fetch_assoc()) {    
            $var1=$row["r1"] ;
            $var2=$row["r2"] ;
            $var3=$row["r3"] ;
            $var3=$row["r3"] ;

            $insertSql= " UPDATE pg_rd SET num1=? ,num2=?,num3=? WHERE num4=? ";
            //prepared statement 
            $stmt=mysqli_stmt_init($conn);
            if(!mysqli_stmt_prepare($stmt,$insertSql)){
              echo "SQL prepared statement error";
            }
            else{
              mysqli_stmt_bind_param($stmt,"fffi",$var1,$var2,$var3,$var4);
              mysqli_stmt_execute($stmt);
            }

        }
        // echo $recomSpace. " ". $numPgs. " ". $numSlot;
    } else {
        echo "MySQL Error: 0 result ";
    }
    $result->free();
    $conn->close();
    die();
}

2 个答案:

答案 0 :(得分:0)

首先,你有$var3的双重声明(可能你的意思是$var4r4

 $var1=$row["r1"] ;
 $var2=$row["r2"] ;
 $var3=$row["r3"] ;
 $var3=$row["r3"] ;

其次,不是在PHP中使用循环,而是使用update-join

update pg_rd p
inner join table1 t on t.r4 = p.num4
set
  p.num1 = t.r1,
  p.num2 = t.r2,
  p.num3 = t.r3
;

答案 1 :(得分:0)

您可以尝试以下代码。我选择了程序风格的mysqli,以便一致且更容易消化。我还没有完全测试代码。希望它已经工作正常。

您没有设置 $ var4 。检查代码中的注释问题。

function pagGenerateResult(){
    $conn=mysqli_connect($servername,$username,$password,$dbname);
    $pgSql = "SELECT * from table1";
    $result = mysqli_query($conn, $pgSql);

    if ( mysqli_num_rows( $result ) > 0) {
        while($row = mysqli_fetch_assoc($result)) {    
            $var1=$row["r1"] ;
            $var2=$row["r2"] ;
            $var3=$row["r3"] ;
            $var4=$row["r3"] ; // r3 or r4?

            $insertSql= " UPDATE pg_rd SET num1=? ,num2=?,num3=? WHERE num4=? ";
            //prepared statement 
            $stmt = mysqli_stmt_init($conn);

            if( mysqli_stmt_prepare($stmt,$insertSql) == FALSE ) {
              echo "SQL prepared statement error";
            }
            else{
              mysqli_stmt_bind_param($stmt,"fffi",$var1,$var2,$var3,$var4);
              mysqli_stmt_execute($stmt);
            }
        }
        mysqli_free_result($result);
    } else {
        echo "MySQL Error: 0 result ";
    }
    mysqli_close( $conn );
    die();
}