Есть ли способ сделать 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;