Domanda

Sono nuovo di mysqli e sto provando a confermare che se ho qualcosa di simile al seguente, errno verrà impostato sull'ultimo errore, se presente, e non sull'errore dell'ultima query.

È una pratica decente o devo verificare l'errore tra ogni query?

Grazie!

$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
}
È stato utile?

Soluzione

mysqli_errno - Restituisce il codice di errore per la chiamata di funzione più recente .

Altri suggerimenti

No - riporta il codice di errore dell'ultima chiamata della funzione mysqli. Zero indica che non si è verificato alcun errore nell'ultima chiamata di funzione. Quindi, se uno nel mezzo fallisce, non lo saprai controllando solo alla fine.

In altre parole, sì, è necessario controllare il codice di errore dopo ogni chiamata di funzione. Tieni presente che un errore è indicato anche dal valore di ritorno $ mysqli- > query () . Parafrasando l'esempio dal mysqli_errno doc:

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

No, devi fare il check-in tra ogni query perché ti darà sempre l'errore solo per l'ultima query ... Quindi se la tua prima query ha avuto esito negativo e l'ultima viene eseguita correttamente, non otterrai errori ... quindi controlla dopo tutte le query uno alla volta non finalmente ...

L'IMO il modo migliore e il modo più semplice per rilevare tutti gli errori è estendere 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;
    }
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top