MySQL Prepared Statement:更新多个值

Posted

技术标签:

【中文标题】MySQL Prepared Statement:更新多个值【英文标题】:MySQL Prepared Statment: Updating multiple values 【发布时间】:2020-04-12 06:51:28 【问题描述】:

我创建了一个包含 10 个输入的表单,它可以从数据库中获取默认值。

    <form class="updatePrices" action="includes\updateprices.inc.php" method="POST">

    <?php

    $sql = "SELECT * FROM price ";
    $results = mysqli_query($conn, $sql) or die();
    $name = "90";

    while($row = mysqli_fetch_assoc($results)) 
      echo " " . $row["name"]. " <input type='text' name=".$row['id']." value=$row['value']><br>";
      echo " <input type='hidden' name=".$name." value=$row['id']>";
      $name++;
    
    echo  '<button type="submit" name="update-submit">Ok</button>';
?>
</form>

现在我希望表单根据新的输入值更新数据库。

<?php
require 'dbh.inc.php';

$id = [$_POST['90'],$_POST['91'],$_POST['92'],$_POST['93'],$_POST['94'],$_POST['95'],$_POST['96'],$_POST['97'],$_POST['98'],$_POST['99']];
$price = [$_POST['1'],$_POST['2'],$_POST['3'],$_POST['4'],$_POST['5'],$_POST['6'],$_POST['7'],$_POST['8'],$_POST['9'],$_POST['10']];
$sql= "UPDATE price SET value= ? WHERE id = ?";
$stmt = mysqli_stmt_init($conn);
if (!mysqli_stmt_prepare($stmt, $sql)) 
    header("Location: ../manage.price.php?error=sqlerror");
    exit();
else 

    mysqli_stmt_bind_param($stmt, "ii", $price, $id);

    for($i=0;$i<10;$i++)
        $id[$i];
        $price[$i];
        mysqli_stmt_execute($stmt);
    
    header("Location: ../manage.price.php?success");
    exit();

mysqli_stmt_close($stmt);
mysqli_close($conn);

但由于某种原因,我的代码仅将第一个值更新为 1(与输入值无关)

【问题讨论】:

您将参数绑定到您定义的数组,然后在您的 for 循环中,您只需执行语句。 $id[$i]; $price[$i]; 对这些变量值什么都不做。 你用数组本身而不是单个值调用mysqli_stmt_bind_param 有点相关:***.com/questions/36777813/… 谢谢@NigelRen 【参考方案1】:

您必须在每次循环时将 2 个参数的新值设置到准备好的语句中,然后使用新值执行()语句,并且按照 cmets 中的建议,您不需要将数组值移动到标量中首先,可以直接使用数组

else 

    for($i=0;$i<10;$i++)
        mysqli_stmt_bind_param($stmt, "ii", $price[$i], $id[$i]);
        mysqli_stmt_execute($stmt);
    



如果你使用 OO 语法,我认为它更容易阅读

else 

    for($i=0;$i<10;$i++)
        $stmt->bind_param('ii', $price[$i], $id[$i]);
        $stmt->execute();
    


【讨论】:

以上是关于MySQL Prepared Statement:更新多个值的主要内容,如果未能解决你的问题,请参考以下文章

使用 PDO Prepared Statement 在 MySQL 中插入 BIT 值

PHP MySQL Prepared Statement Join 错误

Prepared SQL Statement Syntax

在 MySQL 中导入 50K+ 记录给出一般错误:1390 Prepared statement contains too many placeholders

未找到 Java Prepared statement 错误表

使用 Prepared Statement 设置 LONG 数据类型