mysqli- > error: S'agit-il uniquement de la dernière requête ou de la dernière erreur du groupe de requêtes?

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

Question

Je suis nouveau sur mysqli, et j'essaie de confirmer que, si j'ai quelque chose de semblable, l'errno sera réglé sur la dernière erreur, le cas échéant, et non sur l'erreur de la dernière requête.

S'agit-il d'une pratique décente ou devrais-je vérifier l'erreur entre chaque requête?

Merci!

$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
}
Était-ce utile?

La solution

mysqli_errno - Renvoie le code d'erreur pour l'appel de fonction le plus récent .

Autres conseils

Non - il rapporte le code d'erreur du dernier appel à la fonction mysqli. Zéro signifie qu'aucune erreur n'est survenue lors du dernier appel de fonction. Donc, si une personne au milieu échoue, vous ne le saurez pas en vérifiant seulement à la fin.

En d'autres termes, oui, vous devez vérifier le code d'erreur après chaque appel de fonction. Notez qu'une erreur est également indiquée par la valeur de retour de $ mysqli- > query () . Paraphrasant l'exemple de la mysqli_errno doc:

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

Non, vous devez vous enregistrer entre chaque requête car cela vous donnera toujours une erreur pour la dernière requête uniquement ... Donc, si votre première requête échoue et que la dernière exécution a lieu correctement, vous n'obtiendrez pas d'erreur ... alors vérifiez après chaque requête un par un, pas enfin ...

A notre connaissance, le meilleur moyen de détecter toutes les erreurs consiste à étendre la classe mysqli:

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;
    }
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top