【问题标题】:How to handle mysql connection exception in the simplest way如何用最简单的方式处理mysql连接异常
【发布时间】:2016-08-21 09:16:42
【问题描述】:

我想弄清楚如何在一个类中处理 mysql 连接。无需始终将其包装在 if 语句中。这是一个示例,可帮助您了解我要做什么。

    class Database {
      protected $conn;
      protected $password;
      protected $username;
      protected $servername;

      public function Database(){
       $this->conn = new mysqli($this->servername,$this->username,$this->password);
      }

      public function scriptA(){
       if ($this->conn->connect_error) {
           die("Connection failed: " . $conn->connect_error);
        } else{
        //do script A
           return $result;
        }
     }

     public function scriptB(){
      if ($conn->connect_error) {
          die("Connection failed: " . $conn->connect_error);
      } else{
        //do script B
       return $result;
      }
    }

}

如您所见,如果我要添加更多脚本,我将不得不添加很多 if 捕获以检查它是否已连接。有没有类似 php 的函数异常处理程序的东西? IE函数foo抛出异常?

【问题讨论】:

  • 您可以编写一个类似于 DB 的类,该类将在构造中具有连接并调用其函数来执行查询。在您的脚本中,它将类似于$db = new Database,然后是$db->Query('SELECT * FROM table');
  • 使用 throw 和 catch 进行异常处理stackoverflow.com/questions/17549584/…
  • @Autor69 这就是我所做的,我只是在想是否最好让类扩展异常。
  • @Hahn 我将不得不添加很多 try catch 和 throws 。我尽量保持代码简单和干净。不重复同样的事情。对不起,我是个害虫。

标签: php


【解决方案1】:
  1. 在类方法中使用die()bad idea。您的应用程序可能会因发送的部分输出、未正确处理的错误等而意外停止。这就像您在脚本运行时关闭服务器上的电源一样。结果是不可预测的。这里有个小提示,当你有die() 语句时,你将很难用单元测试来测试代码。如果你愿意,我可以在这里列出更多问题。

  2. 当出现问题时,PDO 会抛出 exceptions。但很可能您不需要在 Connection 类中捕获异常,因为您无法处理此类中的异常。您不能向客户发送错误或记录错误或回滚正在进行的某些活动或通知管理员等。除了可能通过不同的异常之外,您不能做任何事情。

  3. 我认为您需要审查您的应用程序并在代码中捕获PDOException,您可以真正做一些事情。这很可能是由您的框架完成的,您需要更改框架的默认行为。另一种选择是在负责某些业务逻辑的类中执行此操作。在这种情况下,如果 SQL 失败,您可能会做一些不同的事情。

【讨论】:

    【解决方案2】:

    这是使用PDO 处理异常的简单方法:

        class Connection{
                public    $db;
                protected $DB_HOST;
                protected $DB_NAME;
                protected $DB_USER;
                protected $DB_PASSWORD;
    
                function __construct($db_host,$db_name,$db_user,$db_password){
                    try{
                        $this->DB_HOST = $db_host;
                        $this->DB_NAME = $db_name;
                        $this->DB_USER = $db_user;
                        $this->DB_PASSWORD = $db_password;
    
    
                        $this->db = new pdo('mysql:host='.$this->DB_HOST.';dbname='.$this->DB_NAME,$this->DB_USER,$this->DB_PASSWORD);                      
                    }catch(PDOException $e){
                        die($e->getMessage());
                    }
                }   
    
        }
    
    $con = new Connection('db_host','db_name','db_user','db_password');
    
    // display something else here in case connection succeded.
    echo 'congratulation you are no connected to your database !';
    

    【讨论】:

      猜你喜欢
      • 2023-01-18
      • 1970-01-01
      • 1970-01-01
      • 2016-01-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多