MariaDB/MySQL: L’errore 2014 “Commands out of sync”

English version

Se si esegue prima mysqli_multi() e poi mysqli_query() o mysqli_result(), si ottiene il maledetto errore 2014: Commands out of sync; you can't run this command now (SQLSTATE: HY000). Se vi capita, significa che non avete liberato i resultset dopo mysqli_multi(). Magari non sapevate nemmeno che quei resultset esistono, perché avete eseguito istruzioni come INSERT, DELETE, o qualche DDL.

Beh, ecco una funzione che libera tutti i resultset, insieme a un esempio di utilizzo:

<?php
    
/**
 *	Free all resultsets from $dbCon.
 *	@param		mysqli		$dbCon	mysqli object.
 *	@return		void
 */
function free_all_results(mysqli $dbCon)
{
    do {
        if ($res = $dbCon->store_result()) {
            $res->fetch_all(MYSQLI_ASSOC);
            $res->free();
        }
    } while ($dbCon->more_results() && $dbCon->next_result());
}
    
$db = new mysqli('...', '...', '...', '...');
    
$sql = <<<SQL
    DROP TABLE IF EXISTS `test`.`tab1`;
    CREATE TABLE `test`.`tab1` (`col` INT);
    INSERT INTO `test`.`tab1` VALUE (1);
SQL;
$db->multi_query($sql);
    
free_all_results($db);
    
$sql = 'SELECT * FROM `test`.`tab1`;';
$res = $db->query($sql);
    
if ($db->sqlstate !== '00000') {
    echo 'SQLSTATE: ' . $db->sqlstate . '; Error: ' . $db->errno . ' - ' . $db->error;
} else {
    echo $res->num_rows;
}
    
?>

Se commentate la riga free_all_results($db); vedrete apparire l’errore.

Divertitevi!

Annunci

Ciao, mondo!

FALSE non è NULL nasce come versione italiana del blog FALSE IS NOT NULL. I contenuti verranno tradotti dall’inglese, mentre il titolo è stato tradotto… dall’SQL.

Non ho ancora chiaro come regolarmi con FALSE non è NULL:
* Conterrà tutti gli articoli di FALSE IS NOT NULL?
* Conterrà traduzioni di altri materiali interessanti?
Mah, vedremo.

Nel frattempo, qualche parola su di me:
Mi chiamo Federico Razzoli, sono un programmatore italiano e sono l’autore di entrambi i blog. Lo scopo principale dei due progetti è la condivisione libera delle conoscenze, il fine secondario è convincervi che un miliardo di euro non è un prezzo troppo alto per una mia consulenza. Il secondo scopo non è semplice da raggiungere, ma l’importante è non arrendersi.

Per contattarmi (soprattutto se vi siete convinti di quanto ho appena affermato), cliccate sul menù qua sopra, pagina “Chi Sono”.

Questo è tutto, gente.
A presto!