it-swarm.com.de

CodeIgniter - Wie fange ich DB-Fehler auf?

Gibt es eine Möglichkeit, CI eine exception auszulösen, wenn ein DB-Fehler auftritt, anstatt eine Meldung wie folgt anzuzeigen:

Ein Datenbankfehler ist aufgetreten. Fehlernummer: 1054 Unbekannte Spalte 'foo' in 'where-Klausel' SELECT * FROM (FooBar) WHERE foo = '1'

HINWEIS: Ich möchte, dass dies nur in einem Controller geschieht. In den anderen Controllern freue ich mich, dass die DB-Fehlermeldungen angezeigt werden.

56

Probieren Sie diese CI-Funktionen aus

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

Vielleicht das:

$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

In Codeigniter 3.0 (CI3) müssen Sie lediglich $this->db->error()

Wenn Sie den zuletzt aufgetretenen Fehler abrufen müssen, gibt die error () - Methode ein Array mit Code und Nachricht zurück

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

25
CodeGodie

Sie müssen das Debugging für die Datenbank in config/database.php -> deaktivieren 

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

Es ist besser für die Sicherheit Ihrer Website. 

15
Kabir Hossain

Ich weiß, dass dieser Thread alt ist, aber für den Fall, dass jemand anderes dieses Problem hat. Dies ist ein Trick, den ich verwendet habe, ohne die CI-Datenbankklassen zu berühren. Lassen Sie Ihr Debugging in und in Ihrer Fehleransicht-Datei und geben Sie eine Ausnahme aus.

In Ihrer DB-Konfiguration haben Sie also: 

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

In Ihrer DB-Fehleransicht-Datei befindet sich meine in application/errors/error_db.php, und ersetzen Sie den gesamten Inhalt durch Folgendes:

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

?>

Da die View-Datei aufgerufen wird, wird der Fehler immer als Ausnahme ausgegeben. Sie können später andere Ansichten für verschiedene Umgebungen hinzufügen.

11
tlogbon

Ich habe dafür eine einfache Bibliothek erstellt: 

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

}

Die Beispielabfrage:

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

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

Und ich kann es in meinem Controller so fangen:

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

 }
4
da1lbi3

Benutze es

    $this->db->_error_message(); 

Es ist besser, nach Fehlern zu suchen

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

Sie ändern es in der Datei database.php Ihres Konfigurationsordners 

2
Kabir Hossain

Fügen Sie diesen Code in eine Datei namens MY_Exceptions.php im Ordner application/core ein:

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

}

Alle Code Igniter-Fehler werden als Ausnahme (CiError) behandelt. Aktivieren Sie dann Ihren gesamten Datenbank-Debugging:

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

ein Beispiel, das für mich funktioniert hat:

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

Beste

1
dlg_

Wenn man PDO verwendet, zusätzlich zu allen obigen Antworten.

Ich protokolliere meine Fehler lautlos wie folgt

        $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

Deaktivieren Sie das Debuggen von Fehlern.

    $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