2011-10-20 28 views
47

Có cách nào để làm cho CI ném một ngoại lệ khi nó gặp một lỗi DB thay vì hiển thị một thông báo như:CodeIgniter - làm thế nào để bắt lỗi DB?

Một Lỗi Database Xảy ra Error Number: 1054 Unknown cột 'foo 'trong' mệnh đề 'SELECT * FROM (FooBar) WHERE foo =' 1 '

GHI CHÚ: Tôi chỉ muốn điều này xảy ra trong một bộ điều khiển. Trong các bộ điều khiển khác, tôi vui mừng vì nó hiển thị các thông báo lỗi DB.

Trả lời

47

Hãy thử những chức năng CI

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

Và khi truy vấn tái tạo một cách thực tế, '$ this-> db-> last_query()' cũng hữu ích. – uzsolt

+6

Làm cách nào để ngăn các tin nhắn hiển thị? – StackOverflowNewbie

+7

Bạn phải tắt gỡ lỗi cho cơ sở dữ liệu trong config/database.php -> $ db ['default'] ['db_debug'] = FALSE; – decebal

23

Có lẽ đây:

$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 
13

Bạn phải bật gỡ lỗi tắt cho cơ sở dữ liệu trong config/database.php ->

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

Nó là tốt hơn để bảo mật trang web của bạn.

2

Sử dụng nó

$this->db->_error_message(); 

Nó là tốt hơn cho việc tìm kiếm error.After hoàn thành trang web của bạn. Đóng thông báo lỗi sử dụng nó

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

Bạn sẽ thay đổi nó trong database.php thư mục cấu hình của bạn

9

Tôi biết chủ đề này là cũ, nhưng chỉ trong trường hợp có ai đó có vấn đề này. Đây là một mẹo mà tôi đã sử dụng mà không cần chạm vào các lớp db db. Để gỡ lỗi của bạn và trong tệp xem lỗi của bạn, hãy ném một ngoại lệ.

Vì vậy, trong bạn db cấu hình, bạn có:

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

Sau đó, trong db tập tin xem lỗi của bạn, tôi là trong application/errors/error_db.php thay thế tất cả nội dung như sau:

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

?> 

Kể từ khi tập tin view sẽ được gọi, lỗi sẽ luôn bị ném như một ngoại lệ, sau đó bạn có thể thêm các chế độ xem khác nhau cho môi trường khác nhau.

23

Trong CodeIgniter 3.0 (CI3), tất cả các bạn phải làm là $this->db->error()

Nếu bạn cần phải nhận được lỗi cuối cùng đã xảy ra, phương pháp lỗi() sẽ trả về một mảng chứa mã và thông điệp của nó

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

+1

Thx! Chúng không đề cập đến điều này trong hướng dẫn di chuyển CI 2 -> 3 của chúng! – user3319803

+0

, bạn đã cứu ngày của tôi .. Tôi vẫn đang làm nó như của CI 2 – Neri

1

Đặt mã này trong một tập tin gọi MY_Exceptions.php trong thư mục ứng dụng/lõi:

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

} 

Nó sẽ làm cho tất cả các lỗi Lỗi đánh dấu được coi là Ngoại lệ (CiError). Sau đó, lần lượt tất cả debug cơ sở dữ liệu của bạn về:

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

Tôi đã tạo ra một thư viện đơn giản cho rằng:

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

} 

Các truy vấn Ví dụ:

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

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

Và tôi có thể bắt nó theo cách này trong bộ điều khiển của tôi:

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

} 
Các vấn đề liên quan