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

Php 在连接类中使用PDO时如何显示mysql错误?,php,mysql,class,error-handling,pdo,Php,Mysql,Class,Error Handling,Pdo,我正在尝试编写一个小类,这样我就可以使用它连接到我的数据库,但我有一个问题,PDO没有显示错误 我试图做的是在查询失败时显示mysql错误,这样我就知道错误是什么并修复它 在我的调用中,我有4个方法需要捕获mysql错误 startConnection() getOneResult() processQuery() getDataSet() 这是我现在的课 有人能告诉我如何显示mysql错误吗。注意:我试图使用try-catch来捕获错误,但这对我来说不起作用 谢谢你的帮助 <?php

我正在尝试编写一个小类,这样我就可以使用它连接到我的数据库,但我有一个问题,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;

            }

    }



}


?>

我将放弃或不使用方法
getError()
getOneResult()
processQuery()
getDataSet()
。使用该类仅管理PDO连接。然后用try…catch来包装您的PDO语句

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
}
您不必显示错误消息,只需将其引发即可。显示mysql错误消息会降低您的站点的安全性,并且看起来很卑鄙

所以,你唯一关心的是

  • 在SQL错误上生成PDO theow异常
  • 将PHP设置为在开发服务器上显示错误消息并在实时服务器上登录
因此,请在脚本顶部尝试此代码

ini_set('display_errors',1);
error_reporting(E_ALL);
然后运行其中一个函数,并出现故意错误。您的脚本应该停止显示错误消息

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

Notice: Undefined variable: pdo_opt in D:\SERVER\htdocs\0.php on line 37
意味着变量拼写错误(您必须使用
$this->pdo_opt
),所以,这就是pdo没有抛出异常的原因


这里有一个教训,为什么
错误报告
应该总是
E\u ALL

你能粘贴你是如何使用try/catch的,以及你在其中捕获了什么异常类型吗?此外,将try/catch块放置在何处也很重要?您正在使用什么代码进行测试?getOneResult()方法可以将无用代码的数量减少四倍。请不要反对那些想让代码不那么臃肿的人。
getOneResult()
甚至不按它说的做。“getOneResult”表示它只得到一行,但它没有,它可能会返回多个结果,但只返回一列。
*叹气*
您确定它会吗?您对PDO有很好的经验?好的,因此它只会获取第一个结果,但也没有空间指定它应该获取哪一列,更不用说如果结果查询多行,它只会返回第一行,但您可能需要的是另一行。有更好的方法可以做到这一点,而且很多PDO功能似乎都受到了限制。好吧,当有更多的字段或行时,就不要使用这个功能。使用您认为适合特定结果集的结果集。当您只需要单个标量值时,为什么不使用函数来获取单个标量值呢?“有更好的方法”并不意味着“每个人都只能遵循一种方法”。不过,如果你能展示其中一种更好的方法,并证明它确实更好——毫无疑问,OP将非常感激。再次感谢先生。我试图显示错误的原因是调试原因,仅此而已。我将使用ini_集合,以便查看我的错误。如果我没有其他问题,我会更新这个问题。你在我的课堂上发现的错误是我没有看到错误的原因:)所以我现在确实看到了错误。既然你从一开始就引导我正确地写作这门课,你能给我一些关于这门课的反馈吗?我该如何改进?再次感谢您的反馈:)@Mike我希望我也能有人复习我自己的课:)但是人们很少会复习别人的代码。因此,我满足于一条经验法则,即“最好的评论者是日常生活中使用的”。试着用你的类做一些实际的应用,看看它是否合适。虽然我有一些粗略的笔记。1.您需要一组方法来封装原始PDO方法,如rowCount()、insertId()、fetch(),以便在大型数据集的循环中使用,等等。2.你的SETConnectionRedentials似乎不可靠。为什么不让它接受包含所有可能凭据的数组?