Erreurs php et autres améliorations

  • darxmurf
  • Auteur du sujet
  • Nouveau membre
  • Nouveau membre
Plus d'informations
il y a 4 ans 6 mois - il y a 4 ans 6 mois #2238 par darxmurf
Erreurs php et autres améliorations a été créé par darxmurf
Hello,
J'ai hérité il y a quelques temps d'un vieux serveur qui tourne un GRR 1.9 et je me suis dit qu'une petite migration sur la version actuelle ne ferait pas de mal.

Suite à la migration, j'avais toujours cette erreur dans la partie admin, gestion des domaines
Warning: mysql_num_rows() expects parameter 1 to be resource, boolean given in /var/www/isic-reservation/include/mysql.inc.php on line 143

En fouillant un peu dans le code, je suis tombé sur le fichier admin/admin_right_admin.php et le bloc à partir de la ligne 143 n'est pas vraiment optimisé... pourquoi tourner une boucle avec la totalité des utilisateurs et ensuite chercher si la personne est admin alors qu'une seule requête SQL suffit pour extraire les infos recherchées ?

en gros on peut remplacer ça:
Code:
$exist_admin='no'; $sql = "SELECT login, nom, prenom FROM ".TABLE_PREFIX."_utilisateurs WHERE (statut='utilisateur' OR statut='gestionnaire_utilisateur' OR statut='administrateur')"; $res = grr_sql_query($sql); if ($res) for ($i = 0; ($row = grr_sql_row($res, $i)); $i++) { $is_admin='yes'; $sql3 = "SELECT login FROM ".TABLE_PREFIX."_j_useradmin_area WHERE (id_area='".$id_area."' AND login='".$row[0]."')"; $res3 = grr_sql_query($sql3); $nombre = grr_sql_count($res3); if ($nombre == 0) $is_admin = 'no'; if ($is_admin == 'yes') { if ($exist_admin == 'no') { echo "<h3>".get_vocab("user_admin_area_list")."</h3>"; $exist_admin = 'yes'; } echo "<b>"; echo htmlspecialchars($row[1])." ".htmlspecialchars($row[2])."</b> | <a href='admin_right_admin.php?action=del_admin&amp;login_admin=".urlencode($row[0])."&amp;id_area=$id_area'>".get_vocab("delete")."</a><br />"; } }
par ça:
Code:
$exist_admin = 'no'; $sql = "SELECT ua.login, u.nom, u.prenom FROM ".TABLE_PREFIX."_j_useradmin_area ua LEFT JOIN ".TABLE_PREFIX."_utilisateurs u ON (u.login=ua.login) WHERE ua.id_area='$id_area'"; $res = grr_sql_query($sql); while ($row = mysqli_fetch_row($res)) { $is_admin='yes'; if ($exist_admin == 'no'){ echo "<h3>".get_vocab("user_admin_area_list")."</h3>"; $exist_admin = 'yes'; } echo "<b>"; echo htmlspecialchars($row[1])." ".htmlspecialchars($row[2])."</b> | <a href='admin_right_admin.php?action=del_admin&amp;login_admin=".urlencode($row[0])."&amp;id_area=$id_area'>".get_vocab("delete")."</a><br />"; }
ça évite de tourner une boucle des centaines de fois pour rien.

Par la même occasion, l'utilisation de mysqli_num_rows un peu partout n'est pas des plus efficace, cette fonction est lourde lorsque le résultat d'une requête contient beaucoup de lignes. Il faudrait mieux exploiter la fonction count() de mysql.

J'ai modifié pas mal de pages d'admin avec ce genre de choses
Code:
$res = grr_sql_query("SELECT area_name, access FROM ".TABLE_PREFIX."_area WHERE id=$id_area"); if (!$res) { fatal_error(0, grr_sql_error()); } $sqlcount = "SELECT count(*) as num FROM ".TABLE_PREFIX."_area WHERE id=$id_area"; $rescount = grr_sql_query($sqlcount); if (grr_count_rows($rescount) == 1)
la fonction grr_count_rows est renvoie simplement le contenu de la variable "num" de la requête.

Et sans vouloir offenser les dév de ce produit, je pense que la totalité du code est à revoir au propre, il y a beaucoup de boucles à optimiser et structure à revoir. Certaines parties de code ont du français, d'autres de l'anglais, les indentations diffèrent d'un fichier à l'autre, etc.
Dernière édition: il y a 4 ans 6 mois par Yan.

Connexion ou Créer un compte pour participer à la conversation.

  • Yan
  • Developpeur GRR
  • Developpeur GRR
Plus d'informations
il y a 4 ans 6 mois #2240 par Yan
Réponse de Yan sur le sujet Erreurs php et autres améliorations
Bonjour,
merci pour vos remarques. J’ai bien conscience qu’il y a de nombreuses améliorations à apporter au code de GRR.
Sur quelle version avez-vous travaillé ?
Si vous voulez contribuer de manière active, je vous encourage à ouvrir un compte Github, de suivre les corrections et améliorations, enfin de déposer des pull requests compatibles avec les évolutions de GRR.
Cordialement,
YN

Connexion ou Créer un compte pour participer à la conversation.

Modérateurs: Yan