如何在连接类中使用PDO时显示mysql错误?

时间:2013-03-25 18:29:08

标签: php mysql class error-handling pdo

我正在尝试编写一个小类,以便我可以使用它连接到我的数据库但是我知道PDO没有显示错误的问题。

我想要做的是在查询失败时显示mysql错误,所以我知道错误是什么并修复它。

在我的调用中,我有4种方法需要捕获mysql错误。

startConnection()
getOneResult()
processQuery()
getDataSet()

这是我目前的课程 有人可以告诉我如何显示mysql错误。注意我尝试使用try catch来捕获错误,但这对我不起作用。

感谢您的帮助

<?php

class connection {

    private $connString;
    private $userName;
    private $passCode;
    private $server;
    private $pdo;
    private $errorMessage;

    private $pdo_opt = array (
                            PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION,
                            PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC
                            );



    function __construct($dbName, $serverName = 'localhost'){

        //sets credentials
        $this->setConnectionCredentials($dbName, $serverName);

        //start the connect
        $this->startConnection();

    }

    function startConnection(){


            $this->pdo = new PDO($this->connString, $this->userName, $this->passCode, $this->pdo_opt);

            if( ! $this->pdo){

                $this->errorMessage  = 'Failed to connect to database. Please try to refresh this page in 1 minute. ';
                $this->errorMessage .= 'However, if you continue to see this message please contact your system administrator.';
                echo $this->getError();

            }

    }


    //this will close the PDO connection
    public function endConnection(){

        $this->pdo->close;
    }

    //return a dataset with the results
    public function getDataSet($query, $data = NULL)
    {
        $cmd = $this->pdo->prepare( $query );

        $cmd->execute($data);
        return $cmd->fetchAll();
    }


    //return a dataset with the results
    public function processQuery($query, $data = NULL)
    {
        $cmd = $this->pdo->prepare( $query );

        return $cmd->execute($data);
    }


    public function getOneResult($query, $data = NULL){
        $cmd = $this->pdo->prepare( $query );
        $cmd->execute($data);
        return $cmd->fetchColumn();
    }

    public function getError(){
        if($this->errorMessage != '')
            return $this->errorMessage;
        else
            return true;  //no errors found

    }

    //this where you need to set new server credentials with a new case statment
    function setConnectionCredentials($dbName, $serv){

        switch($serv){

            case 'NAME':
                $this->connString   = 'mysql:host='.$serv.';dbname='.$dbName.';charset=utf8';
                $this->userName     = 'user';
                $this->passCode     = 'password';
            break;

            default:
                $this->connString   = 'mysql:host=localhost;dbname=rdi_cms;charset=utf8';
                $this->userName     = 'user';
                $this->passCode     = 'pass!';
            break;

            }

    }



}


?>

2 个答案:

答案 0 :(得分:2)

您不一定显示错误消息,但只能提升。显示mysql错误消息会使您的站点不太安全,看起来很卑鄙。

所以,唯一需要关注的是

  • 使PDO在SQL错误上具有异常。
  • 设置PHP以使错误消息显示在开发服务器上并以实时登录

因此,请在脚本顶部尝试此代码

ini_set('display_errors',1);
error_reporting(E_ALL);

然后使用故意的mysql错误运行其中一个函数。应暂停您的脚本,显示错误消息。

更新:
好吧,我试着运行你的代码,上面这两行神奇的代码帮助了我:

Notice: Undefined variable: pdo_opt in D:\SERVER\htdocs\0.php on line 37

表示变量拼写错误(您必须使用$this->pdo_opt) - 因此,这就是PDO没有引发异常的原因。

以上是一个教训,为什么error_reporting应该始终 E_ALL

答案 1 :(得分:0)

我会删除或不使用方法getError()getOneResult()processQuery()getDataSet()。使用该类来管理您的PDO连接。然后将您的PDO语句包装在try ... catch。

try
{
    $conn = new connection( "mydatabase" );
    $db = $conn->getPdoInstance();
    $stmt = $db->prepare( "SELECT * FROM `something`" );
    $stmt->execute();
}
catch( PDOException $e )
{
   // Catch the error message and do whatever you need to do with it
}