it-swarm-id.com

CodeIgniter - bagaimana cara menangkap kesalahan DB?

Apakah ada cara untuk membuatCImelempar pengecualian ketika menemukan kesalahan DB daripada menampilkan pesan seperti:

Kesalahan Database Terjadi Nomor Kesalahan: 1054 Kolom tidak dikenal 'foo' di 'di mana klausa' SELECT * FROM (FooBar) WHERE foo = '1'

CATATAN: Saya hanya ingin ini terjadi dalam satu pengontrol. Di pengontrol lain, saya senang untuk menampilkan pesan kesalahan DB .

56

Coba fungsi CI ini

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

Mungkin ini:

$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
33
RayJ

Di Codeigniter 3.0 (CI3), yang harus Anda lakukan adalah $this->db->error()

Jika Anda perlu mendapatkan kesalahan terakhir yang telah terjadi, metode error () akan mengembalikan array yang berisi kode dan pesannya

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

25
CodeGodie

Anda harus mematikan debug untuk basis data di config/database.php -> 

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

Itu lebih baik untuk keamanan situs web Anda. 

15
Kabir Hossain

Saya tahu utas ini sudah tua, tetapi kalau-kalau ada orang lain yang mengalami masalah ini. Ini adalah trik yang saya gunakan tanpa menyentuh kelas CI db. Biarkan debug Anda dan dalam file tampilan kesalahan Anda, lontarkan pengecualian.

Jadi dalam konfigurasi db Anda, Anda memiliki: 

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

Kemudian dalam file tampilan kesalahan db Anda, milik saya ada di application/errors/error_db.php ganti semua konten dengan yang berikut:

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

?>

Karena file tampilan akan dipanggil, kesalahan akan selalu dilemparkan sebagai pengecualian, nanti Anda dapat menambahkan tampilan berbeda untuk lingkungan yang berbeda.

11
tlogbon

Saya telah membuat perpustakaan sederhana untuk itu: 

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

}

Contoh permintaan:

function insertId($id){
    $data = array(
        'id' => $id,
    );

    $this->db->insert('test', $data);
    $this->exceptions->checkForError();
    return $this->db->insert_id();
}

Dan saya bisa menangkapnya dengan cara ini di controller saya:

 try {
     $this->insertThings->insertId("1");
 } catch (UserException $error){
     //do whatever you want when there is an mysql error

 }
4
da1lbi3

Gunakan

    $this->db->_error_message(); 

Lebih baik untuk menemukan kesalahan. Setelah menyelesaikan situs Anda . Tutup pesan kesalahan Gunakan itu

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

Anda akan mengubahnya di database.php folder config Anda 

2
Kabir Hossain

Masukkan kode ini ke dalam file bernama MY_Exceptions.php di folder 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
{

}

Ini akan membuat semua kesalahan Penyala Kode diperlakukan sebagai Pengecualian (CiError). Kemudian, aktifkan semua debug basis data Anda:

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

contoh yang bekerja untuk saya:

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

Terbaik

1
dlg_

Jika seseorang menggunakan PDO, tambahan untuk semua jawaban di atas.

Saya mencatat kesalahan saya secara diam-diam seperti di bawah ini

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

        }
0
blumanski

Nonaktifkan debugging kesalahan.

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