CodeIgniter - как поймать ошибки БД? - программирование
Подтвердить что ты не робот

CodeIgniter - как поймать ошибки БД?

Есть ли способ заставить CI генерировать исключение, когда он сталкивается с ошибкой БД вместо отображения такого сообщения:

Произошла ошибка базы данных Номер ошибки: 1054 Неизвестный столбец 'foo' в ', где предложение' SELECT * FROM (FooBar) WHERE foo= '1'

ПРИМЕЧАНИЕ. Я хочу, чтобы это происходило только на одном контроллере. В других контроллерах я рад отображать сообщения об ошибках БД.

4b9b3361

Ответ 1

Попробуйте эти функции CI

$this->db->_error_message(); (mysql_error equivalent)
$this->db->_error_number(); (mysql_errno equivalent)

Ответ 2

Возможно, это:

$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

В Codeigniter 3.0 (CI3) все, что вам нужно сделать, это $this->db->error()

Если вам нужна последняя ошибка, которая произошла, метод error() вернет массив, содержащий его код и сообщение

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

Ответ 4

Вы должны отключить отладку для базы данных в config/database.php →

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

Это лучше для безопасности вашего сайта.

Ответ 5

Я знаю, что эта ветка устарела, но на всякий случай у кого-то еще есть эта проблема. Это трюк, который я использовал, не касаясь классов CI db. Оставьте свой отладочный файл и в вашем файле просмотра ошибок, выделите исключение.

Итак, у вас db config, у вас есть:

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

Затем в вашем файле представления ошибок db моя находится в application/errors/error_db.php, замените все содержимое следующим образом:

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

?>

Поскольку будет вызываться файл вида, ошибка всегда будет выбрана как исключение, позже вы можете добавить разные представления для разных окружений.

Ответ 6

Я создал для этого простую библиотеку:

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

 }

Ответ 7

Используйте его

    $this->db->_error_message(); 

Лучше найти ошибку. После завершения вашего сайта. Закройте сообщения об ошибках используя его

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

Вы измените его в своей папке config.php

Ответ 8

Поместите этот код в файл 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
{

}

Это приведет к тому, что все ошибки восходящего кода будут рассматриваться как исключение (CiError). Затем включите всю отладку базы данных:

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

Ответ 9

Если один использует 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']);

        }

Ответ 10

Отключить отладку ошибок.

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

Ответ 11

пример, который работал для меня:

$query = "some buggy sql statement";

$this->db->db_debug = false;

if([email protected]$this->db->query($query))
{
    $error = $this->db->error();
    // do something in error case
}else{
    // do something in success case
}
...

Лучший