PDO неожиданно генерирует ошибки связанных переменных с несколькими параметрами - PullRequest
1 голос
/ 07 декабря 2010

У меня есть подготовленный оператор 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 будет работать, но сама переменная не будет.Есть идеи?

Ответы [ 2 ]

3 голосов
/ 07 декабря 2010

Ваш $sVal - это не массив, это просто простая строка, поэтому, когда вы пишете array($sVal), execute() видит только одно значение. Вам нужно explode () ваша $sVal строка, чтобы стать массивом:

// clean up the unnecessary single quotes and spaces
$value = str_replace(array("'", ", "), array("", ","), $value);
// make the array of the values
$value = explode(',', $value);
$stmt->execute($value);
1 голос
/ 07 декабря 2010

Проблема в том, что execute принимает массив параметров, , причем каждый параметр имеет свой собственный ключ . Передача SQL-подобной строки, разделенной запятыми, не будет работать, и даже если это произойдет, это сделает PDO бесполезным.

Это неправильно:

$sVal = "'tom', 'lastname', '12345', 'Diego', 'CA'";

Вот как это должно быть сделано:

$sVal = array('tom', 'lastname', '12345', 'Diego', 'CA');

Например, если вы получаете данные из формы в POST, это будет:

$sVal = array(
    $_POST['firstname'],
    $_POST['lastname'],
    $_POST['zipcode'],
    $_POST['city'],
    $_POST['state'],
);
$stmt->execute($sVal);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...