Неперехваченное исключение PDOException: SQLSTATE[HY093]: недопустимый номер параметра: количество связанных переменных не соответствует количеству токенов

#php #mysql #arrays #pdo

#php #mysql #массивов #pdo

Вопрос:

Я пытаюсь использовать подготовленный массив в запросе PDO.

У меня есть следующий код :

 $wordAr = array([0] => ':1' => 'anglais,' [1] => ':2' => 'espagnol'); #Built dynamically in reality
$createTable = "SELECT * FROM candidates WHERE ";
$createTable .= "CandId IN (SELECT CandId FROM etiquettes WHERE speak = :1)";
$createTable .= "AND CandId IN (SELECT CandId FROM etiquettes WHERE speak = :2)";
$stmt = $dbConn->prepare($createTable);
$stmt->execute(array($wordsAr));
$result = $stmt-fetchall();
  

Это выдает мне следующую ошибку :
Uncaught PDOException: SQLSTATE[HY093] … (совпадает с заголовком)
Обычно я бы выполнил свой запрос следующим образом :

 $stmt->execute(array(
':1' => 'anglais',
':2' => 'espagnol'));
  

но на этот раз массив создается динамически. (Я привел это в этом примере, как это показано с помощью print_r.

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

Моей целью было бы, чтобы $ wordAr интерпретировался как запрос, приведенный чуть выше. Я надеюсь, что мое объяснение было достаточно ясным. Поскольку я все еще новичок, иногда я неправильно выражаю свои потребности.

Заранее большое спасибо за любую помощь, я каждый день учусь с этим.

Комментарии:

1. $wordAr = [':1' => 'anglais', ':2' => 'espagnol']; и $stmt->execute($wordAr);

2. Покажите ваш код для построения массива, поскольку ваша проблема заключается в этой части. Вы не можете создать массив на основе того, что отображает функция print_r.

Ответ №1:

Попробуйте следующее:

 $wordAr = array(':1' => 'anglais,' ':2' => 'espagnol');
  

И затем, когда вы выполняете, выполняйте только $stmt-> execute($ wordAr);

Ответ №2:

Вы не можете привязать параметры pdo, подобные. Вам нужно привязать каждый параметр отдельно.

 $wordAr = array([0] => ':1' => 'anglais,' [1] => ':2' => 'espagnol'); #Built dynamically in reality
$createTable = "SELECT * FROM candidates WHERE ";
$createTable .= "CandId IN (SELECT CandId FROM etiquettes WHERE speak = :1)";
$createTable .= "AND CandId IN (SELECT CandId FROM etiquettes WHERE speak = :2)";
$stmt = $dbConn->prepare($createTable);
//loop and bind each param
foreach ($wordAr as $key => amp;$val) {
    $stmt->bindParam($key, $val);
}
$stmt->execute();
$result = $stmt-fetchall();
  

Комментарии:

1. Привет, привязка нескольких параметров одновременно с использованием array работает, я делаю это регулярно следующим образом: $stmt-> execute(array( ‘: 1’ => ‘anglais’, ‘: 2’ => ‘espagnol’)); К сожалению, мне не удалось создать динамический полезный массив. Но ваша идея использовать цикл с bindparam была хорошей. Спасибо!