如果这是一个重复的问题,我很抱歉,但我不知道如何解决我的问题。每当我尝试纠正错误时,我都会失败。我的代码是:
if (isset($_GET["comment"])) {$id = $_GET["comment"];}
$query = "SELECT * FROM posts WHERE id = {$id['$id']};";
$get_comment = mysqli_query($con, $query);
任何人都可以更正代码,不再显示错误,并告诉我我错了什么?
答案 0 :(得分:6)
试试这个:
$id = isset($_GET['comment']) ? $_GET['comment'] : 0;
$query = "SELECT * FROM `posts` WHERE `id` = " . intval($id);
intval
的使用将保护您免受SQL注入的影响。理想情况下,您应该学习PDO因为它非常强大,并且使预备语句更容易处理,以防止所有注入。
使用PDO的示例可能如下所示:
$id = isset($_GET['comment']) ? $_GET['comment'] : 0;
$query = $pdo->prepare("SELECT * FROM `posts` WHERE `id` = :id");
$query->execute(array("id"=>$id));
$result = $query->fetch(PDO::FETCH_ASSOC); // for a single row
// $results = $query->fetchAll(PDO::FETCH_ASSOC); // for multiple rows
var_dump($result);
答案 1 :(得分:0)
首先,你应该防止摄入。
if (isset($_GET["comment"])){
$id = (int)$_GET["comment"];
}
注意,$id
contanis int
。
$query = "SELECT * FROM posts WHERE id = {$id}";
答案 2 :(得分:0)
假设您的$id
是一个整数,并且您只想设置查询,那么您可以使用预处理语句来保护您免受MYSQL注入攻击:
if (isset($_GET["comment"])) {
$id = $_GET["comment"];
$stmt = mysqli_prepare($con, "SELECT * FROM posts WHERE id = ?");
mysqli_stmt_bind_param($stmt, 'i', $id);
mysqli_stmt_execute($stmt);
mysqli_stmt_bind_result($stmt, $get_comment);
while (mysqli_stmt_fetch($stmt)) {
// use $get_comment
}
mysqli_stmt_close($stmt);
}
这些函数中的大多数都会返回一个布尔值,指示它们是否成功,因此您可能需要检查它们的返回值。
这种方法看起来更加繁重,对于包含单个整数的语句的简单情况来说可能有点过分,但这是一个很好的做法。
您可能希望查看面向对象的mysqli样式,您可能会发现它看起来更干净一些,或者考虑使用PDO。