mysqli-> erro: É para a última consulta apenas, ou para o último erro do grupo de consulta?

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

Pergunta

Eu sou novo para mysqli, e tentando confirmar que, se eu assim que algo como o abaixo, o errno será ajustada para o último erro, se houver, e não o erro da última consulta.

Essa é uma prática decente ou devo estar verificando para o erro entre cada consulta?

Obrigado!

$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
}
Foi útil?

Solução

mysqli_errno -. Retorna o código de erro para a chamada de função mais recente

Outras dicas

Não - ele relata o código de erro da chamada de função última mysqli. Zero significa que nenhum erro ocorreu na última chamada de função. Então, se um no meio falhar, você não vai saber sobre isso, verificando apenas no final.

Em outras palavras, sim, você precisa verificar o código de erro após cada chamada de função. Note-se que um erro é indicado pelo valor de retorno de $mysqli->query() também. Parafraseando o exemplo do mysqli_errno doc:

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

Não, você tem que verificar entre cada consulta porque sempre lhe dará erro para última consulta só ... Então, se a sua primeira consulta falhou e último executar corretamente, então você não terá erro ... de modo a verificar afinal consulta um por um não enfim ...

IMO da melhor forma e maneira mais fácil de pegar todos os erros é estender a 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;
    }
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top