我有一个表单,用于检索多行数据,每个项目都有一个textarea,供用户对特定项目进行评论。返回的项目数是可变的,他们不必在任何/所有框中留下评论。
<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++;
}
}
但是,这似乎根本没有更新,我哪里错了?
非常感谢
答案 0 :(得分:7)
少数事情:
PDOException
s。它会使调试变得更容易。代码:
//New try/catch block to catch PDOExceptions should they arise.
try {
$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();
}
}
} catch (PDOException $e) {
echo "Some sort of error has occurred! Here are the details! ";
echo $e->getMessage();
}
答案 1 :(得分:1)
<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(array($comment, $id);
}
答案 2 :(得分:1)
如果您使用CASE,示例查询将会快2-3倍:
UPDATE website
SET http_code = CASE id_website
WHEN 1 THEN 200
WHEN 2 THEN 201
WHEN 3 THEN 202
END,
link_exists = CASE id_website
WHEN 1 THEN 1
WHEN 2 THEN 2
WHEN 3 THEN 3
END
WHERE id_website IN (1,2,3)
我在1000行测试了它。
准备:0.328秒
案例:0.109秒