我正在尝试使用复选框删除多个记录。我已经加载了每个复选框,其中包含记录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>
答案 0 :(得分:0)
而不是立即重定向,注释掉您的重定向功能,并允许它在完成mysql_query()
调用后留在页面上。您是否看到其中报告的任何错误(如果php.ini中为display_errors = on
)您的错误日志是否报告错误?
另外,我肯定不会是唯一一个说出来的人......在将$_GET['mContact']
传递给mysql_query
之前,你必须先验证contact_id
。这非常容易受到SQL注入攻击。您必须检查它是一个整数,或者您的记录{{1}}是什么数据类型。
此外,使用超链接从数据库中删除记录是不明智的,中间没有确认页面。此页面是否会被索引器抓取?索引器将点击删除链接并导致删除。首选方法是使用带有提交按钮的表单进行删除。
答案 1 :(得分:0)
我相信你正在处理选择要删除的标准的混合。
将用户带到删除页面的链接与代码中的复选框无关。
我相信你想要做的是
checked="checked"
<a href..>
更改为提交按钮delete.php
中,复选框位于数组$_GET['checkboxes']
中,您可以迭代现在,关于@JohnP提到的问题:
$_POST
传递所有内容,以便通过默默无闻提高安全性LIMIT 1
,这样就不会意外删除数据库中的所有行。<强>更新强>
如果您想要一个删除链接,则需要在do...while
循环中添加链接。您似乎在该循环外部有链接,并遍历每个结果并将它们全部添加到mContact
标记。作为单个长串数字,您的处理脚本无法在没有分隔符的情况下解析该信息。
答案 2 :(得分:0)
为什么不在history_contact
和note_contact
上使用contact_id
引用外键?
这样一来,如果你删除一个联系人,MySQL就会为你删除这些孩子......
(如前所述,根据SQL注入验证您的数据输入!)