mysqli- > error: ¿Es solo para la última consulta o para el último error del grupo de consulta?
-
11-07-2019 - |
Pregunta
Soy nuevo en mysqli e intento confirmar que si hago algo como lo siguiente, el error se establecerá en el último error, si lo hay, y no en el error de la última consulta.
¿Es esta una práctica decente o debería verificar el error entre cada consulta?
¡Gracias!
$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
}
Solución
mysqli_errno: devuelve el código de error para la llamada de función más reciente .
Otros consejos
No: informa el código de error de la última llamada a la función mysqli. Cero significa que no se produjo ningún error en la última llamada a la función. Entonces, si uno en el medio falla, no lo sabrá al marcar solo al final.
En otras palabras, sí, debe verificar el código de error después de cada llamada a la función. Tenga en cuenta que el valor de retorno de $ mysqli- > query ()
también indica un error. Parafraseando el ejemplo del mysqli_errno doc:
if (!$mysqli->query("INSERT ...")) {
printf("Errorcode: %d\n", $mysqli->errno);
}
No, tiene que verificar entre cada consulta porque siempre le dará un error solo para la última consulta ... Entonces, si su primera consulta falló y la última se ejecutó correctamente, entonces no obtendrá un error ... así que verifique después de toda consulta uno por uno, por fin ...
IMO, la mejor manera y la forma más fácil de detectar todos los errores es extender la clase 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;
}
}