CodeIgniter - 如何捕获数据库错误?

Sta*_*bie 64 php codeigniter

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

发生数据库错误错误号:1054'where子句'中的未知列'foo'SELECT*FROM(FooBar)WHERE foo='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)

  • 这些方法已在CodeIgniter版本3中删除.请使用`$ this-> db-> error()`.(见http://www.codeigniter.com/user_guide/database/queries.html#handling-errors) (37认同)
  • 为什么不能使用Exception代替:-(? (12认同)
  • 这些如何阻止消息显示? (8认同)
  • 你必须在config/database.php中关闭数据库的调试 - > $ db ['default'] ['db_debug'] = FALSE; (8认同)
  • 当查询以dinamically方式创建时,`$ this-> db-> last_query()`也很有用. (4认同)
  • 恕我直言这不回答这个问题.`display_error`函数以`exit(8)`结尾,因此你无法捕获异常.唯一的方法是禁用db_debug,因为其他答案告诉. (3认同)

小智 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)

最好的事物


da1*_*bi3 7

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

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


Adr*_*ves 5

将此代码放入 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)