Optimisation du code

azqsazqs Messages postés 83 Date d'inscription jeudi 27 juillet 2006 Statut Membre Dernière intervention 28 novembre 2010 - 29 avril 2008 à 14:27
azqsazqs Messages postés 83 Date d'inscription jeudi 27 juillet 2006 Statut Membre Dernière intervention 28 novembre 2010 - 30 avril 2008 à 09:15
bonjour,

j'ai un code que je trouve lent, j'aimerais l'accélérer un peu. je l'ai rétréci autant que le pouvais, mais je suis sur qu'il reste des abérations.

<?php
//affichage utilisateurs actifs
$rang = array('rang1','rang2','rang3');
foreach($rang as $rank)
{
echo "".ucfirst($rank)."
\r";
    echo "\r\";
    //ligne de tete
    echo \"----
\r\";
    mysql_connect(\"$server\", \"$login\",\"$pass\") or die(mysql_error());
    mysql_select_db(\"$database\")  or die(mysql_error());
    $resQuery = mysql_query(\"SELECT * FROM users WHERE etat_compte='$rank'\") or die(mysql_error());
    $fields = mysql_num_fields($resQuery);
    mysql_close();
    $i = 0;
    $liste_champs = NULL;
    while ($i < $fields)
    {
        $nom_champs = mysql_field_name($resQuery, $i);
        $nom_ch[$i] = $nom_champs;
        echo \"".$nom_champs.", \r\";
        $liste_champs .= $nom_champs;
        if($i != $fields-1)
        {
        $liste_champs .= ';';
        }
        $i++;
    }
    echo \"\r\";
    $liste_champs = explode(\";\",$liste_champs);
   
    //les inscrits
    echo \"----
\r\";
    mysql_connect(\"$server\", \"$login\",\"$pass\") or die(mysql_error());
    mysql_select_db(\"$database\")  or die(mysql_error());
    $resQuery = mysql_query(\"SELECT * FROM users WHERE etat_compte='$rank'\") or die(mysql_error());
    $fields = mysql_num_fields($resQuery);
    mysql_close();
    while ($donnees = mysql_fetch_array($resQuery))
    {
        foreach($liste_champs as $champs)
        {
            echo \"".$donnees[$champs].", \";
        }
    }
    echo \"\r\";
    echo "
\r";
}
?>

comment améliorer ce code

12 réponses

azqsazqs Messages postés 83 Date d'inscription jeudi 27 juillet 2006 Statut Membre Dernière intervention 28 novembre 2010
29 avril 2008 à 15:18
comme toujours j'oublie l'essentiel:

ce code à pour but de faire un tableau différent pour chaque valeur du champ etat_compte seulement si au moins une ligne de la table à cette valeur.

merci
0
Teclis01 Messages postés 1423 Date d'inscription mardi 14 décembre 2004 Statut Membre Dernière intervention 29 décembre 2012 4
29 avril 2008 à 15:46
  $resQuery = mysql_query("SELECT * FROM users WHERE etat_compte='$rank'") or die(mysql_error());

  $resQuery = mysql_query("SELECT * FROM users WHERE etat_compte IN(".explode(',',$rang).')') or die(mysql_error());
 
Sépare mécanique et affichage...
Il vaut mieux poser une question et passer pour bête que le rester toute sa vie

 Les geeks n'ont pas une case en moins ils commencent juste à compter à partir de zéro
0
azqsazqs Messages postés 83 Date d'inscription jeudi 27 juillet 2006 Statut Membre Dernière intervention 28 novembre 2010
29 avril 2008 à 15:49
tu peux me donner la conséquence exact de cette requete car ya un bout que je comprend pas.
0
Teclis01 Messages postés 1423 Date d'inscription mardi 14 décembre 2004 Statut Membre Dernière intervention 29 décembre 2012 4
29 avril 2008 à 16:53
ca ne fait plus n requetes correspondant au nombre d itération du foreach

Il vaut mieux poser une question et passer pour bête que le rester toute sa vie

 Les geeks n'ont pas une case en moins ils commencent juste à compter à partir de zéro
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
azqsazqs Messages postés 83 Date d'inscription jeudi 27 juillet 2006 Statut Membre Dernière intervention 28 novembre 2010
29 avril 2008 à 17:00
donc si je fait la requete directement dans un while, il me fera autant de tableau différent que de valeur de etat_compte différent ?

si oui, affiche t'il une ligne en-tete à chaque tableau

----------------------------------------------------------------------------
Il y a 10 types de personnes dans le monde, ceux qui comprennet le binaire et les autres.
0
Teclis01 Messages postés 1423 Date d'inscription mardi 14 décembre 2004 Statut Membre Dernière intervention 29 décembre 2012 4
29 avril 2008 à 17:15
le but est de faire 1 requete... dans n fois la loop du while ...

Il vaut mieux poser une question et passer pour bête que le rester toute sa vie

 Les geeks n'ont pas une case en moins ils commencent juste à compter à partir de zéro
0
azqsazqs Messages postés 83 Date d'inscription jeudi 27 juillet 2006 Statut Membre Dernière intervention 28 novembre 2010
29 avril 2008 à 18:52
je suis largué, j'ai mis:

<?php
    echo "\r\";
    $rang = array('admin','actif','en attente');
    mysql_connect(\"$server\", \"$login\",\"$pass\") or die(mysql_error());
    mysql_select_db(\"$database\")  or die(mysql_error());
    $resQuery = mysql_query(\"SELECT * FROM users WHERE etat_compte IN(\".explode(',',$rang).')') or die(mysql_error());
    $fields = mysql_num_fields($resQuery);
    mysql_close();
    while ($donnees = mysql_fetch_array($resQuery))
    {
        echo \"----
\r\";
        foreach($liste_champs as $champs)
        {
            echo \"".$donnees[$champs].", \";
        }
        echo \"\r\";
    }
   
    echo "
\r";
?>

mais ca bug et je vois pas comment résoudre le probleme

----------------------------------------------------------------------------
Il y a 10 types de personnes dans le monde, ceux qui comprennet le binaire et les autres.
0
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
29 avril 2008 à 19:27
Hello,

tu m'étonnes...c'est pas explode(), mais implode().
Ceci dit, à bencher, car IN est très lent...
0
gibozsec Messages postés 318 Date d'inscription mardi 27 mai 2003 Statut Membre Dernière intervention 11 mars 2010
29 avril 2008 à 20:31
Malalam>

Utiliser 'champ LIKE valeur1 OR champ LIKE valeur2 OR champ LIKE valeur3...'   est plus rapide que 'champ IN (valeur1,valeur2,valeur3)' ?

C'est pour n'importe quelle requête ou ça dépend du nombre de valeurs ?

azqsazqs> Tu peux mettre les connexions à la db en debut de fichier plutot que te connecter/deconnecter à chaque requête.

Tu fais des requetes pour le nom des champs en récupérant toute une liste d'enregistrements, tu peux utiliser "
SHOW COLUMNS
" à la place si tu utilise mysql(http://dev.mysql.com/doc/refman/5.0/fr/show-columns.html).

Grrrrrrrrrrr
0
azqsazqs Messages postés 83 Date d'inscription jeudi 27 juillet 2006 Statut Membre Dernière intervention 28 novembre 2010
29 avril 2008 à 20:35
heu...

ya moyen d'avoir une application concréte avec les LIKE ou IN.

pour ma connection db, je ai toujours fait comme ca car j'acais dans l'idée qu'on pouvait pas encahiner les requetes.

et je sais pas utiliser SHOW COLUMNS, j'vais déjà tenté, mais ca avait foiré.

je vais toutefois me rensigner sur ca.

----------------------------------------------------------------------------
Il y a 10 types de personnes dans le monde, ceux qui comprennet le binaire et les autres.
0
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
29 avril 2008 à 22:59
LIKE ne sert pas à la même chose, LIKE, c'est plutôt pour utiliser des jokers, quand tu n'es pas certain de l'exactitude de la chaîne que tu comparas à un champ.
Et LIKE est très lent aussi.
Non, si tu es sûr des valeurs exactes, utilise IN.Au niveau du nombre de valeur, de toute manière, une requête est limité en taille. Cette taille dépend du serveur DB utilisé. Mais que ce soit une série de LIKE ou un gros IN? c'est pareil. On gagne juste un peu de caractères avec un IN, évidemment. Mais, encore une fois, ça ne sert pas à la même chose. IN équivaut à ... OR ... OR = ... etc
0
azqsazqs Messages postés 83 Date d'inscription jeudi 27 juillet 2006 Statut Membre Dernière intervention 28 novembre 2010
30 avril 2008 à 09:15
J'ai réussi à rendre le code un peu plus rapide et popre, mais je n'arrive pas a extraire les noms des champs de manière correct:

<?php
//extraction des noms de champs
$ligne_en_tete = NULL;
$liste_champs = NULL;
mysql_connect("$server", "$login","$pass") or die(mysql_error());
mysql_select_db("$database")  or die(mysql_error());
$resQuery = mysql_query("SELECT * FROM users") or die(mysql_error());
$fields = mysql_num_fields($resQuery);
$i = 0;
while ($i < $fields)
{
    $nom_champs = mysql_field_name($resQuery, $i);
    $nom_ch[$i] = $nom_champs;
    $ligne_en_tete .= '<td>'.$nom_champs.'</td>';
    $liste_champs .= $nom_champs;
    if($i != $fields-1)
    {
    $liste_champs .= ';';
    }
    $i++;
}
$champs = explode(';',$liste_champs);
   
//affichage des tableau
$vieux = NULL;
$i = 0;
$resQuery = mysql_query("SELECT * FROM users") or die(mysql_error());
mysql_close();
while ($donnees = mysql_fetch_array($resQuery))
{
    $rang = $donnees['etat_compte'];
    if($rang != $vieux)
    {
        if($i != 0)
        {
        echo "</table>\r";
        }
    echo "".ucfirst($rang)."
\r";
    echo "\r\";
    echo \"----
\".$ligne_en_tete.\"\r\";
    $i++;
    }
    $vieux = $rang;
    echo \"----
\r\";
        foreach($champs as $nom)
        {
        echo \"".$donnees[$nom].", \";
        }
    echo \"\r\";
}

echo "
\r";
?>

----------------------------------------------------------------------------
Il y a 10 types de personnes dans le monde, ceux qui comprennet le binaire et les autres.
0
Rejoignez-nous