У меня есть подготовленный оператор PDO, в котором связанные переменные подготавливаются динамически (они могут варьироваться от вызова к вызову) в функции расширенного поиска на нашем сайте.
Я знаю, что фактический вызов SQL правильный, но по какой-то причине я получаю следующую ошибку при попытке передать мою строковую переменную в подготовленный оператор:
SQLSTATE [HY093]:Неверный номер параметра: количество связанных переменных не соответствует количеству токенов
У меня была эта ошибка раньше, и я хорошо знаком с шагами нормального разрешения.Однако мои обстоятельства довольно странные.С помощью следующего примера кода:
$columns = "FirstName, LastName, ID, City, State";
$sWhere = "WHERE (FirstName LIKE ? AND LastName
LIKE ? AND ID LIKE ? AND City
LIKE ? AND State LIKE ?)";
$sVal = "'tom', 'lastname', '12345', 'Diego', 'CA'";
$sql = "SELECT ".$columns." FROM table ".$sWhere;
$stmt = $db->prepare($sql);
$stmt->execute(array($sVal));
, где $sVal
может варьироваться от «имя», «фамилия» .... до более чем 12 переменных.Изменение количества переменных приводит к тому же результату.Полный оператор:
SELECT FirstName, LastName, ID, City, State
FROM table
WHERE (FirstName LIKE ? AND LastName
LIKE ? AND ID LIKE ? AND City
LIKE ? AND State LIKE ?)
Когда я выполняю свой запрос как есть, возвращается ошибка, указанная выше.Когда я подумал, что на самом деле у меня неверное количество переменных, я запустил ECHO в своем выражении $ value и обнаружил, что они совпадают.
В качестве дополнительного теста я взял вывод из эха $ value и напрямую подключил его к массиву execute:
$stmt->execute(array('tom', 'lastname', '12345', 'Diego', 'CA'));
Это работает с любой проблемой вообще.
Это не влияет на мой вопрос, но я также поместил символы% в переменную $ sVal для корректности:
$ sVal = "'% tom%', '% lastname%', '%12345% ','% Diego% ','% CA% '";
Мне кажется, что НОЛЬ имеет смысл, что эхо-вывод переменной SAME будет работать, но сама переменная не будет.Есть идеи?