Heim  >  Fragen und Antworten  >  Hauptteil

Aktualisieren Sie mehrere Datenzeilen mithilfe der PDO-Schleife

Ich habe ein Formular, das mehrere Datenzeilen abruft. Jedes Element verfügt über einen Textbereich, in dem Benutzer einen Kommentar zu einem bestimmten Element abgeben können. Die Anzahl der zurückgegebenen Elemente ist variabel und es ist nicht erforderlich, in einem oder allen Feldern Kommentare zu hinterlassen.

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

echo-Anweisung füllt den Textbereich mit allem, was derzeit in der Datenbank gespeichert ist, da der Benutzer ändern kann, was andere eingegeben haben.

Wenn es an die Formularverarbeitungsseite übergeben wird, wird dies zurückgegeben..

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

Es scheint also, dass das Array korrekt übergeben wird. Ich verwende diesen Code, um die Datenbank zu aktualisieren

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

Allerdings scheint dies überhaupt nicht aktualisiert zu sein. Was habe ich falsch gemacht?

Vielen Dank

P粉384366923P粉384366923382 Tage vor790

Antworte allen(2)Ich werde antworten

  • P粉704066087

    P粉7040660872023-10-25 09:13:24

    几件事:

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

    代码:

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

    Antwort
    0
  • P粉994092873

    P粉9940928732023-10-25 00:17:28

    <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]);
        }
    }

    Antwort
    0
  • StornierenAntwort