Question

Je pose cette question au nom d'un petit groupe de mes utilisateurs qui ont ce problème.

Une fois que le script qu'ils utilisent atteint le 21ème ID, il génère l'erreur suivante :

Le Select examinerait plus que les lignes max_join_size;Vérifiez votre où et utilisez SET SQL_BIG_SELECTS = 1 ou définissez SQL_MAX_JOIN_SIZE = # Si le Select est correct

J'ai fait autant de recherches que possible et j'ai trouvé une réponse : http://dev.mysql.com/doc/refman/5.0/en/set-option.html

Le problème est qu'ils sont sur un hébergement partagé et ne peuvent donc pas modifier leurs paramètres MySQL pour corriger les erreurs.

Y a-t-il quelque chose que je puisse écrire dans mon script pour qu’ils n’aient pas ce problème ?

Il s'agit de la fonction qui génère la requête de base de données en fonction des modules chargés :$sql = 'SELECT a.id comme identifiant, a.address comme adresse';

        $query  = 'SELECT'
                . ' name AS module_name'
                . ', databasename AS module_database'
                . ', pregmatch AS module_pregmatch'
                . ', pregmatch2 AS module_pregmatch2'
                . ', html AS module_html'
                . ', sqlselect AS database_sqlselect'
                . ', sqljoin AS database_sqljoin'
                . ', sqlupdatewithvalue AS database_sqlupdatewithvalue'
                . ', sqlupdatenovalue AS database_sqlupdatenovalue'
                . ' FROM #__aqsgmeta_modules'
                . ' WHERE enabled = 1'
                . ' ORDER BY id';                       
        $db->setQuery($query);
        $results = $db->loadObjectList();
        if (count($results) != 0) {
            foreach ($results as $result) {
                $sqlselect .= ', ';
                $sqlselect .= $result->database_sqlselect;

                $sqljoin .= ' ';
                $result->database_sqljoin = preg_replace('/\{DATABASENAME\}/Ui', $result->module_database, $result->database_sqljoin);
                if (!(preg_match("/" . $result->database_sqljoin . "/Ui", $sqljoin))) 
                    $sqljoin .= $result->database_sqljoin;
            }
        }

        if ($use_sh404sef)
            $sqlselect .= ', g.oldurl AS sefurl';
        $sql .= $sqlselect;
        $sql .= ' FROM #__aqsgmeta_address AS a';
        $sql .= $sqljoin;

        if ($use_sh404sef)
            $sql .= ' LEFT JOIN #__redirection AS g ON g.newurl = a.address';

        $sql .=
        //. ' WHERE a.id IN (' . $cids . ')'
        ' WHERE a.id = ' . $id
        . ' ORDER BY a.address asc,a.id '
        ;
        $db->setQuery($sql);
        $rows = $db->loadObjectList();
Était-ce utile?

La solution

MAX_JOIN_SIZE est un cran de sécurité couramment utilisé sur les hébergements mutualisés.

Il ne vous permettra pas d'exécuter accidentellement de longues requêtes qui bloqueraient le serveur.

Émettez cette commande :

SET SQL_BIG_SELECTS = 1

avant d'exécuter la requête, vous savez qu'elle doit renvoyer de nombreuses valeurs.

Autres conseils

Le MAX_JOIN_SIZE est atteint lorsque MySQL calcule le produit cartésien d'une jointure, et non les enregistrements réellement attendus.Par conséquent, si vous joignez une table massive à une autre table massive, cela augmentera.Utilisez des index et des vues pour réduire les résultats possibles de la table si elle est vraiment aussi grande.

En voir plus ici : MySQL-SQL_BIG_SELECTS

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top