Précédent   Forum des professionnels en informatique > PHP > PHP & SGBD > PHP & MySQL
PHP & MySQL Forum d'entraide sur les fonctions MySQL avec PHP. Avant de poster -> FAQ MySQL, Cours MySQL et Sources MySQL. Pour les questions concernant le moteur MySQL plutôt que les fonctions PHP, merci d'utiliser le forum MySQL.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 06/06/2011, 15h42   #1
Futur Membre du Club
 
Homme
Développeur Web
Inscription : novembre 2007
Messages : 185
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : novembre 2007
Messages : 185
Points : 15
Points : 15
Par défaut Optimisation affichage d'un query

Bonjour à tous,

Je voudrais afficher pour chaque abonné les options qu'il posséde:

Pour cela j'ai une requête:
Code :
1
2
 
$rq_cpt3=odbc_do($conn,"SELECT DISTINCT E7B8ZC,DYEVZE from osm_option   ");
Je voudrais quelqu'chose du genre :

abone1 : option15,option16,option22,option05,

abone2 : option07,option16,option14,option03,

etc

J'ai reussi a arrivé à ce resultat mais le temps d'éxécution et beaucoup trop long : notament du fait que j'éxécute une requete dans une boucle while:

Voici comment je fais:
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
 
//boucle pour afficher les abonné en ligne						
echo"<table border=1> ";
$abonne="";
while($ligne=odbc_fetch_array($rq_cpt3))
{
if(($abonne=="") || ($abonne!=$ligne['abonne']))
{
$abonne=$ligne['abonne'];
$rq=odbc_do($conn,"SELECT DISTINCT abonne,option from osm_option where abonne='$abonne' ");
$cpt=odbc_num_rows($rq);
 
echo"<tr><td>" .$abonne;
for ($i=0;$i<$cpt;$i++)
{ 
$uneligne=odbc_fetch_array($rq);
echo "<td>"$uneligne['option']; 
}
echo"</tr>";
}
$abonne=$ligne['abonne'];
}				
echo" </table>";
Je sais ce n'est pas trés jolie
Quelqu'un saurait-il comment optimiser tout ça ?
Merci d'avance
kamnouz est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/06/2011, 15h56   #2
Membre éclairé
 
Homme Jérémy
Étudiant
Inscription : octobre 2009
Messages : 236
Détails du profil
Informations personnelles :
Nom : Homme Jérémy
Localisation : France

Informations professionnelles :
Activité : Étudiant
Secteur : High Tech - Produits et services télécom et Internet

Informations forums :
Inscription : octobre 2009
Messages : 236
Points : 322
Points : 322
Pourquoi dans ton SELECT tu met abonne ? Tu cherche juste à retourner les options donc
Code :
SELECT option from osm_option where abonne='$abonne'
Et tu les met dans une collection.
gwharl est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/06/2011, 16h02   #3
Futur Membre du Club
 
Homme
Développeur Web
Inscription : novembre 2007
Messages : 185
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : novembre 2007
Messages : 185
Points : 15
Points : 15
Mais puisque dans ma clause WHERE je mets abonne='$abonne' je suis obligé de le mettre dans le select sinon j'ai une erreur.

Mais n'y a t-il pas une autre methode moin lourd d'afficher :

abone1 : option15,option16,option22,option05,

abone2 : option07,option16,option14,option03,


?
kamnouz est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/06/2011, 16h10   #4
Membre éclairé
 
Homme Jérémy
Étudiant
Inscription : octobre 2009
Messages : 236
Détails du profil
Informations personnelles :
Nom : Homme Jérémy
Localisation : France

Informations professionnelles :
Activité : Étudiant
Secteur : High Tech - Produits et services télécom et Internet

Informations forums :
Inscription : octobre 2009
Messages : 236
Points : 322
Points : 322
C'est faux, tu n'est pas obligé d'affiché une valeur sur laquelle tu fait une exception, pas besoin du DISTINCT non plus car tu n'as "normalement" pas de redondance d'option pour un abonné.
gwharl est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/06/2011, 16h24   #5
Futur Membre du Club
 
Homme
Développeur Web
Inscription : novembre 2007
Messages : 185
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : novembre 2007
Messages : 185
Points : 15
Points : 15
Merci de ces petits conseil gwharl, mais cela ne resoud pas mon problème d'optimisation
kamnouz est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/06/2011, 16h25   #6
Membre du Club
 
Homme
Développeur Web
Inscription : avril 2011
Messages : 36
Détails du profil
Informations personnelles :
Sexe : Homme

