Rumah > Soal Jawab > teks badan
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粉7040660872023-10-25 09:13:24
Beberapa perkara:
PDOException
pada ralat. Ini akan memudahkan penyahpepijatan. 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粉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]); } }