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 に答える