【发布时间】: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(); } -
这是一次准备参数化语句并使用新值多次执行它的完美情况