2012-03-05 4 views
2

Я использую следующий код php pdo для вставки данных в базу данных mysql, вставка выполнена успешно, однако обновленная база данных показывает строковые литералы: a ',': b 'как значения в соответствующем поле. что не так?php pdo параметр привязки не работает

 
$data = array(
    array('a' => 'John', 'b' => 'OK'), 

); 
    $st=$dbh->prepare("insert into mytable (a, b) values(':a', ':b')"); 
    $st->execute($data) or print_r($st->errorInfo()); 

ответ

2

Удалите цитаты из ваших заполнителей. В противном случае они рассматриваются как строковые литералы и непосредственно вставляются.

$st=$dbh->prepare("insert into mytable (a, b) values(:a, :b)"); 

И удалить вложение в массиве:

// $data is an associative array, it should not contain another array! 
$data = array('a' => 'John', 'b' => 'OK'); 

Чтобы быть последовательным, я предпочитаю использовать : на клавишах заполнителя массива:

$data = array(':a' => 'John', ':b' => 'OK');  
+0

. Теперь я получаю $ st-> errorInfo(), показывая без подробной ошибки. msg: Array ( [0] => HY093 [1] => [2] => ) – user121196

+0

@ user121196 Я вижу это сейчас - у вас есть вложенный массив '$ data', когда он должен быть единственным массивом. См. Дополнение выше. –

+0

Я поставил почти 12 часов на попытку решить эту ошибку. Спасибо, @MichaelBerkowski! – IIllIIll

1

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

$data = array(':a' => 'John', ':b' => 'OK'); 

Запрос также не нуждается в кавычках, так как PDO уже знает, что это параметр

$st=$dbh->prepare("insert into mytable (a, b) values(:a, :b)"); 
$st->execute($data) or print_r($st->errorInfo()); 
+1

Я считаю, что на самом деле работает с или с ':', даже если он не документирован. –

+0

@ Разработчик: я пытался с:, это не имело значения. Фактически я использовал $ st-> bindParam («: a», «test»), это не имело никакого значения ... – user121196

+0

You может быть правильным, я просто всегда включаю его в соответствие – Developer

0

Вы исполняющие подготовлены с именованными заполнителями. Таким образом, вам нужно удалить кавычки из ваших заполнителей, иначе они будут рассматриваться как значения для соответствующих столбцов и будут автоматически обновляться.

Чтобы быть последовательным, я предпочитаю использовать: на клавишах заполнителем массива:

$data = array(':a' => 'John', ':b' => 'OK'); 

$st=$dbh->prepare("insert into mytable (a, b) values(:a, :b)"); 

Вы можете также выполнить подготовленное заявление с вопросительным знаком заполнителей:

$data = array(
    array('John','OK'), 

); 
$st=$dbh->prepare("insert into mytable (a, b) values(?, ?)"); 
$st->execute($data) or print_r($st->errorInfo()); 
Смежные вопросы