0

LIKEPDO エミュレートを false に設定すると、クエリでワイルドカードを使用すると、SQL インジェクションのセキュリティのために何度も実行する必要があることを読んだため、何も出力されません。

これは設定です:

$db->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);

これは失敗しているクエリです:

$query = $db->prepare("SELECT * FROM video WHERE name like :search and removed='0' and verified='1' or subgenre like :search and removed='0' and verified='1' LIMIT :lb, :lt");
$query->bindValue(':search', '%'.$search.'%', PDO::PARAM_STR);
$query->bindValue(':lb', $limitbottom, PDO::PARAM_INT);
$query->bindValue(':lt', $limittop, PDO::PARAM_INT);
$query->execute();
$array = $query->fetchAll(PDO::FETCH_ASSOC);

エミュレート設定を削除すると、クエリは期待どおりに実行され、配列が返されます。すべてを正しく理解していれば、SQL インジェクションを防ぐために、スクリプトで emulate を false に設定する必要があります。これを修正するにはどうすればよいですか? likeワイルドカードとエミュレーションをオフにしてクエリを実行することは可能ですか?

PHP は 5.4.10 で、MySQL は 5.1.66 です。

4

1 に答える 1

2

問題は、パラメーター:searchが 2 回使用されていることであり、これはエミュレーション オフではサポートされません。

これは問題を解決します:

$query = $db->prepare("SELECT * FROM video WHERE name like :search1 and removed='0' and     verified='1' or subgenre like :search2 and removed='0' and verified='1' LIMIT :lb, :lt");
$query->bindValue(':search1', '%'.$search.'%', PDO::PARAM_STR);
$query->bindValue(':search2', '%'.$search.'%', PDO::PARAM_STR);
$query->bindValue(':lb', $limitbottom, PDO::PARAM_INT);
$query->bindValue(':lt', $limittop, PDO::PARAM_INT);
$query->execute();
$array = $query->fetchAll(PDO::FETCH_ASSOC);

これで、クエリは期待どおりに配列を返します。

于 2013-01-11T14:22:21.683 に答える