使用链接

时间:2015-08-14 01:32:53

标签: php sql

我有一个显示评论的页面," 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> 

我做错了什么?

1 个答案:

答案 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,您应该使用MySQLiPDO准备好的语句。

更不用说您的$_GET数据在未经过清理的情况下传递给查询,您应该开始使用intval它会使其更好并阻止XSS。请阅读intvalctype_digit函数,以便更好地了解其功能。

修改2

报废$_SERVER['HTTP_REFERER']

How reliable is HTTP_REFERER?

编辑3

如评论中所述:

&#34;如果您为所有内容使用相同的文件,只需省略文件名?action=delete&id&#34;

这将解释你在评论中提到的404。