Optimisation du code

Signaler
Messages postés
83
Date d'inscription
jeudi 27 juillet 2006
Statut
Membre
Dernière intervention
28 novembre 2010
-
Messages postés
83
Date d'inscription
jeudi 27 juillet 2006
Statut
Membre
Dernière intervention
28 novembre 2010
-
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

Messages postés
83
Date d'inscription
jeudi 27 juillet 2006
Statut
Membre
Dernière intervention
28 novembre 2010

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
Messages postés
1423
Date d'inscription
mardi 14 décembre 2004
Statut
Membre
Dernière intervention
29 décembre 2012
4
  $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
Messages postés
83
Date d'inscription
jeudi 27 juillet 2006
Statut
Membre
Dernière intervention
28 novembre 2010

tu peux me donner la conséquence exact de cette requete car ya un bout que je comprend pas.
Messages postés
1423
Date d'inscription
mardi 14 décembre 2004
Statut
Membre
Dernière intervention
29 décembre 2012
4
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
Messages postés
83
Date d'inscription
jeudi 27 juillet 2006
Statut
Membre
Dernière intervention
28 novembre 2010

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.
Messages postés
1423
Date d'inscription
mardi 14 décembre 2004
Statut
Membre
Dernière intervention
29 décembre 2012
4
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
Messages postés
83
Date d'inscription
jeudi 27 juillet 2006
Statut
Membre
Dernière intervention
28 novembre 2010

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.
Messages postés
10840
Date d'inscription
lundi 24 février 2003
Statut
Modérateur
Dernière intervention
2 mars 2010
23
Hello,

tu m'étonnes...c'est pas explode(), mais implode().
Ceci dit, à bencher, car IN est très lent...
Messages postés
318
Date d'inscription
mardi 27 mai 2003
Statut
Membre
Dernière intervention
11 mars 2010
1
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
Messages postés
83
Date d'inscription
jeudi 27 juillet 2006
Statut
Membre
Dernière intervention
28 novembre 2010

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.
Messages postés
10840
Date d'inscription
lundi 24 février 2003
Statut
Modérateur
Dernière intervention
2 mars 2010
23
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
Messages postés
83
Date d'inscription
jeudi 27 juillet 2006
Statut
Membre
Dernière intervention
28 novembre 2010

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.