mysqli-> Fehler: Ist es für die letzte Abfrage nur, oder für die letzten Fehler aus der Abfragegruppe?

StackOverflow https://stackoverflow.com/questions/319423

Frage

Ich bin neu in mysqli, und zu versuchen, um zu bestätigen, dass, wenn ich so etwas wie die folgenden, wird die errno auf die letzten Fehler, falls vorhanden, und nicht den Fehler der letzten Abfrage festgelegt werden.

Ist das eine anständige Praxis oder soll ich in zwischen jeder Abfrage für die Fehler werden überprüft?

Danke!

$mysqli->autocommit(FALSE);

$mysqli->query("INSERT INTO .....");
$mysqli->query("INSERT INTO .....");
$mysqli->query("INSERT INTO .....");
$mysqli->query("INSERT INTO .....");
$mysqli->query("INSERT INTO .....");

if ( 0==$mysqli->errno ) {
    $mysqli->commit();
} else {
    $mysqli->rollback();
    // Handle error
}
War es hilfreich?

Lösung

mysqli_errno - Liefert den Fehlercode für die jüngste Funktionsaufruf

.

Andere Tipps

Nein - es meldet den Fehlercode des letzten Mysqli Funktionsaufruf. Null bedeutet kein Fehler auf dem letzten Funktionsaufruf aufgetreten. Also, wenn man in der Mitte ausfällt, werden Sie es nicht wissen nur am Ende zu überprüfen.

Mit anderen Worten, ja, müssen Sie den Fehlercode nach jedem Funktionsaufruf überprüfen. Man beachte, dass ein Fehler durch den Rückgabewert von $mysqli->query() ebenfalls angezeigt wird. In Anlehnung an das Beispiel aus dem mysqli_errno doc:

if (!$mysqli->query("INSERT ...")) {
    printf("Errorcode: %d\n", $mysqli->errno);
}

Nein, müssen Sie zwischen jeder Abfrage Check-in, weil es immer Sie Fehler nur für letzte Abfrage geben ... Also, wenn Sie Ihre erste Abfrage ist fehlgeschlagen und ausführen zuletzt richtig, dann werden Sie nicht Fehler bekommen ... so überprüfen, nachdem alle Abfrage eins nach dem anderen nicht zuletzt ...

IMO die beste Art und einfachste Weg, um alle Fehler zu fangen ist die mysqli Klasse zu erweitern:

class DBException extends Exception {
}
class DBConnectException extends DBException {
}
class DBQueryException extends DBException {
}

class DB extends MySQLi {
    private static $instance = null;

    private function __construct() {
        parent::__construct('host',
                            'username',
                            'passwd',
                            'dbname');

        if ($this->connect_errno) {
            throw new DBConnectException($this->connect_error, $this->connect_errno);
        }
    }

    private function __destructor() {
        parent::close();
    }

    private function __clone() {
    }

    public static function getInstance() {
        if (self::$instance == null) {
            self::$instance = new self();
        }
        return self::$instance;
    }

    public function query($query, $resultmode = MYSQLI_STORE_RESULT) {
        $result = parent::query($query, $resultmode);
        if (!$result) {
            // or do whatever you wanna do when an error occurs
            throw new DBQueryException($this->error, $this->errno);
        }
        return $result;
    }
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top