2011-11-11 109 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(),使用後Conexion::$cn->lastInsertId()$query->execute()

+0

我想這是因爲PDO驅動用的mysql_query其下方犯規支持多個查詢,因爲我已經回到了使用的mysqli的multi_query及其工作很好:) –

+0

與pdo_mysql,要使用多個查詢你必須setAttribute(PDO :: ATTR_EMULATE_PREPARES,真)你PDO或PDOStatement。另外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(); 
    } 
} 
相關問題