PDO多查询“SQLSTATE [HY000]:常规错误”

时间:2011-11-11 13:26:38

标签: php mysql pdo

我还在学习PDO,所以我可能会错过一些东西,但基本上我试图在表格中插入一行,然后选择生成的ID。

我不确定它是否同时支持一个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'

用户已创建并存在于users表中,但之后出现错误。

任何人都可以看到做错了吗? :)

干杯!

2 个答案:

答案 0 :(得分:1)

我很确定PDO的mysql驱动程序(也许是mysql本身?)不支持多查询预处理语句。

在您的SELECT LAST_INSERT_ID()

之后使用Conexion::$cn->lastInsertId(),而不是$query->execute()

答案 1 :(得分: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();
    }
}