我有一个可检索多行数据的表单,每个项目都有一个文本区域,供用户对特定项目发表评论。返回的项目数量是可变的,并且他们不必在任何/所有框中留下评论。
<textarea name="comment[]" cols="25" rows="2"><?php echo $f2; ?></textarea> <input name="tableid[]" type="hidden" value="<?php echo $f1; ?>">
echo 语句用当前存储在数据库中的任何内容填充文本区域,因为用户可以修改其他人输入的内容。
当它被传递到表单处理页面时,它会返回这个..
Submit: Submit comment: Test Comment 1,Test Comment 2 tableid: 590,591
所以它似乎正确地传递了数组。我正在使用此代码来更新数据库
$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++; } }
但是,这似乎根本没有更新,我哪里出错了?
非常感谢
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(); } }