#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 была хорошей. Спасибо!