Intereting Posts
Получить исходный URL-адрес реферера из Google Search с помощью PHP? PHP include не работает с файлами, отличными от индекса Ошибки PHP на cronjob, отлично работает при подсказке WAMPserver – почему стек установлен с двумя файлами php.ini? Доступ к константе класса с использованием простой переменной, которая содержит имя константы поиск ассоциативного массива по значению сортировать файлы по дате в PHP Вызов нескольких хранимых процедур с помощью Zend Framework Как сделать успешную регистрацию, скопировать содержимое одного столбца таблицы в другое? Каким образом можно документировать файлы, классы и конструкторы? Невозможно заставить тему работать в режиме каталога Значения формы HTML в переменной SESSION в виде массива Скидка для определенной категории на основе общего количества продуктов Предоставляет ли Aptana 3 плагин PHP так же хорошо, как Aptana 1.5.1? CakePHP: скачать QR-код

PDO Multi-query "SQLSTATE : общая ошибка"

Я все еще изучаю 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(); } }