Is there a way to make CI throw an exception when it encounters a DB error instead of displaying a message like:
当CI遇到DB错误时,是否有办法让它抛出异常,而不是显示如下消息:
A Database Error Occurred Error Number: 1054 Unknown column 'foo' in 'where clause' SELECT * FROM (
FooBar
) WHEREfoo
= '1'数据库出错:在where子句' SELECT * FROM (FooBar)中出现1054未知列'foo',其中foo = '1'
NOTE: I only want this to happen in one controller. In the other controllers, I'm happy for it to display the DB error messages.
注意:我只希望在一个控制器中发生这种情况。在其他控制器中,我很高兴它显示DB错误消息。
9 个解决方案
#1
51
Try these CI functions
试试这些词功能
$this->db->_error_message(); (mysql_error equivalent)
$this->db->_error_number(); (mysql_errno equivalent)
#2
29
Maybe this:
也许是这样的:
$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
#3
22
In Codeigniter 3.0 (CI3), all you have to do is $this->db->error()
在Codeigniter 3.0 (CI3)中,您所需要做的就是$this->db->error()
If you need to get the last error that has occured, the error() method will return an array containing its code and message
如果需要获取已发生的最后一个错误,error()方法将返回一个包含其代码和消息的数组
http://www.codeigniter.com/user_guide/database/queries.html#handling-errors
http://www.codeigniter.com/user_guide/database/queries.html处理错误
#4
14
You must turn debug off for database in config/database.php ->
必须在配置/数据库中关闭数据库的调试。php - >
$db['default']['db_debug'] = FALSE;
It is better for your website security.
这对你的网站安全更好。
#5
10
I know this thread is old, but just in case there's someone else having this issue. This is a trick I used without touching the CI db classes. Leave your debug on and in your error view file, throw an exception.
我知道这条线是旧的,但是以防有人有这个问题。这是我在不接触CI db类的情况下使用的技巧。将调试留在错误视图文件中,抛出一个异常。
So in you db config, you have :
在你的db配置中,你有
$db['default']['db_debug'] = true;
Then in your db error view file, mine is in application/errors/error_db.php
replace all content with the following:
然后在您的db错误视图文件中,我的是应用程序/错误/error_db。php将所有内容替换为以下内容:
<?php
$message = preg_replace('/(<\/?p>)+/', ' ', $message);
throw new Exception("Database error occured with message : {$message}");
?>
Since the view file will be called, the error will always get thrown as an exception, you may later add different views for different environment.
由于视图文件将被调用,错误将被作为一个异常抛出,您可以稍后为不同的环境添加不同的视图。
#6
4
I have created an simple library for that:
我为此创建了一个简单的库:
<?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
)
);
}
}
The example query:
这个示例查询:
function insertId($id){
$data = array(
'id' => $id,
);
$this->db->insert('test', $data);
$this->exceptions->checkForError();
return $this->db->insert_id();
}
And I can catch it this way in my controller:
我可以用我的控制器捕捉它:
try {
$this->insertThings->insertId("1");
} catch (UserException $error){
//do whatever you want when there is an mysql error
}
#7
2
Use it
使用它
$this->db->_error_message();
It is better for finding error.After completing your site. Close the error messages using it
它更适合发现错误。在完成你的网站。使用它关闭错误消息
$db['default']['db_debug'] = FALSE;
You will change it in your config folder's database.php
您将在配置文件夹的database.php中更改它
#8
2
Put this code in a file called MY_Exceptions.php in application/core folder:
将此代码放入名为my_exception的文件中。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
{
}
It will make all the Code Igniter errors to be treated as Exception (CiError). Then, turn all your database debug on:
它将使所有的代码触发错误被视为异常(CiError)。然后,打开所有数据库调试:
$db['default']['db_debug'] = true;
#9
0
If one uses PDO, additional to all the answers above.
如果你使用PDO,除了上面所有的答案。
I log my errors silently as below
我像下面这样默默地记录我的错误
$q = $this->db->conn_id->prepare($query);
if($q instanceof PDOStatement) {
// go on with bind values and execute
} else {
$dbError = $this->db->error();
$this->Logger_model->logError('Db Error', date('Y-m-d H:i:s'), __METHOD__.' Line '.__LINE__, 'Code: '.$dbError['code'].' - '.'Message: '.$dbError['message']);
}
#1
51
Try these CI functions
试试这些词功能
$this->db->_error_message(); (mysql_error equivalent)
$this->db->_error_number(); (mysql_errno equivalent)
#2
29
Maybe this:
也许是这样的:
$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
#3
22
In Codeigniter 3.0 (CI3), all you have to do is $this->db->error()
在Codeigniter 3.0 (CI3)中,您所需要做的就是$this->db->error()
If you need to get the last error that has occured, the error() method will return an array containing its code and message
如果需要获取已发生的最后一个错误,error()方法将返回一个包含其代码和消息的数组
http://www.codeigniter.com/user_guide/database/queries.html#handling-errors
http://www.codeigniter.com/user_guide/database/queries.html处理错误
#4
14
You must turn debug off for database in config/database.php ->
必须在配置/数据库中关闭数据库的调试。php - >
$db['default']['db_debug'] = FALSE;
It is better for your website security.
这对你的网站安全更好。
#5
10
I know this thread is old, but just in case there's someone else having this issue. This is a trick I used without touching the CI db classes. Leave your debug on and in your error view file, throw an exception.
我知道这条线是旧的,但是以防有人有这个问题。这是我在不接触CI db类的情况下使用的技巧。将调试留在错误视图文件中,抛出一个异常。
So in you db config, you have :
在你的db配置中,你有
$db['default']['db_debug'] = true;
Then in your db error view file, mine is in application/errors/error_db.php
replace all content with the following:
然后在您的db错误视图文件中,我的是应用程序/错误/error_db。php将所有内容替换为以下内容:
<?php
$message = preg_replace('/(<\/?p>)+/', ' ', $message);
throw new Exception("Database error occured with message : {$message}");
?>
Since the view file will be called, the error will always get thrown as an exception, you may later add different views for different environment.
由于视图文件将被调用,错误将被作为一个异常抛出,您可以稍后为不同的环境添加不同的视图。
#6
4
I have created an simple library for that:
我为此创建了一个简单的库:
<?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
)
);
}
}
The example query:
这个示例查询:
function insertId($id){
$data = array(
'id' => $id,
);
$this->db->insert('test', $data);
$this->exceptions->checkForError();
return $this->db->insert_id();
}
And I can catch it this way in my controller:
我可以用我的控制器捕捉它:
try {
$this->insertThings->insertId("1");
} catch (UserException $error){
//do whatever you want when there is an mysql error
}
#7
2
Use it
使用它
$this->db->_error_message();
It is better for finding error.After completing your site. Close the error messages using it
它更适合发现错误。在完成你的网站。使用它关闭错误消息
$db['default']['db_debug'] = FALSE;
You will change it in your config folder's database.php
您将在配置文件夹的database.php中更改它
#8
2
Put this code in a file called MY_Exceptions.php in application/core folder:
将此代码放入名为my_exception的文件中。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
{
}
It will make all the Code Igniter errors to be treated as Exception (CiError). Then, turn all your database debug on:
它将使所有的代码触发错误被视为异常(CiError)。然后,打开所有数据库调试:
$db['default']['db_debug'] = true;
#9
0
If one uses PDO, additional to all the answers above.
如果你使用PDO,除了上面所有的答案。
I log my errors silently as below
我像下面这样默默地记录我的错误
$q = $this->db->conn_id->prepare($query);
if($q instanceof PDOStatement) {
// go on with bind values and execute
} else {
$dbError = $this->db->error();
$this->Logger_model->logError('Db Error', date('Y-m-d H:i:s'), __METHOD__.' Line '.__LINE__, 'Code: '.$dbError['code'].' - '.'Message: '.$dbError['message']);
}