Intereting Posts
Интерфейсы и наследование абстрактного класса, реализация в расширенных классах Как показать разбиение на страницы с помощью товарного кода? PHP-браузер и os-обнаружение, показывающие хром вместо оперы Разрешение лишено записи в один каталог, но не другой – оба имеют тот же владелец / группу / 755 Проверьте, находится ли значение внутри строки, которая имеет значения, разделенные запятыми? Обработка ошибок simplexml php MYSQL: копирование данных из двух баз данных. Обе базы данных находятся на разных серверах (хостинговые компании) Как лучше всего обрабатывать исключения для повторения событий календаря Класс mysqli в PHP защищает 100% от инъекций sql? Работа с зашифрованными файлами в Laravel (как загрузить дешифрованный файл) выберите первый дочерний узел корневого узла в файле XML, используя php обновление cakephp с 1,3 до 2 аутентификации Найти текст без какого-либо тега в элементе div Функция json_encode: специальные символы WooCommerce показывает два набора всех способов оплаты

CodeIgniter – как поймать ошибки БД?

Есть ли способ сделать CI исключение, когда он сталкивается с ошибкой БД, вместо того, чтобы отображать сообщение типа:

A Database Error Occurred Error Number: 1054 Unknown column 'foo' in 'where clause' SELECT * FROM (`FooBar`) WHERE `foo` = '1' 

ПРИМЕЧАНИЕ. Я хочу, чтобы это произошло только в одном контроллере. В других контроллерах я рад, что он отображает сообщения об ошибках БД.

Попробуйте эти функции CI

 $this->db->_error_message(); (mysql_error equivalent) $this->db->_error_number(); (mysql_errno equivalent) 

Может быть, это:

 $db_debug = $this->db->db_debug; //save setting $this->db->db_debug = FALSE; //disable debugging for queries $result = $this->db->query($sql); //run query //check for errors, etc $this->db->db_debug = $db_debug; //restore setting 

В Codeigniter 3.0 (CI3) все, что вам нужно сделать, это $this->db->error()

Если вам нужно получить последнюю ошибку, которая произошла, метод error () вернет массив, содержащий его код и сообщение

http://www.codeigniter.com/user_guide/database/queries.html#handling-errors

Вы должны отключить отладку для базы данных в config / database.php ->

 $db['default']['db_debug'] = FALSE; 

Это лучше для безопасности вашего сайта.

Я знаю, что эта ветка устарела, но на всякий случай есть кто-то другой, имеющий эту проблему. Это трюк, который я использовал, не касаясь классов CI db. Оставьте свой отладочный файл и в вашем файле просмотра ошибок, выбросьте исключение.

Итак, у вас db config у вас есть:

 $db['default']['db_debug'] = true; 

Затем в вашем файле представления ошибок db моя находится в application/errors/error_db.php заменив все содержимое следующим:

 <?php $message = preg_replace('/(<\/?p>)+/', ' ', $message); throw new Exception("Database error occured with message : {$message}"); ?> 

Поскольку будет вызываться файл представления, ошибка всегда будет выбрана как исключение, позже вы можете добавить разные представления для разных окружений.

Для этого я создал простую библиотеку:

 <?php defined('BASEPATH') OR exit('No direct script access allowed'); class exceptions { public function checkForError() { get_instance()->load->database(); $error = get_instance()->db->error(); if ($error['code']) throw new MySQLException($error); } } abstract class UserException extends Exception { public abstract function getUserMessage(); } class MySQLException extends UserException { private $errorNumber; private $errorMessage; public function __construct(array $error) { $this->errorNumber = "Error Code(" . $error['code'] . ")"; $this->errorMessage = $error['message']; } public function getUserMessage() { return array( "error" => array ( "code" => $this->errorNumber, "message" => $this->errorMessage ) ); } } 

Пример запроса:

 function insertId($id){ $data = array( 'id' => $id, ); $this->db->insert('test', $data); $this->exceptions->checkForError(); return $this->db->insert_id(); } 

И я могу это поймать в своем контроллере:

  try { $this->insertThings->insertId("1"); } catch (UserException $error){ //do whatever you want when there is an mysql error } 

Используй это

  $this->db->_error_message(); 

Лучше найти ошибку. После завершения вашего сайта. Закройте сообщения об ошибках, используя

  $db['default']['db_debug'] = FALSE; 

Вы измените его в своей папке базы данных config.php

Поместите этот код в файл MY_Exceptions.php в папку приложения / ядра:

 <?php if (!defined('BASEPATH')) exit('No direct script access allowed'); /** * Class dealing with errors as exceptions */ class MY_Exceptions extends CI_Exceptions { /** * Force exception throwing on erros */ public function show_error($heading, $message, $template = 'error_general', $status_code = 500) { set_status_header($status_code); $message = implode(" / ", (!is_array($message)) ? array($message) : $message); throw new CiError($message); } } /** * Captured error from Code Igniter */ class CiError extends Exception { } 

Это приведет к тому, что все ошибки восходящего кода будут рассматриваться как Исключение (CiError). Затем включите всю отладку базы данных:

 $db['default']['db_debug'] = true;