2016-06-09 4 views
0

Недавно я начал изучать PDO, и я получаю проблемы, чтобы понять поведение bindValue и прямой запуск с массивом.Неисправность PDO bindValue и выполнение

$statement = $db->prepare('SELECT * FROM category WHERE `category_name`=?'); 
$statement->bindValue(1, 'Swimwear'); // It's okey 
$statement->execute(); 

//direct execute with array 
$statement->execute(array('Swimwear')); // It's also okey 

Но настоящая проблема заключается в том, почему мне не нужно использовать как?

$statement->execute(array(1 => 'Swimwear')); // It's not okey, Not working 

ответ

0

С PDO у вас есть три способа добавления значений заполнителя.

Вы можете добавить их в корзину отдельно, с bindValue.

Вы можете добавить их в простой массив.

Вы можете добавить их в ассоциативный массив , если вы назвали их.

Таким образом, чтобы этот стиль работы вам нужно добавить имя в подготовленное заявление, а также массив передается execute:

$statement = $db->prepare('SELECT * FROM category WHERE `category_name`=:category'); 
$statement->execute(array(':category' => 'Swimwear')); 

Там нет заполнителя имени 1 так что это не работает.

Функция bindValue() выполняет 1-индексированные значения, поэтому работает вызов bindValue(1, 'Swimwear'). Это исключение из обычного 0-индексированного правила программирования.

Чтобы заставить его работать с ассоциативным стилем вы должны назвать это таким образом:

$statement->execute(array(0 => 'Swimwear')); 
+0

Я использую ** 'category_name' =? ** не названный. –

+0

Это неидентифицированные имена, поэтому для их заполнения следует использовать простой массив. Я нахожу, что названные заполнители намного сложнее испортить, вы не ошибетесь, измените порядок некоторых значений, что может быть очень легко сделать, если у вас есть дюжина столбцов для заполнения. – tadman

+0

Но BindValue отлично работает с неименованными: '$ statement-> bindValue (1, 'Swimwear');' –

2

$statement->execute(array(1 => 'Swimwear')); не работает, потому что значение должно быть в индексе 0, а не 1. При использовании этого синтаксиса , правильный код будет:

$statement->execute(array(0 => 'Swimwear')); 

Хотя я не вижу никакого смысла, используя такой сложный синтаксис над array('Swimwear').

+0

Вы правы, но я не знаю об этом различии, что BindValue начинает индексирование с 1, я теперь о массиве, который начинается с 0. –

+0

Рад видеть вас снова, давая правильные ответы, как обычно. –

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