首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法在PHP中使用PDO获取错误信息

无法在PHP中使用PDO获取错误信息
EN

Stack Overflow用户
提问于 2016-01-20 01:30:29
回答 1查看 665关注 0票数 1

我正在学习PDO,并试图在我当前的项目中实现它。当我使用mysqli时,我可以获得关于使用mysqli_error($connection)的任何错误的详细信息。我在googled中搜索了可与PDO相比的内容,找到了this post,并决定在我的代码中实现它。但是,即使我知道sql语句中存在明显的错误,也无法获得任何错误消息。

相关守则:

代码语言:javascript
复制
class Database {

public $connection;

function __construct() {
    $this->open_database_connection();
}

public function open_database_connection() {


    try {

        $this->connection = new PDO('mysql:host=' . DB_HOST . ';dbname=' . DB_NAME, DB_USER, DB_PASSWORD);

        $this->connection->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        $this->connection->setAttribute( PDO::ATTR_EMULATE_PREPARES, false);


    } catch(PDOException $e) {
        echo $e->getMessage();  
        die('Could not connect');
    }

} // end of open_database_connection method




public function query($sql, $params = []) {

    try {

        $query = $this->connection->prepare($sql);

    } catch (Exception $e) {
        var_dump('mysql error: ' . $e->getMessage());
    }


    foreach($params as $key => $value) {
        if ($key === ':limit') {
            $query->bindValue($key, $value, PDO::PARAM_INT);

        } else {
            $query -> bindValue($key, $value);
        }
    }

    try {

        $query->execute();

    } catch(Exception $e) {
        echo 'Exception -> ';
        var_dump($e->getMessage());
    }


    /*
    DID NOT WORK:
    if (!$query->execute()) {
            print_r($query->errorinfo());

    }*/

      $result = $query->fetchAll(PDO::FETCH_ASSOC);

        $this->confirm_query($result); 
        return $result; 

}  // end of query method



  function confirm_query($query) {

    if (!$query) {
        die('mysql error: ');
}

}

当我运行代码时,我确实得到了"mysql错误“,但是我没有得到关于它的任何细节。我做错了什么?

更新:根据要求,我在下面提供更多的详细信息。

我要做的是让用户的登录细节得到验证。为此,一旦用户输入他的凭据,此代码将运行:

代码语言:javascript
复制
if (isset($_POST['submit'])) {

    $username = trim($_POST['username']);
    $password = trim($_POST['password']);

    //check the database for the user

    $user_found = User::verify_user($username, $password);

来自用户类的相关代码:

代码语言:javascript
复制
    public static function verify_user($username, $password) {

        global $db;

        $username = $db->escape_string($username);
        $password = $db->escape_string($password);

        $values = [ ":username" => $username,
                    ":password" => $password,
                    ":limit" => 1
                  ];


        $result_array = self::find_this_query("SELECT * FROM users WHERE username=:username AND password=:password LIMIT :limit", true, $values);


        return !empty($result_array)? array_shift($result_array) : false;

    }




    public static function find_this_query($sql, $prepared = false, $params = []) {

        global $db;

        $the_object_array = array();
        $result = $db->query($sql, $params);

        $arr_length = count($result);

        for ($i = 0; $i < $arr_length; $i++) {

            $the_object_array[] = self::instantiation($result[$i]);
        }

        return $the_object_array;

    }


    public static function instantiation($the_record) {

        $the_object =new self; //we need new self because $the_record corresponds to one user!



        foreach($the_record as $the_attribute => $value) {

            if ($the_object->has_the_attribute($the_attribute)) {
                $the_object->$the_attribute = $value;
            }
        }


        return $the_object;

    }

    public function has_the_attribute($attribute) {

        $object_properties = get_object_vars($this);

        return array_key_exists($attribute, $object_properties);
    }
EN

Stack Overflow用户

发布于 2016-01-20 02:14:02

您必须使用PDO::errorInfo():

代码语言:javascript
复制
(...)

public function query($sql, $params = []) {

try {

    $query = $this->connection->prepare($sql);
    if( !$query )
    {
       $error = $this->connection->errorInfo();
       die( "mysql error: {$error[2]}" );
    }

} catch (Exception $e) {
    var_dump('mysql error: ' . $e->getMessage());
}

(...)
}

PDO::errorInfo返回数组:

元素0: SQLSTATE错误代码( ANSI SQL标准中定义的五个字符的字母数字标识符); 元素1:驱动程序特有的错误代码; 元素2:特定于驱动程序的错误消息。

票数 0
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34889995

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档