mysqli- > error: è solo per l'ultima query o per l'ultimo errore dal gruppo di query?
-
11-07-2019 - |
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
}
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;
}
}