Heim > Fragen und Antworten > Hauptteil
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粉7040660872023-10-25 09:13:24
几件事:
PDOException
。这将使调试变得更加容易。代码:
$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]); } }