Optimisation de requete

Signaler
Messages postés
31
Date d'inscription
mardi 10 août 2004
Statut
Membre
Dernière intervention
23 juin 2009
-
Messages postés
9433
Date d'inscription
mardi 9 octobre 2001
Statut
Membre
Dernière intervention
13 avril 2007
-
salut à tous,

je débute en php et remercie d'avance les personnes souhaitant m'aider !! 8)

bon... je fais une requete sur ma table (ça marche) mais c'est long à s'afficher car mon code ne doit pas être top !!

J'ai une colonne "type d'appareil" (ampli, enceinte) et une autre "genre" (hifi, home cinéma). Je voudrais afficher une page "MATOS" avec les "ampli hifi" puis les "ampli home cinema" et pareil avec les "enceintes".

Vaut-il mieux faire une requete pour chaque chose, comme c'est le cas pour ma page, exemple :

SELECT * FROM table WHERE type=ampli AND genre=hifi AND marque ='$mark'
echo...
SELECT * FROM table WHERE type=ampli AND genre=home cinema AND marque ='$mark'
echo...

ou alors faire une requete de ce type :

$listype=Array("AMPLI","ENCEINTE");
$listgenre=Array("HiFi","Home Cinema");
for($j=0;$j<sizeof($listype);$j++) {
for($k=0;$k<sizeof($listgenre);$k++) {
$sql = "SELECT * FROM table WHERE type='$listype[$j]' AND genre='$listgenre[$k]' AND marque ='$mark' ";
$resultat = mysql_query ($sql);

while ($affiche= mysql_fetch_array ($resultat)) {
$type = $affiche['type'];
$genre = $affiche['genre'];
$marque = $affiche['marque'];
$modele = $affiche['modele'];
echo $marque
echo $genre ... etc ...

J'ai l'impression que ma première solution est basic mais plus rapide ??? Qu'en pensez vous !!!

20 réponses

Messages postés
57
Date d'inscription
mercredi 25 août 2004
Statut
Membre
Dernière intervention
18 avril 2005

Salut !

Ah mon avis, préfère la première soltion, elle est beaucoup plus simple, et au moins tu boucle pas :) Mais le résultat reste le même, tu utilisera autant de requêtes, choisi donc la simplicité !

Avis personnel ;)

bLiNkSeB - Anciennement sebastienbro
Messages postés
31
Date d'inscription
mardi 10 août 2004
Statut
Membre
Dernière intervention
23 juin 2009

merci blinkseb, ;)

apparement j'me suis pas trop mal expliqué puisque tu as compris ma question !!

Je pense également qu'il est plus simple de faire plusieurs requêtes plutôt qu'une seule, impliquant la gestion de l'affichage ensuite.

Est ce qu'il existe un moyen de tester la vitesse d'affichage d'une page (par script ou soft), mis à part son poids en octet ??

merci encore 8)
Messages postés
57
Date d'inscription
mercredi 25 août 2004
Statut
Membre
Dernière intervention
18 avril 2005

Y'a une méthode toute simple :)

Tu prend l'heure au début du script, avec les millisecondes, ensuite reprendr l'heure à la fin, toujours avec les millisecondes, tu soustraits, et t'a le temps d'exécution de la page :)

bLiNkSeB - Anciennement sebastienbro
Messages postés
31
Date d'inscription
mardi 10 août 2004
Statut
Membre
Dernière intervention
23 juin 2009

c'est vrai que c'est pas compliqué, j'ai même pas cherché, la question met venu comme ça !! xcuze me !!

tu fais ça avec un script genre :

$time1 = date("H:i");
.....
.....
$time2 = date("H:i");
// puis la soustraction
$result =$time2-$time1;
echo"$result";
Messages postés
57
Date d'inscription
mercredi 25 août 2004
Statut
Membre
Dernière intervention
18 avril 2005

Voilà comment faire (exemple pris sur ce site :))


function getmicrotime(){
    list($msec,$utime)=explode(" ",microtime());
    return($utime+$msec);
    }

//deuxieme fonction qui renvoie la difference
function process_time($time_start, $time_end){
    return substr(($time_end - $time_start),0,7);
    }

Tu fais donc :

$heure1 = getmicrotime();

...

$heure2 = getmicrotime();

echo process_time($heure1, $heure2);



Voilà !

bLiNkSeB - Anciennement sebastienbro
Messages postés
31
Date d'inscription
mardi 10 août 2004
Statut
Membre
Dernière intervention
23 juin 2009

