用于更新多行的PDO循环

时间:2013-07-26 16:16:16

标签: php mysql pdo

我有一个表单,用于检索多行数据,每个项目都有一个textarea,供用户对特定项目进行评论。返回的项目数是可变的,他们不必在任何/所有框中留下评论。

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

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

当它传递给表单处理页面时,它会返回此..

    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++;
    }
}

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

非常感谢

3 个答案:

答案 0 :(得分:7)

少数事情:

  1. 设置PDO以在错误上抛出PDOException s。它会使调试变得更容易。
  2. 预备语句的要点是你可以使用不同的变量多次调用它,这样,你只需要准备一次,并多次调用它。你也可以获得很好的性能提升。
  3. 代码:

    //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();
    }
    

答案 1 :(得分:1)

<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(array($comment, $id);
}

答案 2 :(得分:1)

如果您使用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秒