2015-04-10 2 views
3

Краткая версия (без попытки-х и уловов):Подготовленный оператор не возвращает ни одной строки

$dbConnection = new PDO("mysql:host=$serverName;dbname=$dbName", $userName, $password, $dbOptions); 
$dbStatement = $dbConnection->prepare('SELECT * FROM bin_content WHERE LotId=":lot";'); 
dbStatement->bindParam(':' . $key, $filter->$key); 
// $filter->lot contains "A32" and $key="lot", 
// so I'm assuming "A32" will be filled into the statement 
$dbStatement->execute(); // this is actually in a try/catch, and no exceptions are caught here 
$row = $dbStatement->fetch(); // this returns false 

Как упоминалось в приведенном выше коде, то fetch() возвращает false, но если я вручную запросить мою базу данных со следующим утверждением SQL, строка возвращается:

SELECT * FROM bin_content WHERE LotId="A32"; 

Я связывание свойства $filter объекта, поскольку запросы являются динамическими в зависимости от свойств $filter. Возможно ли, что я как-то не привязываю то, что, по-моему, привязываю?

+6

уронить кавычки '«: много»' –

+4

У вас есть двойные кавычки для некоторых нечетная причина и ';' внутри вашей подготовки. Тебе не нужны. –

+0

@ N.B. и Шон, причина на самом деле не такая странная ... Это моя первая попытка подготовленных заявлений. Ошибка Noob. :) –

ответ

2

При использовании подготовленных инструкций не указывайте, что вы хотели бы «безопасно ввести» в инструкцию.

Если вы запрашиваете этот

"SELECT * FROM table WHERE user = 'some-user'" 

Он буквально ищет пользователь с этим именем, поэтому он буквально ищет пользователь «: много» при запросе к базе данных.

Вместо этого используйте

"SELECT * FROM table WHERE user = :user_name" 

bindParam->(':user_name', $var); 

->execute(); 

Теперь будет безопасно вводить $ вар в подготовленное заявление, то вы можете выполнить его

Смежные вопросы