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

有没有一种方法可以使CI在遇到数据库错误时抛出异常,而不是显示如下消息:

发生数据库错误,错误号:1054           'where子句'中的未知列'foo'SELECT * FROM(FooBar)WHERE foo ='1'

注意:我只希望这在一个控制器中发生。 在其他控制器中,我很高兴它显示DB错误消息。

StackOverflowNewbie asked 2019-10-07T20:10:03Z
11个解决方案
59 votes

尝试这些CI功能

$this->db->_error_message(); (mysql_error equivalent)
$this->db->_error_number(); (mysql_errno equivalent)
Oskenso Kashi answered 2019-10-07T20:10:14Z
34 votes

也许这个:

$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
RayJ answered 2019-10-07T20:10:33Z
27 votes

在Codeigniter 3.0(CI3)中,您所需要做的就是$this->db->error()

如果您需要获取最近发生的错误,则error()方法将返回一个包含其代码和消息的数组

[http://www.codeigniter.com/user_guide/database/queries.html#handling-errors]

CodeGodie answered 2019-10-07T20:11:10Z
15 votes

您必须在config / database.php中关闭数据库的调试->

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

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

Kabir Hossain answered 2019-10-07T20:11:41Z
11 votes

我知道这个线程很旧,但是以防万一还有其他人遇到这个问题。 这是我在不接触CI db类的情况下使用的技巧。 保留调试功能,并在错误视图文件中引发异常。

因此,在您的数据库配置中,您有:

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

然后在您的数据库错误视图文件中,我的位于application/errors/error_db.php中,将所有内容替换为以下内容:

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

?>

由于将调用视图文件,因此错误总是会作为异常抛出,您以后可以为不同的环境添加不同的视图。

tlogbon answered 2019-10-07T20:12:25Z
4 votes

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

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

 }
da1lbi3 answered 2019-10-07T20:13:02Z
2 votes

用它

    $this->db->_error_message(); 

完成网站后,最好查找错误。关闭错误消息使用它

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

您将在配置文件夹的database.php中对其进行更改

Kabir Hossain answered 2019-10-07T20:13:35Z
2 votes

将此代码放在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
{

}

它将所有“代码点火器”错误都视为异常(CiError)。 然后,打开所有数据库调试:

$db['default']['db_debug'] = true;
Adriano Gonçalves answered 2019-10-07T20:14:07Z
1 votes

一个对我有用的例子:

$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
}
...

最好

dlg_ answered 2019-10-07T20:14:37Z
0 votes

如果使用PDO,则除了上述所有答案之外。

我如下记录我的错误

        $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']);

        }
blumanski answered 2019-10-07T20:15:08Z
0 votes

禁用错误调试。

    $data_user = $this->getDataUser();
    $id_user   = $this->getId_user();

    $this->db->db_debug = false;
    $this->db->where(['id' => $id_user]);
    $res = $this->db->update(self::$table, $data_user['user']);

    if(!$res)
    {
        $error = $this->db->error();
        return $error;
        //return array $error['code'] & $error['message']
    }
    else
    {
        return 1;
    }
the_martux answered 2019-10-07T20:15:33Z
translate from https://stackoverflow.com:/questions/7843406/codeigniter-how-to-catch-db-errors