8792 sujets

Développement web côté serveur, CMS

Salut,
j'ai un script php mysql et je voudrais l'optimiser pour qu'il ne fasse appel qu'une fois à la bdd, c'est à dire que l'appel de la bdd ne se fasse pas dans la boucle while.

Mon script sert à calculer le nombre de pages vues et de visiteurs par mois.
Ma table stats est composée des champs suivants : id, mois, visiteurs, page1, page2, page3.

Voici mon code :
$requete = mysql_query('SELECT id, mois, visiteurs, page1, page2, page3 FROM stats ORDER BY id') or die(mysql_error());
$k = 0;
while ($donnees = mysql_fetch_array($requete))
	{
	$id = $donnees['id'];
	$moisvisites[$k] = $donnees['mois']; 
	$nbvisiteurs[$k] = $donnees['visiteurs'];
	$reponse = mysql_query("SELECT SUM(page1+page2+page3) AS total FROM stats WHERE id='$id'") or die(mysql_error());
	$resultat = mysql_fetch_array($reponse);
	$nbpages[$k] = $resultat['total'];
	$k++;
	}


Si quelqu'un avait une idée pour une seule requête en dehors de la boucle while, svp !
Merci
Modifié par telecofr (09 Feb 2007 - 13:05)
Salut,

L'intitulé de ce salon est « Standards web et langages serveurs », et non pas uniquement « Langages serveurs ». Il s'agit donc avant tout de questions sur la manière de produire des sites standards en utilisant les langages serveurs, et pas d'assistance généraliste sur tel ou tel langage.

Je laisse ce sujet ouvert au cas où quelqu'un te réponde, mais je te conseille fortement d'aller exposer ton problème sur un forum spécialisé PHP, par exemple. Smiley smile

D'autre part, je remarque que certain des sujets que tu as ouverts sur ce forum n'ont pas été marqués comme résolus. Merci de t'en occuper. Smiley smile
Salut,
alors comme ça à vu de nez je dirais un truc dans le genre:

SELECT
	id,
	mois,
	visiteurs,
	page1,
	page2,
	page3,
	(SELECT SUM(page1+page2+page3) FROM stats AS sbis WHERE s.id=sbis.id) AS total
FROM
	stats AS s
ORDER BY
	id;

mais j'ai pas testé ...
en espérant que ça t'aide Smiley cligne
super ca marche !
Merci Francois44. Smiley cligne

Par contre, pourrais tu m'expliquer comment fonctionne ce code, stp ? Je n'arrive pas à comprendre... Smiley decu
Je veux bien t'expliquer, mais pour ça, il faudrait que je sache ce que tu ne comprend pas ...

Si tu pouvais être un peu plus précis.
C'est surtout cette ligne que j'ai du mal à comprendre :
(SELECT SUM(page1+page2+page3) FROM stats AS sbis WHERE s.id=sbis.id) AS total


Merci ! Smiley smile
Il s'agit d'une "sous-requête" lié à la requête principale par la clause WHERE:

Dans ce cas précis, la requête principale utilise la même table que la "sous-requête" (stats), pour les différencier, je leur ai donné un alias différent ("s" pour la requête principal et "sbis" pour la "sous-requete"). Pour lié le résultat de la "sous-requête" avec celui de la requête principale il suffit de faire correspondre la valeur du champ "id" (s.id=sbis.id).

Voilà pour la particularité de cette ligne, après ce n'est ni plus ni moins qu'une requête normal dans laquelle tu peux ajouter des clauses "AND" et faire intervenir d'autres tables. La seule restriction pour une "sous-requête" c'est que tu ne peux pas mettre de clause "ORDER BY" et qu'elle doit renvoyer qu'un tuple à la fois (une seule colonne).

Voilà pour ce que je peux t'en dire ...
Merci Francois44 pour les explications.

J'aurais encore 2 questions :
- je n'ai pas bien compris pourquoi fallait lier le résultat de la sous requête avec celui de la requête principale...
- pourquoi il y a 3 as ? 1 pour la requête principale (s), un pour la sous requête (sbis) mais total correspond à quoi ?

Si total correspond à la somme des pages, sbis correspond à quoi ? Et s, il renvoie quoi ?

Merci de ton aide ! Smiley smile
Il y a 2 "types" d'allias dans cette requête:

- l'alias de table (s et sbis) permet de spécifier sur quelle table on travaille. On les utilise lorsqu'il peut y avoir une ambiguité dans le nom d'un champ. Dans ce cas précis :
ne marchera pas, car MySQL, ne pourra pas "savoir" de quel id il s'agit
(SELECT SUM(page1+page2+page3) FROM stats AS sbis WHERE id=id) AS total

Il faut donc utiliser une syntaxe comme celle ci:
(SELECT SUM(page1+page2+page3) FROM stats AS sbis WHERE s.id=sbis.id) AS total

Qui signifit "le champ id de la requête principale doit être égale au champ id de la sous requête"

- Ensuite, il y a les alias de champ qui permette d'affecter un nom à un champ. Cela permet d'avoir un nom de colonne plus compréhensible. Tu peux ainsi récupérer le résultat de ta sous requête dans la colonne "total". Tu peux bien sure le nommer autrement.

Je sais pas si je suis très clair ... mais je fais mon possible Smiley cligne