如何解决php中的非法字符串偏移[' id']?

时间:2014-07-31 13:38:27

标签: php mysql

如果这是一个重复的问题,我很抱歉,但我不知道如何解决我的问题。每当我尝试纠正错误时,我都会失败。我的代码是:

if (isset($_GET["comment"])) {$id = $_GET["comment"];}
$query = "SELECT * FROM posts WHERE id = {$id['$id']};";        
$get_comment = mysqli_query($con, $query);

任何人都可以更正代码,不再显示错误,并告诉我我错了什么?

3 个答案:

答案 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。