cari

Rumah  >  Soal Jawab  >  teks badan

Kemas kini berbilang baris data menggunakan gelung PDO

Saya mempunyai borang yang mendapatkan semula berbilang baris data, setiap item mempunyai kawasan teks untuk pengguna mengulas pada item tertentu. Bilangan item yang dikembalikan adalah berubah-ubah, dan mereka tidak perlu meninggalkan komen dalam mana-mana/semua kotak.

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

echo mengisi kawasan teks dengan apa sahaja yang disimpan dalam pangkalan data pada masa ini, kerana pengguna boleh mengubah suai perkara yang telah dimasukkan oleh orang lain.

Apabila ia dihantar ke halaman pemprosesan borang, ia akan mengembalikannya..

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

Jadi ia seolah-olah menghantar tatasusunan dengan betul. Saya menggunakan kod ini untuk mengemas kini pangkalan data

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

Namun, ini nampaknya tidak dikemas kini langsung, di manakah silap saya?

Terima kasih banyak-banyak

P粉384366923P粉384366923417 hari yang lalu832

membalas semua(2)saya akan balas

  • P粉704066087

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

    Beberapa perkara:

    1. Tetapkan PDO untuk membuang PDOException pada ralat. Ini akan memudahkan penyahpepijatan.
    2. Maksud pernyataan yang disediakan ialah anda boleh memanggilnya beberapa kali dengan pembolehubah yang berbeza, dengan cara ini, anda hanya perlu menyediakannya sekali dan kemudian memanggilnya beberapa kali. Anda juga boleh mendapatkan peningkatan prestasi yang bagus daripadanya.

    Kod:

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

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

    balas
    0
  • Batalbalas