Исключить исключение «PDOException» с сообщением «SQLSTATE : недопустимый номер параметра '

Я получаю сообщение об ошибке при попытке вставить в мою базу данных с помощью PDO.

public function save($primaryKey = "") { $validate = $this->rules(); if ($validate === true) { $properties = ''; $values = ''; $bindings = array(); $update = ''; foreach ($this as $property => $value){ if ($property === "conn") { continue; } $properties .= $property . ','; $values .= ':' . $property . ','; $update .= $property . ' = :' . $property . ','; $bindings[':'.$property] = $value; } $sql_string = 'INSERT INTO ' . get_class($this) . ' (' . rtrim($properties, ',') . ') '; $sql_string .= 'VALUES (' . rtrim($values, ',') . ') ON DUPLICATE KEY UPDATE ' . rtrim($update, ',') . ';'; $result = $this->executeQuery(NULL, $sql_string, $bindings); $this->buildObject($result); if (!empty($primaryKey)) { $this->$primaryKey = $this->conn->lastInsertId(); } return $result; } else { return $validate; } } public function executeQuery($object, $sql_string, $bindings = null) { $stmt = $this->conn->prepare($sql_string); if (!empty($bindings)) { if (!$stmt->execute($bindings)) {return false;} } else { if (!$stmt->execute()) {return false;} } $result = (!empty($object) ? $stmt->fetchAll(PDO::FETCH_CLASS, $object) : $stmt->fetchAll()); return (($stmt->rowCount() > 0) ? $result : false); } 

Функция сохранения генерирует как строку запроса, так и привязки, которые кажутся правильными.

 query = INSERT INTO am_administrator (firstName,lastName,username,password,email,isSuperUser,dateCreated,dateLastModified) VALUES (:firstName,:lastName,:username,:password,:email,:isSuperUser,:dateCreated,:dateLastModified) ON DUPLICATE KEY UPDATE firstName = :firstName,lastName = :lastName,username = :username,password = :password,email = :email,isSuperUser = :isSuperUser,dateCreated = :dateCreated,dateLastModified = :dateLastModified; bindings = array(8) { [":firstName"]=> string(5) "First" [":lastName"]=> string(4) "Last" [":username"]=> string(7) "cova-fl" [":password"]=> string(8) "password" [":email"]=> string(16) "test@testing.com" [":isSuperUser"]=> int(1) "1" [":dateCreated"]=> string(19) "2016-05-11 02:40:15" [":dateLastModified"]=> string(19) "2016-05-11 02:40:15" } 

Всякий раз, когда я помещаю запрос в workbench, у меня нет проблем, но при попытке запустить его в коде я получаю Fatal Error: Uncaught exception «PDOException» с сообщением «SQLSTATE [HY093]: недопустимый номер параметра», который меня смущает, поскольку количество привязок params соответствует ключам привязки и nummbers. Может ли кто-нибудь просветить меня по этому вопросу?

Related of "Исключить исключение «PDOException» с сообщением «SQLSTATE : недопустимый номер параметра '"

Я думаю, это может быть связано с тем, что вы дважды разделили каждую привязку в заявлении, например :firstname отображается в предложении VALUES , а также в подразделении ON DUPLICATE KEY UPDATE .

Вы передаете только 8 привязок к $stmt->execute но PDO ищет 16.

Вы можете попытаться называть их несколько разными в предложении ON DUPLICATE KEY UPDATE , давая вам запрос, например, например

INSERT INTO am_administrator (firstName,lastName,username,password,email,isSuperUser,dateCreated,dateLastModified) VALUES (:firstName,:lastName,:username,:password,:email,:isSuperUser,:dateCreated,:dateLastModified) ON DUPLICATE KEY UPDATE firstName = :update_firstName,lastName = :update_lastName,username = :update_username,password = :update_password,email = :update_email,isSuperUser = :update_isSuperUser,dateCreated = :update_dateCreated,dateLastModified = :update_dateLastModified;