Я получаю массив, чтобы преобразовать ошибку преобразования, когда я пытаюсь запустить выполнение PDO. Исполнение должно вводить одно, являющееся нормальной строкой, а другое – массивом. Вот мой код:
$id = "1"; $array = array("a", "b", "c"); $in = str_repeat('?,', count($array) - 1) . '?'; $sql1 = "SELECT * FROM tbl1 AS tb1 RIGHT JOIN tbl2 AS tb2 ON (tb1.e_id = tb2.e_id)LEFT JOIN tbl3 AS tb3 ON (tb2.m_id = tb3.m_id) WHERE tb1.u_id = ? AND tb1.letters IN ($in)"; $statement1 = $db_handle->prepare($sql1); $statement1->setFetchMode(PDO::FETCH_ASSOC); $statement1->execute(array($id,$array)); $res = $statement1->fetchAll();
Таким образом, строка выполнения дает мне ошибку преобразования строки. Я напечатал свой массив и вопросительные знаки, и они выдают отлично. Заявление sql также прекрасно, я пробовал его на phpMyAdmin, и он работает просто отлично, поэтому я не использую выполнение правильно, но я не уверен, как изменить способ его выполнения.
Может кто-нибудь объяснить это мне?
execute()
ожидает единственный массив. Из документации:
Выполните подготовленное заявление. Если подготовленное заявление содержит маркеры параметров, вы должны либо:
- (Надрез)
- передать массив значений параметров только для ввода
С array($id,$array)
вы должны передать многомерный массив, который выглядит так:
Array ( [0] => 1 [1] => Array ( [0] => a [1] => b [2] => c ) )
Это, конечно, не то, что он ожидает. Он нуждается в одномерном массиве, содержащем значения, которые нужно вставить.
Чтобы исправить эту проблему, вам необходимо изменить формат массива. Добавьте идентификатор в начало массива, например:
$array = array(1, "a", "b", "c");
Если переменная ID генерируется динамически, вы можете вручную добавить ее в начало массива с помощью функции array_unshift()
:
$id = "1"; $array = array("a", "b", "c"); $array = array_unshift($array, $id);
… и затем изменить вызов execute()
следующим образом:
$statement1->execute($array);
->execute()
ожидает, что вы отправите ему массив с каждым элементом, представляющим каждый ?
в запросе.
Вы отправляете только два элемента, так что он попытается использовать весь массив как второй ?
, поэтому он пытается преобразовать его в строку. И тогда он, вероятно, будет жаловаться на отсутствие достаточных параметров.
Попробуйте вот так:
$dataArray = $array; array_unshift($dataArray, $id); $statement1->execute($dataArray);