Я все еще изучаю PDO, поэтому я мог пропустить что-то, но в основном я пытаюсь вставить строку в таблицу, а затем выбрать сгенерированный идентификатор.
Я не уверен, что он любит оба запроса в одном pdo-заявлении. Вот код, который я использую для выполнения SQL.
public function ExecuteQuery($sql, $params = array()) { if($this->_handle == null) $this->Connect(); $query = $this->_handle->prepare($sql); foreach($params as $key => $value) { if(is_int($value)){ $query->bindValue(':'.$key, $value, \PDO::PARAM_INT); }else if(is_bool($value)){ $query->bindValue(':'.$key, $value, \PDO::PARAM_BOOL); }else if(is_null($value)){ $query->bindValue(':'.$key, $value, \PDO::PARAM_NULL); }else{ $query->bindValue(':'.$key, $value, \PDO::PARAM_STR); } } $query->execute(); $x = $query->fetchAll(\PDO::FETCH_ASSOC); var_dump($x); return $x; }
Эта функция является частью класса базы данных, $ this -> _ handle – это объект PDO.
public function Connect() { try { $this->_handle = new \PDO('mysql:host='.$this->_host.';dbname='.$this->_database, $this->_username, $this->_password); $this->_handle->setAttribute( \PDO::ATTR_ERRMODE, \PDO::ERRMODE_EXCEPTION ); } catch(PDOException $e) { echo $e->getMessage(); } }
И SQL я запускаю это:
INSERT INTO `users` (`Username`, `Password`, `PasswordSalt`, `Email`, `IsAdmin`, `LoginAttempts`, `LastLogin`, `LastLoginAttempt`, `Created`) VALUES (:username, :password, :passwordsalt, :email, :isadmin, :loginattempts, :lastlogin, :lastloginattempt, :created); SELECT LAST_INSERT_ID() as 'id'
Пользователь создается и находится в таблице пользователей, но после этого он исправляет ошибки.
Может ли кто-нибудь увидеть, что я делаю неправильно? 🙂
Ура!
Я уверен, что драйвер mysql для PDO (может быть, сам mysql?) Не поддерживает подготовленные инструкции с несколькими запросами.
Вместо SELECT LAST_INSERT_ID()
в вашем запросе используйте Conexion::$cn->lastInsertId()
после выполнения $query->execute()
Я думаю, это правильно:
function ExecuteQuery($sql, $params = array()) { if(Conexion::$cn== null) Conexion::Connect(); $paramString=""; foreach($params as $k=>$v) { $param = " :".$k." ,"; $paramString .= $param; } $sql.=substr($paramString,0,-2); $query = Conexion::$cn->prepare($sql); foreach($params as $key => $value) { echo "entro"; $query->bindParam(":".$key, $value); } $query->execute(); $x = $query->fetchAll(\PDO::FETCH_ASSOC); var_dump($x); return $x; } public function Connect() { try { $dns='dblib:host='.Conexion::$server.";dbname=".Conexion::$db.";"; Conexion::$cn = new \PDO($dns, Conexion::$user, Conexion::$passw); Conexion::$cn->setAttribute( \PDO::ATTR_ERRMODE, \PDO::ERRMODE_EXCEPTION ); } catch(PDOException $e) { echo $e->getMessage(); } }