mysqli- > error: ¿Es solo para la última consulta o para el último error del grupo de consulta?

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

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
}
¿Fue útil?

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;
    }
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top