2014-02-07 4 views
0

Этот вопрос был задан before .I имеют следующие запросыPDO цитирование целых чисел в запросе. Что мне теперь делать?

$start=150; 
$sql='select * from articles where category=? limit ?,5'; 
$query=$con->prepare($sql) 
$query->execute(array($_GET['category'],$start)); 

и я получаю сообщение об ошибке (из-за приведением 150):

У Вас есть ошибка в вашем SQL синтаксиса; проверить инструкцию, которая соответствует вашей версии сервера MySQL для правого синтаксиса использовать вблизи «» 150' , 5' в строке 1.

Это было сообщено как об ошибке, а затем закрыта, как bogus.What Должен ли я теперь делать? Есть ли способ обхода?

EDIT

Почему я не столкнулся с такой же вопрос, когда у меня есть запрос, как

$sql='select * from articles where id=?'; 
$query=$con->prepare($sql); 
$query->execute(array($id)); 
+0

@MichaelBerkowski: Пожалуйста, смотрите EDIT –

+1

Это не является проблемой при связывании 'ид =', потому что MySQL не заботится, если это котируется?. Решение использовать его в 'LIMIT', как указано в ответе ниже и в связанном вопросе, заключается в явном' bindParam() ', чтобы заставить« PDO :: PARAM_INT »вместо передачи массива' execute() ', который будет отправьте строки (и укажите их) –

+0

@MichaelBerkowski: и почему это так особенное.Разве поведение не должно быть одинаковым в каждом случае. Кавычки, приемлемые в случае столбцов первичного ключа, вместо имени «id», возможно, были «user_id», и он по-прежнему работает с кавычками вокруг целого числа? –

ответ

4

Как PDOStatement::execute документация говорит, «Все значения обрабатываются как PDO :: PARAM_STR «. Вы должны указать типы данных, используя bindValue или bindParam:

$query->bindValue(1, (int) $_GET['category'], PDO::PARAM_INT); 
$query->bindValue(2, $start, PDO::PARAM_INT); 
$query->execute(); 
+0

@Pitor: Если я не ошибаюсь, это означает, что если у меня есть только строки, то не беспокойтесь, я могу напрямую использовать '$ query-> execute (array (string1, string2, string3, string4))'. Единственная забота должна быть сделана, когда у меня есть строки, и поэтому используйте привязку, указывающую их тип –

0

Первое решение:
Как указано в этом ответе https://stackoverflow.com/a/10014200/1311025

  • Отключить эмулировать подготовляет (драйвер MySQL имеет ошибка/функция, которая заставит его процитировать числовые аргументы):

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

  • Использование индивидуального связывания PARAMS с числом литья вариант:

$comments->bindParam(1, $post, PDO::PARAM_STR);
$comments->bindParam(2, (int)$min, PDO::PARAM_INT);
$comments->bindParam(3, (int)$min, PDO::PARAM_INT);


Другое решение:
Поскольку он всегда будет целым числом, вы можете избежать дополнительных проблем с привязкой к переменной PDO и использовать intval для получения целочисленного представления переменной $start, тем самым добавляя ту же проверку безопасности, которая добавляется с помощью переменная привязка.

$start=150; 
$integerStart = intval($start); 
$sql='SELECT * FROM articles WHERE category=? LIMIT '.$integerStart.', 5'; 
$query=$con->prepare($sql) 
$query->execute(array($_GET['category'])); 
Смежные вопросы