Informations professionnelles :
Activité : Développeur Web
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : avril 2011
Messages : 36
Points : 55
Points : 55
Tu pourrais ne faire qu'une seule requête et trier le résultat, par exemple :
Code :
SELECT DISTINCT abonne,option from osm_option where abonne IN ('abone1', 'abonne2', etc ...);
Ce qui pourrait donner (attention je n'ai pas testé)
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
// On récupère tous les abonnés
$abonnes = array();
while($ligne=odbc_fetch_array($rq_cpt3))
{
	if(!in_array($ligne['abonne']))
	{
		$abonnes[]=$ligne['abonne'];
	}
}
 
// On récupère les options des abonnés recherchés
$rq=odbc_do($conn, "SELECT DISTINCT abonne,option from osm_option where abonne IN ('".implode("','", $abonnes)."') ");
$cpt=odbc_num_rows($rq);
 
// On groupes les options par abonné
$aboneOptions = array();
for ($i=0;$i<$cpt;$i++)
{ 
	$uneligne=odbc_fetch_array($rq);
	$aboneOptions[$ligne['abonne']][] = $uneligne['option'];
}
 
 
//boucle pour afficher les abonnés en ligne						
echo"<table border=1> ";
	for($aboneOptions as $abone => $options) {
		echo "\t<tr>\n\t\t<td>$abone</td>";
		for($options as $o) {
			echo "\n\t\t<td>$o</td>";
		}
		echo "\n\t</tr>";
	}
echo" </table>";
EDIT : tu pourrais même faire faire le trie des options par le SGBD en utilisant GROUPE BY
westdigit est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/06/2011, 16h43   #7
Futur Membre du Club
 
Homme
Développeur Web
Inscription : novembre 2007
Messages : 185
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : novembre 2007
Messages : 185
Points : 15
Points : 15
Merci westdigit pour ta réponse

J'ai une erreur de syntaxe à ce niveau la :
Code :
1
2
 
for($aboneOptions as $abone => $options) {
kamnouz est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/06/2011, 16h49   #8
Membre du Club
 
Homme
Développeur Web
Inscription : avril 2011
Messages : 36
Détails du profil
Informations personnelles :
Sexe : Homme

Informations professionnelles :
Activité : Développeur Web
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : avril 2011
Messages : 36
Points : 55
Points : 55
Ah oui dsl, remplace les deux for par des foreach
(ca c'est à force de passer du java au php ^^)
westdigit est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/06/2011, 17h21   #9
Futur Membre du Club
 
Homme
Développeur Web
Inscription : novembre 2007
Messages : 185
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : novembre 2007
Messages : 185
Points : 15
Points : 15
Effectivement sa marchemieu avec foreach !

Par contre j'ai une autre erreur:
Code :
1
2
3
4
5
6
7
8
9
10
11
 
$rq_cpt3=odbc_do($conn,"SELECT E7B8ZC from osm_option group by E7B8ZC  ");
// On récupère tous les abonnés
$abonnes = array();
while($ligne=odbc_fetch_array($rq_cpt3))
{
	if(!in_array($ligne['E7B8ZC']))
	{
		$abonnes[]=$ligne['E7B8ZC'];
	}
}
Ligne de l'erreur:
Code :
1
2
 
if(!in_array($ligne['E7B8ZC']))
erreur:
Code :
1
2
 
in_array() expects at least 2 parameters, 1 given
kamnouz est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/06/2011, 17h28   #10
Membre éclairé
 
Homme Jérémy
Étudiant
Inscription : octobre 2009
Messages : 236
Détails du profil
Informations personnelles :
Nom : Homme Jérémy
Localisation : France

Informations professionnelles :
Activité : Étudiant
Secteur : High Tech - Produits et services télécom et Internet

Informations forums :
Inscription : octobre 2009
Messages : 236
Points : 322
Points : 322
Traduction : 2 paramètres requis, 1 donné.

http://php.net/manual/fr/function.in-array.php
gwharl est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/06/2011, 18h12   #11
Membre du Club
 
Homme
Développeur Web
Inscription : avril 2011
Messages : 36
Détails du profil
Informations personnelles :
Sexe : Homme

Informations professionnelles :
Activité : Développeur Web
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : avril 2011
Messages : 36
Points : 55
Points : 55
oups faut que j'aille dormir un peu ^^

Code :
if(!in_array($ligne['abonne'],$abonnes))
westdigit est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/06/2011, 09h38   #12
Futur Membre du Club
 
Homme
Développeur Web
Inscription : novembre 2007
Messages : 185
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : novembre 2007
Messages : 185
Points : 15
Points : 15
Merci pour ces petites corrections

Par contre mes options s'affichent mais pas mes abonnés

Code :
1
2
3
4
5
6
7
8
9
10
 
echo"<table border=1> ";
foreach($aboneOptions as $abone=>$options) {
echo "<tr><td>$abone</td>";
foreach($options as $o) {
echo "<td>$o</td>";
}
echo "</tr>";
}
echo" </table>";
kamnouz est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/06/2011, 10h31   #13
Futur Membre du Club
 
Homme
Développeur Web
Inscription : novembre 2007
Messages : 185
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : novembre 2007
Messages : 185
Points : 15
Points : 15
J'ai trouvé en faite l'erreur se trouve au moment ou je rempli mon tableau à deux dimension:
Code :
1
2
3
4
5
6
7
8
 
// On groupes les options par abonné
$aboneOptions = array();
for ($i=0;$i<$cpt;$i++)
{ 
$uneligne=odbc_fetch_array($rq);
$aboneOptions[$ligne['abonne']][] = $uneligne['option'];
}
A la place de :
Code :
1
2
 
$aboneOptions[$ligne['abonne']][] = $uneligne['option'];
J'ai mis ça :
Code :
1
2
 
$aboneOptions[$uneligne['abonne']][] = $uneligne['option'];
Mon fetch_array est stocké dans $uneligne et non pas dans $ligne
kamnouz est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 19h03.


 
 
 
 
Partenaires

Hébergement Web