Возможный дубликат:
Как использовать подготовленный оператор pdo для предложений order by и limit?
Я использую PDO, поскольку он был рекомендован в качестве способа, когда дело доходит до соединений с базой данных PHP. Но в то же время я одержим защитой своих запросов, чтобы убедиться, что моя система максимально защищена от хакеров.
PDO и подготовленные операторы - отличный способ, но у меня есть пара проблем с ним. У меня есть настраиваемая система фильтрации, которая требует, чтобы я создавал запрос вручную. Например, это:
$query=$pdo->prepare('SELECT * FROM log WHERE username=?');
$result=$query->execute(array($_GET['username']));
Это работает, и все отлично — PDO заботится о том, чтобы переменная $_GET не навредила моему запросу.
Но что делать, когда мне нужно сбежать от других вещей? Например, если у меня есть такая ситуация, когда я хочу вернуть всего пять записей:
$query=$pdo->prepare('SELECT * FROM log WHERE username=? LIMIT 5');
$result=$query->execute(array($_GET['username']));
Это, опять же, работает. Но что, если предельные значения также поступают из $_GET? Как избежать этого?
Для этого я сначала понял, что мне нужно построить запрос вручную и использовать метод PDO::quote(), например:
$query='SELECT * FROM log WHERE username=? LIMIT '.$pdo->quote($_GET['limit']);
Но это не сработало, так как ограничитель заключался в кавычки, что прерывало запрос.
Есть ли правильный способ избежать PDO, как работает mysql_real_escape_string()? Поскольку последний никогда не заключает в кавычки результирующую переменную, но я не могу остановить это поведение с помощью quote().
Альтернативой было бы создание моего собственного эскейпера, но такой вид побеждает цель использования подготовленных операторов PDO для начала (сами подготовленные операторы всегда заключают значения в кавычки).
РЕДАКТИРОВАТЬ: я также попытался указать значение как целое число в кавычках, например:
$pdo->quote((int)$value,PDO::PARAM_INT);
Но он по-прежнему заключает его в кавычки. То же самое с intval().
Почему PDO так активно предлагается и рекомендуется к использованию, если мне приходится делать даже такие примитивные вещи, как этот кастом? Я действительно не хочу писать метод очистки для таких случаев и надеюсь, что ничего не сломается и не будет скомпрометировано.