【问题标题】:mysql prepared statement in query while loopmysql在查询while循环中准备好的语句
【发布时间】:2018-08-29 01:03:36
【问题描述】:

我试图在返回查询的 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();
}

【问题讨论】:

  • 为什么要将 oop 方式与程序方式混合。在您的第二个代码中执行其中一个。
  • #1:将准备好的语句移到循环之外,并在循环中绑定特定的变量。这是好处之一:您可以重复使用该语句。
  • 试试这个:- function pagGenerateResult(){ $conn=new mysqli($servername,$username,$password,$dbname); $pgSql = "SELECT * from table1 ;" $result = $conn->query($pgSql); if ($result->num_rows > 0) { if($stmt = $conn->prepare("UPDATE pg_rd SET num1=? ,num2=?,num3=? WHERE num4=? ")){ while($row = $result->fetch_assoc()) { $var1=$row["r1"] ; $var2=$row["r2"] ; $var3=$row["r3"] ; $var3=$row["r3"] ; $stmt->bind_param("fffi",$var1,$var2,$var3,$var4); $stmt->execute(); } $result->free(); } } $conn->close(); }
  • 这是一次准备参数化语句并使用新值多次执行它的完美情况

标签: php mysql


【解决方案1】:

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

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

其次,你可以使用 update-join 代替 PHP 中的循环

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
;

【讨论】:

    【解决方案2】:

    你可以试试下面的代码。我选择了程序风格的 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();
    }
    

    【讨论】:

      猜你喜欢
      • 2012-07-07
      • 2010-10-05
      • 2016-04-08
      • 1970-01-01
      • 1970-01-01
      • 2022-01-23
      • 2023-03-23
      • 1970-01-01
      相关资源
      最近更新 更多