我有一个显示评论的页面," comments.php",我将该页面包含在我希望评论显示的任何其他页面上。我试图实现一种删除注释的方法,如果需要的话。每条评论都有一个自动增加" commentID"。现在我正在使用一个动作,然后只使用一个链接来调用动作。
当我将鼠标悬停在链接上时,网址看起来是正确的,但是当我点击它时,页面会刷新并且没有任何反应。有什么想法吗?
动作:
if ($_POST['action'] == 'delete') {
$sql = "delete from " . $db_prefix . "comments where commentID = " . (int)$_GET['id'];
mysql_query($sql) or die('error deleting user: ' . $sql);
header('Location: ' . $_SERVER['HTTP_REFERER']);
}
显示评论并显示要删除的链接:(不需要的代码已被遗漏)
echo '<a href="/comments.php?action=delete&id=' . $result['commentID'] . '">delete</a>
我做错了什么?
答案 0 :(得分:4)
在您的代码中,您将$_POST
与$_GET
混合在一起。
试试这个,
?php
if ($_GET['action'] == 'delete') {
if (!ctype_digit($_GET['id'])) {
exit("ID has to be an int.");
}
$id = intval($_GET['id']);
$sql = "DELETE FROM `" . $db_prefix . "comments` WHERE `commentID` = " . $id;
mysql_query($sql) or die('error deleting user: ' . $sql);
header('Location: ' . $_SERVER['HTTP_REFERER']);
}
?>
您的链接还会显示action=delete
,因此您应该检查$_GET
操作是否等于删除。
修改1
您的代码很容易SQL injection
,即使已弃用,您仍然使用MySQL
,您应该使用MySQLi
或PDO
准备好的语句。
更不用说您的$_GET
数据在未经过清理的情况下传递给查询,您应该开始使用intval
它会使其更好并阻止XSS
。请阅读intval
和ctype_digit
函数,以便更好地了解其功能。
修改2
报废$_SERVER['HTTP_REFERER']
编辑3
如评论中所述:
&#34;如果您为所有内容使用相同的文件,只需省略文件名?action=delete&id
&#34;
这将解释你在评论中提到的404。