Kemas kini berbilang baris data menggunakan gelung PDO
P粉384366923
P粉384366923 2023-10-24 09:38:58
0
2
856

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粉384366923
P粉384366923

membalas semua(2)
P粉704066087

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

        }
    }
P粉994092873
<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]);
    }
}
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan