2016-06-13 2 views
0

у меня есть этот подготовленный оператор запросаКак отлаживать SQLSTATE [HY000]: Общие ошибки: 2031 в подготовленных заявлений

$stmt = $conn->prepare(" 
     UPDATE language 
     SET lang_alias=:lang_alias , lang_name=:lang_name 
     WHERE lang_id=:lang_id" 
); 

Если я установить массив, чтобы связать значения

$query_array = array (":lang_alias" => "en", ":lang_name" => "English (UK)", ":lang_id" => 1) ; 

и затем выполнить его

это не будет работать, я получаю

Notice: Array to string conversion referring to $stmt->execute(array($query_array));

и Uncaught exception 'PDOException' with message 'SQLSTATE[HY093]: Invalid parameter number' ссылки на эту же страницу.

Затем я попытался использовать bindParam связать значения

$stmt->bindParam(':lang_alias', $a); 
$stmt->bindParam(':lang_name', $c); 
$stmt->bindParam(':lang_id', $d3, PDO::PARAM_INT); 

и работает отлично

Если я пытаюсь синтаксис альтернативный bindParam

$stmt->bindParam("sssiii", $a, $b, $c, $d1, $d2, $d3);

это не работает. Дает

Warning: PDOStatement::bindParam() expects at most 5 parameters, 7 given referring to $stmt->bindParam("sssiii", $a, $b, $c, $d1, $d2, $d3);

и

Uncaught exception 'PDOException' with message 'SQLSTATE[HY000]: General error: 2031 ' referring to $stmt->execute();

1. ли ошибка вызвана тем, что по умолчанию Подготовленные заявления преобразовать в строку все значения, так что я должен определить int вручную? Вот почему bindParam отлично работает? Или это что-то еще, что мне не хватает?

2. Почему bindParam("sssiii"... sytntax не работает?

3. Я хочу, чтобы этот запрос получил свои значения динамически, поэтому использование bindParam вручную не является вариантом. Я хотел бы использовать ассоциативный массив или синтаксис bindParam("sssiii"....

Как это сделать? Спасибо

+0

@ Fred-ii- Done. По-прежнему такая же ошибка. Это была опечатка в SO, а не в моем коде. – slevin

+0

@slevin Если комментарий Криса разрешил его, возможно, предложите ему опубликовать его в качестве ответа, прежде чем кто-то еще вытащит ковер из-под ног ;-) –

+0

@ chris85 Да, именно так, спасибо, что указали это. Проблема с синтаксисом 'bindParam (« sssiii »...» по-прежнему существует. Я не вижу, что происходит. – slevin

ответ

3

$query_array уже массив, поэтому при запуске $stmt->execute(array($query_array)) вы делаете это в многомерный массив. Это:

$stmt->execute($query_array); 

должно быть все, что вам нужно.

Как bind вопрос вы не используете PDO синтаксис

Вы используете синтаксис mysqlisssiii с.

+0

Итак, подготовленные операторы вообще не имеют синтаксиса 'bindParam ($ a, $ b, $ c)' Спасибо – slevin

+1

Насколько я знаю, нет, не в PDO. PDO 'bindParam' ожидает, что 1 параметр будет связан. – chris85

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