mysqli-> hata: sadece, veya sorgu grubundan son hata için son sorgu için mi?

4 Cevap php

Ben mysqli için yeni ve onaylamak için çalışıyor o yüzden aşağıda gibi bir şey, errno son sorgu hata varsa, son hata set değil edilecektir.

Bu iyi bir uygulama mı yoksa her sorgu arasında hata için kontrol edilmelidir?

Teşekkürler!

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

4 Cevap

mysqli_errno - the most recent function call için hata kodunu döndürür.

Hayır - son mysqli işlev çağrısının hata kodu bildiriyor. Sıfır hata son işlev çağrısı meydana gelir. Ortada bir başarısız Yani, sonunda sadece kontrol ederek bu konuda bilemezsiniz.

Diğer bir deyişle, evet, her işlevi çağrısının ardından hata kodunu kontrol etmek gerekir. Bir hata dönüş $mysqli->query() değeri de belirtilir unutmayın. mysqli_errno doc örnek açımlama:

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

Hayır, her zaman sadece son sorgu için size hata verecektir, çünkü her sorguda arasında kontrol etmek zorunda ... Yani ilk sorgusu başarısız oldu ve son düzgün yürütmek ise o zaman hata almazsınız ... bu yüzden kontrol her sorgudan sonra tek tek son değil de ...

IMO iyi şekilde ve tüm hataları yakalamak için en kolay yolu, mysqli sınıfını genişletmek için:

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