【问题标题】:PDO Multi-query "SQLSTATE[HY000]: General error"PDO 多查询“SQLSTATE[HY000]:一般错误”
【发布时间】:2011-12-27 00:49:45
【问题描述】:

我还在学习 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 表中,但之后出现错误。

谁能看到做错了什么? :)

干杯!

【问题讨论】:

    标签: php mysql pdo


    【解决方案1】:

    我很确定 PDO 的 mysql 驱动程序(可能是 mysql 本身?)不支持多查询准备语句。

    在您的查询中使用Conexion::$cn->lastInsertId() 而不是SELECT LAST_INSERT_ID(),在您的$query->execute() 之后使用

    【讨论】:

    • 我确实认为这是因为 pdo 驱动程序在下面使用 mysql_query 不支持多个查询,我已经回到使用 mysqli 的 multi_query 并且工作正常:)
    • 使用 pdo_mysql,要使用多个查询,您必须在 PDO 或 PDOStatement 上设置属性 (PDO::ATTR_EMULATE_PREPARES, true)。 pdo 也没有在下面使用 mysql_query ......这是一种替换 mysql_* 扩展的方法
    【解决方案2】:

    我认为这是正确的:

    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();
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2013-06-20
      • 2017-06-17
      • 1970-01-01
      • 2012-10-24
      • 2012-10-25
      • 2014-12-31
      • 2012-11-13
      相关资源
      最近更新 更多