2011-11-11 34 views
1

私はまだPDOを勉強しているので、何かが見逃されるかもしれませんが、基本的にはテーブルに行を挿入してから生成されたIDを選択しようとしています。PDOマルチクエリ "SQLSTATE [HY000]:一般的なエラー"

どちらの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' 

ユーザーが作成され、ユーザーがテーブルにありますが、その後、それエラーされます。

誰かが間違っているのを見ることはできますか? :)

乾杯!

答えて

1

私はPDO用のMySQLドライバは(多分自分自身をのmysql?)マルチクエリプリペアドステートメントをサポートしていないかなり確信しています。

代わりのクエリでSELECT LAST_INSERT_ID()、私はPDOドライバがサポート複数のクエリをdoesntのどの下にするmysql_queryを使用していたので、それは、私は以来、戻ってmysqliののmulti_queryのを使っへ行ってきたと思うし、そのないあなたの$query->execute()

+0

Conexion::$cn->lastInsertId()を使用PDOやPDOStatementに対してsetAttribute(PDO :: ATTR_EMULATE_PREPARES、true)する必要がある複数のクエリを使用するには、pdo_mysqlを使用して –

+0

をうまく動作させます。また、pdoはmysql_queryの下では使用しません... mysql_ *の拡張を置き換える方法です –

0

私はこれが正しいと思う:

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(); 
    } 
} 
関連する問題