0

我有一个这样的查询:

$query="select * from news where news_id = (select max(news_id) from news where news_id< $id)";

执行我使用类。在这个班级

public function query($query) 
{
  $this->_query = filter_var($query, FILTER_SANITIZE_STRING);
  $stmt = $this->_prepareQuery();
  $stmt->execute();
  $results = $this->_dynamicBindResults($stmt);
  return $results;
}

有什么方法<可以不过滤信号吗?

4

1 回答 1

3

不幸的是,整个想法是错误的。FILTER_SANITIZE_STRING一点帮助都没有。更不用说它只是破坏你的SQL。

为了保护 SQL 免受注入,您必须使用准备好的语句。因此,不要直接向查询添加变量,而是添加问号。然后像这样把这个变量放入执行中

public function query($query, $params) 
{
    $stmt = $this->mysqli->prepare();
    $types = $types ?: str_repeat("s", count($params));
    $stmt->bind_param($types, ...$params);
    $stmt->execute();
    return $stmt->get_result();
}

然后就这样使用它

$query="select * from news where news_id = (select max(news_id) from news where news_id<?)";
$data = $db->query($query, [$id])->fetch_all(MYSQLI_ASSOC)
于 2013-01-06T00:48:20.017 回答