thank's a lot !!! :)

j'avais bien compris (mais syntaxe était pas là)
bon, j'vais tester tout ça

merci encore
tchao
Messages postés
282
Date d'inscription
vendredi 16 mai 2003
Statut
Membre
Dernière intervention
19 juillet 2006

si tu cherche a optimiser a mort ta requete sql, vu que tu interroge toujours la meme table (aparamen...) tu n'as qu'a tout récuperer d'un coup, en 1 seule requete SQL, puis tu gères ton affichage a coup de tableau... c + rapide 1 grosse requete SQL que plein de petite!
par contre ca te demande de jongler avec des tableaux, ca te donnerait kelke chose du genre:
$tab['listype']['listgenre']="...";
tu aurais un tableau bi-dimensionnel où la 1° case correspond à tous tes type et la 2° à tous tes genre...
perso, j'utilise ca mais pour un système ayant à gérer 1 tableau de 20 par 30 environ, soit 600 requêtes SQL si j'utilise la méthode simpl...
Mais de la facon que je te propose, je n'ai qu'une requete SQL pour mes 600 cases ("SELECT * FROM table" vu qu'au final j'utilise toute la table), et ensuite a moi de bien gérer mes tableaux, ce qui n'est pas simple si on ne connait pas les possibilités des tableaux(tris, indexation...)
Messages postés
31
Date d'inscription
mardi 10 août 2004
Statut
Membre
Dernière intervention
23 juin 2009

yo windu

un grand merci pour ton aide !! 8)

par contre je n'est pas le nivo pour bien comprendre ton systeme
de tablo ( $tab['listype']['listgenre']="..."; )

si tu avais un ptit exemple (script) plus ou moins concret celà me serais plus compréhensible, si c'est pas trop t'en demander !!
mais bien c'est ce que je pensais, vaut mieux une bonne requete que plusieurs !!

est il essenciel de fermer la connexion à la base en fin de page ??? ( mysql_close() )
Messages postés
60
Date d'inscription
mercredi 9 juillet 2003
Statut
Membre
Dernière intervention
3 septembre 2004

Pour éviter d'avoir une charge trop importante sur ton serveur, il vaut mieux ouvrir la connection juste avant de lancer ta requete et la fermer juste apres.

Une bonne programmation c'est avant tout une bonne analyse. :)
Messages postés
31
Date d'inscription
mardi 10 août 2004
Statut
Membre
Dernière intervention
23 juin 2009

merci korrox 8)
Messages postés
282
Date d'inscription
vendredi 16 mai 2003
Statut
Membre
Dernière intervention
19 juillet 2006

Korrox a raison:il vaut mieux ouvrir la connexion dès que nécessaire et la refermer tout de suite après... ca évite de surcharger inutilement.
Pour l'exemple de tableau bi-dimensionnel voila un bout de code où j'y ai eu recours:
for($k=0;$k<count($this->tab_pole);$k++)
{
$this->tableau_final.="<td>".$this->tab_pole[$k]['nom_pole']."</td>";
}

en fait cela boucle dans mon tableau. voila a quoi le tableau $this->tab_pole ressemble:

