2016-04-27 2 views
0

Я пытаюсь понять, как обращаться с соединением mysql внутри класса. Не всегда обертывая его в оператор if. Вот пример, который поможет вам понять, что я пытаюсь сделать.Как обработать исключение соединения mysql самым простым способом

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; 
     } 
    } 

}

Как вы можете видеть, если я должен был добавить несколько сценариев, я бы добавить много если уловы, чтобы проверить это было связанно. есть ли что-то вроде обработчика исключений функций, который имеет php? Функция IE foo вызывает исключение?

+0

Вы можете написать класс, похожий на DB, который будет иметь соединение в конструкции и вызвать его функцию для выполнения запроса. В ваших сценариях это будет что-то вроде '$ db = new Database', а затем' $ db-> Query ('SELECT * FROM table'); ' – Autor69

+0

Использовать throw и catch для обработки исключений http://stackoverflow.com/questions/17549584/how-to-effectively-use-try-catch-blocks-in-php – Hahn

+0

Попробуйте PDO: http://php.net/manual/en/book.pdo.php –

ответ

1

Вот простой способ для обработки исключений с помощью 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 !'; 
0
  1. Это bad idea использовать die() внутри метода класса. Ваше приложение может неожиданно прекратиться с отправлением частичного вывода, ошибки обрабатываются неправильно и т. Д. Это похоже на то, что вы выключаете электроэнергию на сервере во время работы скрипта. Результат непредсказуем. Небольшая заметка здесь, вы будете испытывать трудности с тестированием кода с помощью модульных тестов, если у вас есть die(). Я могу перечислить больше вопросов, если вы это сделаете.

  2. PDO выбрасывает exceptions, когда что-то пойдет не так. Но, скорее всего, вам не нужно поймать исключение в классе Connection, потому что вы не можете обработать исключение в этом классе. Вы не можете отправить сообщение об ошибке клиенту или зарегистрировать ошибку или отменить какую-либо текущую активность или уведомить администратора и т. Д. Вы ничего не можете сделать, кроме как может быть связано с другим исключением.

  3. Я думаю, вам нужно просмотреть ваше приложение и поймать PDOException в коде, где вы действительно можете что-то сделать. Скорее всего, это делается с помощью вашей структуры, и вам нужно изменить поведение по умолчанию в структуре. Другой вариант - сделать это в классе, который отвечает за некоторую бизнес-логику. В этом случае вы можете сделать что-то другое, если SQL терпит неудачу.

+0

Я буду избегать «умирать», тогда спасибо за подсказку – user629283

Смежные вопросы