Page 1 sur 1

optimiser requette

Posté : 23 janv. 2007, 23:45
par dredtrake
bonjour a vous !

Pour afficher une liste de liens dynamique, je fait un script php, ce script fait une première requette pour obtenir tous les styles de liens, puis une fois cette valeur récupérée, je refait une requette avec une clause "WHERE style='$style' " >sur la meme table pour afficher chaque lien dans chaque catégorie..
en gros ca ressemble a ça :
function voirLiens(){
	mysql_select_db($database_connexionLogin, $connexionLogin);
	$sql = "SELECT style FROM **** GROUP BY style"; 
	$allComments = mysql_query($sql, $connexionLogin) or die("pb avec la base");
	$row_numallComments = mysql_num_rows($allComments);//récup du nombre total de résultat
	while($row_numallComments = mysql_fetch_assoc($allComments)) {
		echo "<h1>".utf8_encode($row_numallComments['style'])."</h1>";
		$sql2 = "SELECT * FROM ****  WHERE style='".$row_numallComments['style']."' ORDER BY nom"; 
		$allComments2 = mysql_query($sql2, $connexionLogin) or die("pb avec la base");
		$row_numallComments2 = mysql_num_rows($allComments2);//récup du nombre total de résultat
		while($row_numallComments2 = mysql_fetch_assoc($allComments2)) {
		echo "<h6><a href=\"".$row_numallComments2['url']."\" target=\"_blank\">".utf8_encode($row_numallComments2['nom'])."</a></h6>";
		}
	}	
	mysql_close();
}
Tout fonctionne nickel pour le moment, mais il y a encore peu de rubriques, et à plus ou moin long termes cette table est amené à grandir..
Ducoup si la liste des style de liens grandit je risque d'en demander alors beaucoup a la base?
qu'en pensez vous? dois-je améliorer ce script, ou peut etre que ce n'a pas d'importance (ce qui m'étonnerai tout de même) :?: :?:
merci de m'apporter vos lumières :P @+

Posté : 23 janv. 2007, 23:55
par Hubert Roksor
Quelques remarques:
  • le code est très dense et ne donne pas très envie d'être lu
  • ne jamais placer de requête dans une boucle. Remplace ça par une jointure
  • ces deux lignes n'ont aucun effet car la variable est écrasée tout de suite après :
    $row_numallComments = mysql_num_rows($allComments);
    $row_numallComments2 = mysql_num_rows($allComments2);
Pour le reste, si tu cherches à optimiser tes requêtes je donne quelque conseils supplémentaires dans ce sujet et tu pourras en trouver d'autres en cherchant sur les forums. ("optimisation", "explain" sont de bons mots-clés)

Posté : 24 janv. 2007, 01:31
par dredtrake
oki très bien je prend note :wink:
merci a toi..je vai voir ce que je trouve bonne nuit !!

Posté : 24 janv. 2007, 02:36
par dredtrake
oki je revien encore, car je voudrais avoir qeuelques petites précisions, mes bases dans ce domaine sont encore un peu fragile... :oops:

donc en fait je dispose juste d'une seul table dans mon cas...(ce qui me pose un problème pour faire une jointure..) :?

la structure est la suivante :

Code : Tout sélectionner

CREATE TABLE `liens` ( `id` smallint(5) NOT NULL auto_increment, `url` text collate utf8_unicode_ci NOT NULL, `nom` varchar(50) collate utf8_unicode_ci NOT NULL default '', `style` varchar(50) collate utf8_unicode_ci NOT NULL default '', PRIMARY KEY (`id`) )
et pour shématiser je souhaiterais afficher mes infos comme cela :

------MUSIQUE------ >>>style1

lien1
lien2
lien3


------LIEUX-------- >>>style2

lien1
lien2
lien3


------AMIS------- >>>style3

lien1
lien2
lien3

....
...
..
.

désolé de jouer le boulet...mais je galère un peu a vrai dire...
merci à ceux qui se pencherons sur mon problème..
:wink:

Posté : 24 janv. 2007, 03:03
par Hubert Roksor
Généralement, la politique de PHPFrance est d'éviter d'écrire les scripts à la place des utilisateurs mais plutôt de donner des indications pour que chacun résolve ses propres problème. Néanmoins un court exemple peut parfois être plus efficace qu'un long discours alors on fera une exception pour cette fois.

Voici à quoi devrait ressembler ton script ($db est bien entendu la connexion à la base). Clique sur le nom des fonctions pour plus d'infos, et s'il te reste des interrogations n'hésite pas à poster.
$sql = 'SELECT url, nom, style
        FROM liens
        ORDER BY style DESC';

$result = mysql_query($sql, $db);
if (!$result)
{
	die('Erreur MySQL : ' . mysql_error($db));
}

$style = '';
while ($row = mysql_fetch_assoc($result))
{
	if ($row['style'] != $style)
	{
		$style = str_pad($row['style'], 20, '-', STR_PAD_BOTH);
		echo '<h5>', utf8_encode($style), '</h5>';
	}

	echo '<h6><a href="', $row['url'], '" target="_blank">', utf8_encode($row['nom']), '</a></h6>';
}
mysql_free_result($result);
Quelques notes :
  • tu remarqueras que la requête SQL est sur plusieurs lignes pour une meilleure lisibilité
  • les noms des champs sont dans le même ordre que dans la base, ça permet de remarquer certaines erreurs plus facilement donc c'est une bonne habitude à prendre
  • à toi d'implémenter le système que tu préfère pour agencer les styles dans l'ordre que tu préfères (un champs numérique "ordre_style" par exemple)
  • il faudrait vérifier ça, mais normalement utf8_encode() ne devrait pas être nécessaire. Essaie d'exécuter la requête suivante en début de script et retire utf8_encode() pour voir si ça change les caractères accentués:

    Code : Tout sélectionner

    SET NAMES 'utf8'

Posté : 24 janv. 2007, 03:29
par dredtrake
Royal!! :D
un grand merci pour cette piste (très dégagé) que tu vien de m'ouvrir...
j'analyse ça sur le champs...
je vais tester le coup du 'utf8'.
Bonne soirée et encore merci :D

Posté : 24 janv. 2007, 03:41
par Hubert Roksor
Pour info, j'ai corrigé un léger bug. Pour des raisons techniques, en UTF-8 certains caractères (accentués ou spéciaux) comptent pour 2 ou 3, donc il vaut mieux appliquer str_pad() avant utf8_encode().

Posté : 24 janv. 2007, 05:40
par dredtrake
impec!! :wink: Merci bien pour ton aide..