Array
(
[0] => Array
(
[id_pole] => 1
[nom_pole] => Pole scientifique
[id_section] => 3
)

[1] => Array
(
....
)
en fait, j'obtiens un tbaleau dont chaque case est un autre tableau...
je peux afficher toutes les cases en utilisant de 2 boucles for imbriquées l'une dans l'autre

Que la Force soit avec toi, Jeune Padawan!!!
Messages postés
31
Date d'inscription
mardi 10 août 2004
Statut
Membre
Dernière intervention
23 juin 2009

aïe, ça va pas être facile !!

j'ai commencé à me renseigner sur les tablo bidimentionnel
(j'commence à comprendre >> un peu com mon deuxième exemple du départ)

par contre ton exemple ne m'aide pas bokoo !! j'comprend rien car suis un peu nul !! si tu pouvais me fournir une url de forum ou tuto ou encore un bout de script plus complet !!

comment récupérer les valeurs de la base dans un array ??
Messages postés
9433
Date d'inscription
mardi 9 octobre 2001
Statut
Membre
Dernière intervention
13 avril 2007
9
Salut !

Normal que ce soit long, tu fais autant de requêtes que tu as d'éléments, peux tu nous donner la structure de ta table stp qu'on puisse t'aider ?

Merci
Messages postés
31
Date d'inscription
mardi 10 août 2004
Statut
Membre
Dernière intervention
23 juin 2009

merci d'intervenir Anthomicro

en fait, j'ai une base avec plein de produits HiFi (ampli, enceinte, chaine...).
J'ai donc créée une base avec 7 colonnes (type, genre, marque, modele, ...)

Si vous voulez voir où j'en suis, le site que je développe pour un ami est ici : www.derouet.fr

mais comme vous pourrez le constater, y'a encore du boulot et j'essaye de faire ça au mieux bien que je ne sois pas un pro !!!
Messages postés
282
Date d'inscription
vendredi 16 mai 2003
Statut
Membre
Dernière intervention
19 juillet 2006

voici quelques adresses sur les tableaux en PHP:

http://phpdebutant.org/article11.php
http://www.nexen.net/docs/php/annotee/function.array.php

pour récupérer les données de ta base dans un tableau il te suffit de faire:
while($data=mysql_fetch_array($link,$id_connexion))
{
$tab[]=$list;
}

tu créeras ainsi un tableau '$tab' avec dans chaque case, un tableau correspondant à une ligne renvoyée par la Base de données.
voial ce que ca te donnera:
Array
(
[0] => Array
(
[type] => ...
[genre] => ...
[marque] => ...
)
Ainsi si tu désires la marque se trouvant dans la 3° ligne de ta BDD, tu fais:
$MarqueLigne3=$tab[2]['marque'];
(le 2 n'est pas une erreur: un tableau commence par la case 0 et non par 1... en PHP du moins, après ca peut varier d'un langage à un autre il me semble)
Messages postés
31
Date d'inscription
mardi 10 août 2004
Statut
Membre
Dernière intervention
23 juin 2009

merci beaucoup windu

je vais me pencher sur toutes ces infos et faire chauffer mes neurones !!

C'est vraiment sympa à tous de me filer un coup de main car le PHP j'connais pas très bien (moa c'est plutôt Flash et Photoshop) et j'me suis proposé d'aider un pote à faire le site de son magasin. Mais j'vais finir par m'en sortir grâce à vous tous.

BIG UP à tous les progs :)
Messages postés
282
Date d'inscription
vendredi 16 mai 2003
Statut
Membre
Dernière intervention
19 juillet 2006

De rien, lookoom...
C'est le but de cette section et même de ce site! on a tous été débutants et on a tous passé des heures sur des forums ou des tutoriaux afin de comprendre et de s'améliorer..
Alors les types qui te disent:"Y font ch*** ces newbies, peuvent pas se démmerder par eux-mêmes???" ce sont justes des types qui ont oubliés qu'au début ils étaient comme toi!!

Attention:Ca ne vise personne en particulier... mais si certains se sentent vexés par ma remarque, qu'ils se remettent en question!
Messages postés
282
Date d'inscription
vendredi 16 mai 2003
Statut
Membre
Dernière intervention
19 juillet 2006

P.S.: bon courage pour ton site!!!
Messages postés
31
Date d'inscription
mardi 10 août 2004
Statut
Membre
Dernière intervention
23 juin 2009

salut à tous,

j'ai bien compris comment stocker le résultat de ma requete unique dans un tablo mais j'sais pas trop comment gérer l'affichage !! j'ai réussi à faire quelque chose mais la technique me parait nulle.
$req "SELECT * FROM table WHERE type'Ampli';
$res = mysql_query($req);

while($data = mysql_fetch_assoc($res))
{
$tablo[]=$data;
}
$nb=count($tablo);

function AFFICHE($status,$nb,$tablo){

for($i=0;$i<$nb;$i++){
$valeur1=$tablo[$i]['type'];
$valeur2=$tablo[$i]['genre'];
$valeur3=$tablo[$i]['marque'];
$valeur4=$tablo[$i]['modele'];

if ($valeur2=="$status"){
echo...}
}
}
// fin de fonction

Ensuite j'appelle ma fonction AFFICHE pour chaque genre d'Ampli (HiFi, Home Cinema et Préampli), ce qui fait une boucle "for" à chaque fois !! pas terrible !!
Y'a surement moyen de travailler sur mon tablo (trie) avec quelques fonctions (array_...) mais j'ai po trouvé !!! Si qqu'un a un exemple, une piste !! 8)
Messages postés
9433
Date d'inscription
mardi 9 octobre 2001
Statut
Membre
Dernière intervention
13 avril 2007
9
Si tu veux trier un tableau penches toi du côté de la fonction array_multisort()

a ++

http://www.vulgarisation-informatique.com : entraide, dépannage et vulgarisation informatique