【问题标题】:Checkbox Deleting - If statement inside For loop deletes wrong entries复选框删除 - For 循环中的 If 语句删除错误的条目
【发布时间】:2012-04-19 15:29:40
【问题描述】:

我有一个显示我的数据库信息的页面。通过每个循环,打印一个复选框,如果选中并提交,则删除相关条目。复选框名称为“delete[]”,其中包含行 ID 的隐藏值被命名为“id[]”。

这是我的表单的相关部分:

<tr><td valign='top'>
<label class='amarillo med' style='color:#C00;'>Delete Section </label>
<input type='checkbox' name='delete[]' />
<input type='hidden' name='id[]' value='" . $row['about_id'] . "' />
</td></tr>

这是我的 php 和查询

$deleteCount = count($_POST['delete']);
for ($x = 0; $x < $deleteCount; $x++) {
if(isset($_POST['delete'][$x])) {
   $sql = 'DELETE FROM about WHERE about_id = \''.$_POST['id'][$x].'\'';
 $result = mysql_query($sql);
}
}

这就是发生的事情。

如果返回三行并且我只想删除第三行,我选中第三个框并单击提交。这将删除返回的第一行。同样,如果返回三行,我想删除第一和第三行,我提交并删除前两行。

看起来正在发生的是对于每个选中的复选框,从第一行开始删除许多行。任何建议将不胜感激。

【问题讨论】:

  • 也包括您的表单。适用的一切。
  • 问题出在id[] 返回的内容中......包括您如何为id 产生价值
  • 我已更新以包含我的表单的相关部分。

标签: php sql arrays if-statement for-loop


【解决方案1】:

最好和更简单的方法是使用

<input type="checkbox" name="delete[]" value="<?=$row['about_id']?>"/>

然后

foreach($_REQUEST['delete'] as $delID)
{
   ...
}

【讨论】:

  • 作为基本的安全措施,修改数据时使用$_POST而不是$_GET或$_REQUEST;它使 CSRF 攻击更加困难。见en.wikipedia.org/wiki/Cross-site_request_forgery
  • 我不建议从字面上解释任何建议。使用 $_GET 或 $_POST 甚至 $_REQUEST 必须基于应用程序的要求。应该以其他方式解决 CSRF 问题。这只是一个例子。
  • HTTP 规范建议不要使用 GET 来修改数据 (en.wikipedia.org/wiki/…),因此除了使任何 CSRF 漏洞更难被利用之外,这是一种很好的做法。你说得对,这还不够,但它大大增加了利用的难度。
  • 我可以将它与 $_POST 与 $_REQUEST 一起使用,并且它看起来就像一个魅力。非常感谢!感谢您的帮助。
【解决方案2】:

使用以下代码

<tr><td valign='top'>
<label class='amarillo med' style='color:#C00;'>Delete Section </label>
<input type='checkbox' name='delete[$row['id']]' />
<input type='hidden' name='id[$row['id']]' value='" . $row['about_id'] . "' />
</td></tr>

其中 $row['id'] 是行的 id

【讨论】:

  • 如果我这样做了,我将如何构建我的循环?
猜你喜欢
  • 2021-11-26
  • 2018-04-20
  • 2017-11-01
  • 2013-09-26
  • 2020-03-18
  • 1970-01-01
  • 2019-07-10
  • 2019-01-07
  • 1970-01-01
相关资源
最近更新 更多