Предупреждение: PDOStatement :: execute (): SQLSTATE : недопустимый номер параметра: параметр не определен в … filetext

$ fields – массив, который после печати получает такие значения, как:

Array ( [first_name] => Nisse [last_name] => Example [ssn] => 198306205053 [address] => Stockholm, Sverige [phone_number] => 54654987321546 [latitude] => 55.717089999999999 [longitude] => 13.235379 ) 

Я вызываю функцию обновления из своего dataclass следующим образом:

 DataManager::update_user($fields, $user_data['id']; 

Но я получаю сообщение об ошибке:

Предупреждение: PDOStatement :: execute (): SQLSTATE [HY093]: недопустимый номер параметра: параметр не определен в … filetext

Я проверил несколько других подобных потоков, но я предполагаю, что у меня отсутствует базовая концепция, потому что я все еще не могу найти ответ. В моем массиве есть 7? И 7 элементов, и если я определяю все значения, я могу отлично их реализовать в SQL-среде SQL, т. Е.

 UPDATE users SET first_name = 'Kalle', last_name = 'Anka', ssn = 242345234, address = 'Stockholm', phone_number = 53423434, latitude = 17.189889231223423423424324234, longitude = 109.234234 WHERE id = 4 

Я попробовал подготовленную инструкцию PDO как с $ user_id, установленным к определенному значению, так и без параметров широты / долготы.

Если я забыл какую-либо критическую информацию, просто укажите это, и я получу ее. адрес – varchar, а lat / long – это float в DB btw. Использование MYSQL.

Функция ниже:

 public static function update_user($fields, $user_id) { $db = self::_connect(); $st = $db->prepare("UPDATE users SET first_name = ?, last_name = ?, ssn = ?, address = ?, phone_number = ?, latitude = ?, longitude = ? WHERE id = '{$user_id}'"); $st->execute($fields); return ($st->rowCount()) ? true : false; } 

    Если вы используете позиционные параметры, массив параметров, которые вы передаете для execute() должен быть порядковым массивом. Аналогично, если вы используете именованные параметры, массив должен быть ассоциативным массивом.

    Вот тест, подтверждающий поведение:

     $stmt = $db->prepare("SELECT ?, ? ,?"); $params = array( 'a', 'b', 'c' ); // OK if ($stmt->execute($params)) { print_r($stmt->fetchAll()); } $params = array( 'A'=>'abc', 'B'=>'def', 'C'=>'ghi' ); // ERROR! if ($stmt->execute($params)) { print_r($stmt->fetchAll()); } $stmt = $db->prepare("SELECT :A, :B, :C"); $params = array( 'a', 'b', 'c' ); // ERROR! if ($stmt->execute($params)) { print_r($stmt->fetchAll()); } $params = array( 'A'=>'abc', 'B'=>'def', 'C'=>'ghi' ); // OK if ($stmt->execute($params)) { print_r($stmt->fetchAll()); } 

    Обратите внимание, что в текущих версиях PHP ключи ассоциативного массива не обязательно должны иметь префикс : как комментарии @prodigitalson. Префикс, который ранее требовался в ключах массива в старых версиях PHP.

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