有没有办法让CI在遇到数据库错误时抛出异常,而不是显示如下消息:
发生数据库错误错误号:1054'where子句'中的未知列'foo'SELECT*FROM(
FooBar)WHEREfoo='1'
注意:我只希望在一个控制器中发生这种情况.在其他控制器中,我很高兴它显示数据库错误消息.
Osk*_*shi 63
尝试这些CI功能
$this->db->_error_message(); (mysql_error equivalent)
$this->db->_error_number(); (mysql_errno equivalent)
Run Code Online (Sandbox Code Playgroud)
小智 37
也许这个:
$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
Run Code Online (Sandbox Code Playgroud)
Cod*_*die 28
在Codeigniter 3.0(CI3)中,您所要做的就是 $this->db->error()
如果您需要获取发生的最后一个错误,error()方法将返回一个包含其代码和消息的数组
http://www.codeigniter.com/user_guide/database/queries.html#handling-errors
Kab*_*ain 15
您必须在config/database.php - >中关闭数据库的debug
$db['default']['db_debug'] = FALSE;
Run Code Online (Sandbox Code Playgroud)
这对您的网站安全性更好.
tlo*_*bon 12
我知道这个帖子已经老了,但以防其他人有这个问题.这是我在不触及CI db类的情况下使用的技巧.将调试保留在错误视图文件中,抛出异常.
所以在你的db config中,你有:
$db['default']['db_debug'] = true;
Run Code Online (Sandbox Code Playgroud)
然后在您的db错误视图文件中,我application/errors/error_db.php将使用以下内容替换所有内容:
<?php
$message = preg_replace('/(<\/?p>)+/', ' ', $message);
throw new Exception("Database error occured with message : {$message}");
?>
Run Code Online (Sandbox Code Playgroud)
由于将调用视图文件,因此错误将始终作为异常抛出,您可能稍后为不同的环境添加不同的视图.
小智 10
一个对我有用的例子:
$query = "some buggy sql statement";
$this->db->db_debug = false;
if(!@$this->db->query($query))
{
$error = $this->db->error();
// do something in error case
}else{
// do something in success case
}
...
Run Code Online (Sandbox Code Playgroud)
最好的事物
我为此创建了一个简单的库:
<?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
)
);
}
}
Run Code Online (Sandbox Code Playgroud)
示例查询:
function insertId($id){
$data = array(
'id' => $id,
);
$this->db->insert('test', $data);
$this->exceptions->checkForError();
return $this->db->insert_id();
}
Run Code Online (Sandbox Code Playgroud)
我可以在我的控制器中以这种方式捕获它:
try {
$this->insertThings->insertId("1");
} catch (UserException $error){
//do whatever you want when there is an mysql error
}
Run Code Online (Sandbox Code Playgroud)
将此代码放入 application/core 文件夹中名为 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
{
}
Run Code Online (Sandbox Code Playgroud)
它将使所有 Code Igniter 错误被视为异常 (CiError)。然后,打开所有数据库调试:
$db['default']['db_debug'] = true;
Run Code Online (Sandbox Code Playgroud)