2013-03-25 54 views
2

我想写一个小类,以便我可以使用它来连接到我的数据库但是我有一个问题,PDO不显示错误。如何在连接类中使用PDO时显示mysql错误?

我想要做的是在查询失败时显示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; 

      } 

    } 



} 


?> 
+0

你能粘贴你如何使用try/catch语句,你在它抓到什么异常类型?另外,放置try/catch块的位置很重要? – Alexey 2013-03-25 18:30:49

+0

你用来测试什么代码? – 2013-03-25 19:09:01

回答

2

你不一定显示的错误信息,但只有提高它。显示mysql错误消息会让你的网站不太安全,看起来很平均。

所以,只有你的关心必须

  • 使PDO theow在SQL错误异常。
  • 建立PHP,使显示的开发服务器上的错误信息,并记录在一个人住一间

因此,在你的脚本

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

的顶部试试这个代码,然后运行一个这些函数具有故意的mysql错误。你的脚本应该停止显示错误信息。

更新:
嗯,我试图运行你的代码和这些代码2魔纹从上面帮我另一种方式:

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

意味着变量被拼错(你必须使用$this->pdo_opt代替) - 所以,这就是PDO不会抛弃异常的原因。

这是一个教训,为什么error_reporting始终E_ALL

+0

再次感谢先生。我试图显示错误的原因是为了调试所有原因。我将使用ini_set,以便查看我的错误。如果我没有进一步的问题,我会更新这个问题。 – Jaylen 2013-03-25 19:34:31

+0

您在我的课堂中发现的错误是我没有看到错误的原因:)所以我现在确实看到了错误。既然你引导我写这个课程的正确方向开始,你可以给我一些关于课程的反馈,我该如何改进它?再次感谢您的反馈:) – Jaylen 2013-03-25 20:15:42

+0

@Mike我希望有人也可以回顾我自己的课程:)但人们很少倾向于回顾其他人的代码。所以,我满足于一个经验法则:“最好的评论者是日常的真实生活中的应用”。试着用你的课程来学习一些真实的应用,看看它是否合适。虽然我有一些笔记一目了然。 1.您需要一组方法来封装原始PDO方法,例如在大型数据集的循环中使用rowCount(),insertId(),fetch()等。你的setConnectionCredentials似乎不可靠。为什么不让它接受具有所有可能凭据的数组? – 2013-03-26 11:13:47

0

我会摆脱或不使用的方法getError()getOneResult()processQuery()和​​。使用这个类来管理你的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 
} 
+0

**从不**使用try..catch来回显错误信息。 – 2013-03-25 18:46:08

+0

getOneResult()方法可以将无用代码量减少四分之一。请不要反对那些希望减少代码臃肿的人。 – 2013-03-25 18:49:57

+0

'getOneResult()'甚至没有做它所说的。“getOneResult”表明它获得一行,但它不会,它可能会返回多个结果,但只有一列。 – Hayden 2013-03-25 18:52:35