【问题标题】:PDO loop for updating multiple rows用于更新多行的 PDO 循环
【发布时间】:2013-07-26 16:16:16
【问题描述】:

我有一个检索多行数据的表单,每个项目都有一个文本区域供用户评论特定项目。返回的项目数量是可变的,它们不必将 cmets 留在任何/所有框中。

    <textarea name="comment[]" cols="25" rows="2"><?php echo $f2; ?></textarea>
    <input name="tableid[]" type="hidden" value="<?php echo $f1; ?>">

echo 语句使用当前存储在数据库中的任何内容填充文本区域,因为用户可以修改其他人输入的内容。

当 this 被传递到表单处理页面时,它会返回 this..

    Submit: Submit
    comment: Test Comment 1,Test Comment 2
    tableid: 590,591

所以它似乎正确地传递了数组。我正在使用此代码来更新数据库

$conn = new PDO("mysql:host=xxxx;dbname=xxxxx",$username,$password);

$i = 0;
if(isset($_POST['submit'])) {
    foreach($_POST['comment'] as $comment) {
                        $comment = $_POST['comment'][$i];

            $id = $_POST['tableid'][$i];
            $stmt = $conn->prepare("UPDATE reservations SET comment=:comment WHERE     tableid=:id");

            $stmt->bindValue(':comment', $comment, PDO::PARAM_INT);
            $stmt->bindValue(':id', $id, PDO::PARAM_INT);

            $stmt->execute();

            $i++;
    }
}

但是,这似乎根本没有更新,我哪里出错了?

非常感谢

【问题讨论】:

  • PDO::PARAM_INT 的评论?
  • 您可以更有效地执行循环,但这个 PDO::PARAM_STR 可能是您打算用于评论的常量
  • 你可以去掉这行$comment = $_POST['comment'][$i];
  • foreach 循环的第一行,它使用 $comment 作为其索引,您更改 $comment。为什么?你需要 $i 做什么?
  • @TravelingTechGuy 其为$_POST['tableid'][$i];

标签: php mysql pdo


【解决方案1】:

几件事:

  1. 设置 PDO 以在错误时抛出 PDOExceptions。这将使调试变得更加容易。
  2. prepared statements 的要点是,您可以使用不同的变量多次调用它,这样,您只需准备一次,并多次调用它。您也可以从中获得不错的性能提升。

代码:

//New try/catch block to catch PDOExceptions should they arise.
try {
    $conn = new PDO("mysql:host=xxxx;dbname=xxxxx", $username, $password, [
        PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, //Set PDO to fire PDOExceptions on errors.
        PDO::ATTR_EMULATE_PREPARES => false //Disable emulated prepares. Solves some minor edge cases.
    ]);

//No need for incrementer. The index of the comment should be enough.
    if (isset($_POST['submit'])) {
        //Note the prepare on the outside.
        $stmt = $conn->prepare("UPDATE `reservations` SET `comment` = :comment WHERE `tableid` = :id");
        //As well as the binding. By using bindParam, and supplying a variable, we're passing it by reference.
        //So whenever it changes, we don't need to bind again.
        $stmt->bindParam(":comment", $comment, PDO::PARAM_STR);
        $stmt->bindParam(":id", $id, PDO::PARAM_INT);

        foreach ($_POST['comment'] as $index => $comment) {

            //All that's left is to set the ID, see how we're reusing the $index of the comment input?

            $id = $_POST['tableid'][$index];

            $stmt->execute();

        }
    }
} catch (PDOException $e) {
    echo "Some sort of error has occurred! Here are the details! ";
    echo $e->getMessage();
}

【讨论】:

    【解决方案2】:
    <textarea name="comment[<?=$f1?>]" cols="25" rows="2"><?=$f2?></textarea>
    
    <?php
    $dsn = "mysql:host=xxxx;dbname=xxxxx";
    $opt = array(
        PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION,
        PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC
    );
    $conn = new PDO($dsn, $username, $password, $opt);
    
    $sql  = "UPDATE reservations SET comment=? WHERE tableid= ?";
    $stmt = $conn->prepare($sql);
    
    foreach ($_POST["comment"] as $id => $comment) {
        if ($comment) {
            $stmt->execute([$comment, $id]);
        }
    }
    

    【讨论】:

      【解决方案3】:

      如果使用 CASE 会快 2-3 倍,示例查询:

      UPDATE website
          SET http_code = CASE id_website
              WHEN 1 THEN 200
              WHEN 2 THEN 201
              WHEN 3 THEN 202
          END,
          link_exists = CASE id_website
              WHEN 1 THEN 1
              WHEN 2 THEN 2
              WHEN 3 THEN 3
          END
      WHERE id_website IN (1,2,3)
      

      我在 1000 行上对其进行了测试。

      准备:0.328 秒

      案例:0.109 秒

      【讨论】:

        猜你喜欢
        • 2017-02-03
        • 1970-01-01
        • 2018-05-16
        • 2015-10-30
        • 2023-03-26
        • 2014-12-07
        • 1970-01-01
        • 1970-01-01
        • 2011-09-26
        相关资源
        最近更新 更多