使用PHP从超链接中删除多个MySQL记录

时间:2011-03-15 17:29:51

标签: php mysql html

我正在尝试使用复选框删除多个记录。我已经加载了每个复选框,其中包含记录ID:

<?php $row_count = 1; do {  ?>
    <tr <?php if ($row_count%2) { ?>bgcolor="#F4F4F4"<?php } ?>>
      <td align="center" ><input name="checkbox[]" type="checkbox" id="checkbox[]" value="<?php echo $row_contactlist['contact_id']; ?>"></td>
      <td align="center" ><p><?php echo $row_contactlist['contact_id'];?></p></td>
    </tr>
    <?php $row_count++; } while ($row_contactlist = mysql_fetch_assoc($contactlist)); ?>

我正在使用以下链接运行删除:

<a class="addcontact" href="delete.php?mContact=<?php for($i=0;$i<=$row_count;$i++) { $del_id = $checkbox[$i]; } echo $del_id ?>" style="border-bottom:0px" >Delete Contact(s)</a>  

运行delete.php

if (isset($_GET['mContact'])) {
mysql_query("DELETE FROM contacts WHERE contact_id = ".$_GET['mContact']."");
mysql_query("DELETE FROM history WHERE history_contact = ".$_GET['mContact']."");
mysql_query("DELETE FROM notes WHERE note_contact = ".$_GET['mContact']."");
redirect('You have deleted some contacts',"contacts.php");
}

重定向工作,即联系人页面重新加载“你删除了一些联系人”,看起来我没有错误,但没有任何联系人被删除。

更新 谢谢你们非常迅速的回应。总共知道PHP,所以一切都非常受欢迎。

所以我会使用一个sumbit按钮而不是一个超链接:

<td colspan="5" align="center" bgcolor="#FFFFFF"><input name="delete" type="submit" id="delete" value="Delete"></td>

3 个答案:

答案 0 :(得分:0)

而不是立即重定向,注释掉您的重定向功能,并允许它在完成mysql_query()调用后留在页面上。您是否看到其中报告的任何错误(如果php.ini中为display_errors = on)您的错误日志是否报告错误?

另外,我肯定不会是唯一一个说出来的人......在将$_GET['mContact']传递给mysql_query之前,你必须先验证contact_id。这非常容易受到SQL注入攻击。您必须检查它是一个整数,或者您的记录{{1}}是什么数据类型。

此外,使用超链接从数据库中删除记录是不明智的,中间没有确认页面。此页面是否会被索引器抓取?索引器将点击删除链接并导致删除。首选方法是使用带有提交按钮的表单进行删除。

答案 1 :(得分:0)

我相信你正在处理选择要删除的标准的混合。

将用户带到删除页面的链接与代码中的复选框无关。

我相信你想要做的是

  1. 创建复选框(如果您希望默认删除某些内容,请设置checked="checked"
  2. <a href..>更改为提交按钮
  3. delete.php中,复选框位于数组$_GET['checkboxes']中,您可以迭代
  4. 现在,关于@JohnP提到的问题:

    1. 这是非常不安全的方法,除非您在发布此处之前删除了所有验证码。
    2. 我建议通过$_POST传递所有内容,以便通过默默无闻提高安全性
    3. 检查用户是否具有删除他们试图删除的行的权限。
    4. 在每个删除(或更新)查询上设置LIMIT 1,这样就不会意外删除数据库中的所有行。
    5. <强>更新

      如果您想要一个删除链接,则需要在do...while循环中添加链接。您似乎在该循环外部有链接,并遍历每个结果并将它们全部添加到mContact标记。作为单个长串数字,您的处理脚本无法在没有分隔符的情况下解析该信息。

答案 2 :(得分:0)

为什么不在history_contactnote_contact上使用contact_id引用外键?

这样一来,如果你删除一个联系人,MySQL就会为你删除这些孩子......

(如前所述,根据SQL注入验证您的数据输入!)