CodeIgniter – 如何捕捉数据库错误?

有没有办法使CI在遇到数据库错误时抛出exception,而不是显示如下消息:

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

注:我只想要在一个控制器中发生这种情况。 在其他控制器中,我很高兴能显示数据库错误信息。

试试这些CIfunction

 $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 – >中将数据库的debuggingclosures

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

这对您的网站安全性更好。

我知道这个线程是旧的,但以防万一有别人有这个问题。 这是一个我不使用CI db类的技巧。 把你的debugging和你的错误视图文件,抛出一个exception。

所以在你的数据库configuration,你有:

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

然后在你的数据库错误视图文件,我的是在application/errors/error_db.php用以下内容replace所有的内容:

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

由于视图文件将被调用,错误将总是作为一个exception抛出,你可能以后为不同的环境添加不同的视图。

我为此创build了一个简单的库:

 <?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(); 

find错误比较好。在完成你的网站之后。 使用它closures错误消息

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

你会改变你的configuration文件夹的database.php

把这段代码放到一个名为MY_Exceptions.php的application / core文件夹中:

 <?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 { } 

这将使所有的代码点火器错误被视为exception(CiError)。 然后,打开所有的数据库debugging:

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