Risolvere l'errore mysql only_full_group_by nelle vecchie versioni di Codeigniter

Può capitare che un server venga aggiornato, specialmente quando si utilizzano servizi di hosting condiviso, senza particolari avvertimenti da parte del gestore.

Utilizzando qualche vecchia versione di Codeginiter può capitare che l'applicazione non funzioni più, ricevendo un errore simile a questo:

Expression #2 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'devdefault.a_order_deliveries_files.id' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by

La soluzione migliore sarebbe quella di disabilitare la funzionalità direttamente da mysql, tramite il pannello di phpmyadmin oppure con una semplice query:

SET GLOBAL sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));

Spesso però non si ha l'accesso come utente root e pertanto questa strada non è percorribile.
La soluzione consiste allora nel modificare il codice del core di Codeigniter.
All'interno del file /system_XXX/database/DB.php (dove XXX è la versione utilizzata) si troverà un pezzo di codice simile, con il quale Codeigniter inizializza il database per la sessione corrente (ovvero ogni volta che si connette):

$this->_mysqli->options(MYSQLI_INIT_COMMAND,
 'SET SESSION sql_mode =
 REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(
 @@sql_mode,
 "STRICT_ALL_TABLES,", ""),
 ",STRICT_ALL_TABLES", ""),
 "STRICT_ALL_TABLES", ""),
 "STRICT_TRANS_TABLES,", ""),
 ",STRICT_TRANS_TABLES", ""),
 "STRICT_TRANS_TABLES", "")'
);

Per risolvere il problema andiamo quindi a disabilitare ONLY_FULL_GROUP_BY all'inizio di ogni connessione, sostituendo la query all'interno del codice con la seguente:

SET SESSION sql_mode =
 REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(
 @@sql_mode,
 "ONLY_FULL_GROUP_BY,", ""),
 ",ONLY_FULL_GROUP_BY", ""),
 "ONLY_FULL_GROUP_BY", ""),
 "STRICT_ALL_TABLES,", ""),
 ",STRICT_ALL_TABLES", ""),
 "STRICT_ALL_TABLES", ""),
 "STRICT_TRANS_TABLES,", ""),
 ",STRICT_TRANS_TABLES", ""),
 "STRICT_TRANS_TABLES", "")

 

 


Commenti