【问题标题】:Delete multiple rows with PDO and checkboxes using prepared statements?使用准备好的语句删除带有 PDO 和复选框的多行?
【发布时间】:2015-07-04 21:59:12
【问题描述】:

我有这个代码,

$q = $dbc -> prepare ("SELECT * FROM tasks ORDER BY date_time LIMIT 0, 15");
$q -> execute();

echo '<form action="/adminpanel?tab=process" method="post">
          <input type="hidden" name="deletetask" />';

while ($todo = $q -> fetch(PDO::FETCH_ASSOC)) {

  echo '<div id="update"><div><strong>' 
           . $todo['date_time'] . '</strong><span>' . $todo['type'] 
           . '</span></div><p>' . $todo['message'] 
           . '</p><input class="checkbox" name="deletetask" value="' 
           . $todo['date_time'] . '" type="checkbox" /></div>';
}

echo '<input type="submit" value="Delete Tasks" /></form>';

除了一件事之外,现在一切都按预期工作,我还没有在互联网上真正找到任何答案。我的 while 循环总是有不止一行,并且几乎总是希望从中删除不止一个。

就这个脚本而言,表单确实可以工作但它只会删除最后一个被点击的复选框。我理解它为什么这样做,但我不明白如何克服这个问题我正在使用 PDO 和准备好的语句。

【问题讨论】:

  • 我没有看到任何用于删除行的代码。
  • 代码是("DELETE FROM table WHERE id = ?");
  • 代码应该是DELETE FROM table WHERE id IN(?,?,?...?)
  • 好吧 - 改变它!调试它,重写它,分解它。你是程序员还是什么?
  • @xdazz 我没有复制和粘贴它,我什至没有尝试过,我知道它不起作用,因为我的表单值显示在 while 循环中,使名称相同,所以在 php 中,$_POST 变量会被新值覆盖。

标签: php mysql pdo


【解决方案1】:

您为每个复选框分配了相同的name="deletetask"。因此,当您提交表单时,您只会收到最后选择的 deletetask 值。所以,你的错误就在这里

<input class="checkbox" name="deletetask" value=

应该是

<input class="checkbox" name="deletetask[]" value=

因此,您需要将 deletetask 重命名为 deletetask[],以便您的复选框以数组的形式发送,而不是执行类似的操作

$todelete = $_POST['deletetask']; 
//or $_GET, if you are submitting form through get. But I would recommend you using POST
$stmt = $pdo->prepare("DELETE FROM table WHERE id = ?");
foreach ($todelete as $id)
    $stmt->execute($id);

【讨论】:

  • 谢谢你现在试试这个:)终于有人理解我的评论了。
【解决方案2】:

这是从数据库中进行多次删除的简单方法:

HTML

<input type="checkbox" name="del[]" value="your id">
<input type="checkbox" name="del[]" value="your id">
<input type="checkbox" name="del[]" value="your id">
<input type="checkbox" name="del[]" value="your id">

PHP

$ids = array();
foreach ($_POST['del'] as $pval) {
  $ids[] = (int)$pval;
}
$ids = implode(',',$ids);
$query = $db->prepare("DELETE FROM `pages` WHERE `pages_id` IN ( $ids )");
$query->execute();

【讨论】:

    猜你喜欢
    • 2020-01-07
    • 1970-01-01
    • 1970-01-01
    • 2014-10-20
    • 1970-01-01
    • 2013-10-26
    • 1970-01-01
    • 2012-02-16
    相关资源
    最近更新 更多