Problema: dopo un cambio di database (senza alcuna modifica al dominio) in Prestashop non vengono più visualizzati i prodotti nelle singole categorie e accedendo al pannello di controllo si presenta un errore del tipo Expression #11 of SELECT list is not in GROUP BY clause and contains nonaggregated column [...] which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by
Soluzione: Modificare l’opzione sql_mode in sql_mode='STRICT_TRANS_TABLES, NO_ZERO_IN_DATE, NO_ZERO_DATE, ERROR_FOR_DIVISION_BY_ZERO, NO_AUTO_CREATE_USER, NO_ENGINE_SUBSTITUTION'
Nel caso specifico sarebbe sufficiente modificare la variabile globale sql_mode eseguendo la query:
1 |
SET GLOBAL sql_mode=(SELECT REPLACE(@@sql_mode, 'ONLY_FULL_GROUP_BY', '')); |
Purtroppo questa modifica, che sarebbe quella ottimale e definitiva, non è sempre possibile da attuare a causa dei permessi sul database. Nel caso in cui non la si possa mettere in pratica sarà sufficiente modificare il file classes/db/DbPDO.php nella maniera seguente.
Aprendo il file alla riga 63 si troverà la seguente funzione:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
public function connect() { try { $this->link = $this->_getPDO($this->server, $this->user, $this->password, $this->database, 5); } catch (PDOException $e) { die(sprintf(Tools::displayError('Link to database cannot be established: %s'), utf8_encode($e->getMessage()))); } // UTF-8 support if ($this->link->exec('SET NAMES \'utf8\'') === false) die(Tools::displayError('PrestaShop Fatal error: no utf-8 support. Please check your server configuration.')); return $this->link; } |
Modificare la funzione nella maniera seguente, aggiungendo prima di return
il pezzo di codice evidenziato:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
public function connect() { try { $this->link = $this->_getPDO($this->server, $this->user, $this->password, $this->database, 5); } catch (PDOException $e) { die(sprintf(Tools::displayError('Link to database cannot be established: %s'), utf8_encode($e->getMessage()))); } // UTF-8 support if ($this->link->exec('SET NAMES \'utf8\'') === false) die(Tools::displayError('PrestaShop Fatal error: no utf-8 support. Please check your server configuration.')); // disable ONLY_FULL_GROUP_BY if ($this->link->exec('set session sql_mode=\'STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION\'') === false) die(Tools::displayError('PrestaShop Fatal error')); return $this->link; } |
Questa soluzione è stata presa da questo commento nel forum ufficiale.