indexer ces tables
Hors ligneElidris Le 30/12/2006 à 19:01 Profil de Elidris Configuration de Elidris

Encéphalo plat !
Bonjour, ça va ?

j'ai une question^^,
voilà j' ai une requête sql qui est par exemple :

SELECT id,proverbe,auteur,membre,avatar,commentaire FROM Proverbe WHERE categorie='amour' order by id desc LIMIT 0,9

jusque là ça va, si je fait un EXPLAIN :

EXPLAIN SELECT id,proverbe,auteur,membre,avatar,commentaire FROM Proverbe where categorie='amour' order by id desc LIMIT 0,9

Je m'aperçois qu'il va parcourir 150 lignes (puisqu'il y a 150 proverbes dans la categorie 'amour') pour n'en afficher que 10 (0à9),
y a t'il une manière d'indexer mes tables pour qu'il ne parcours que 10 lignes afin de soulager le serveur ?

j'ai essayé plusieurs technique d'indexation mais il me parcours toujours 150 lignes^^

y a t'il une solution à mon problème ?

merci et au fait, jolie design ce forum
--
"Les experts auront beau se mettrent tous d'accord, il peuvent se tromper."
Hors ligneAnthony Le 31/12/2006 à 00:01 Profil de Anthony Configuration de Anthony

Admin
Salut ;)

Tout d'abord merci pour le design (et pourtant je suis pas très doué dans ce domaine, donc je prends vraiment ça pour un compliment )

Bref, déjà pour accélérer ta requête, tu devrais utiliser des champs numériques pour tes catégories (TINYINT par exemple). La catégorie "amour" serait par exemple celle qui aurait le numéro "0", tu mets un index sur ce champ, et tu auras une requête accélérée. Ensuite pour ce qui est du parcours de lignes, Il y aurait moyen d'accélérer tout ça. Dans ta table, tu rajoutes un champ de type INT qui porte le nom de "ordre". Lorsque tu ajoutes un proverbe dans une catégorie, le dernier proverbe portera l'ordre numéro 0, le proverbe que tu avais ajouté avant aura l'ordre 1, etc ... tu fais ça pour toutes les catégories, en gros c'est indépendant. Il peut donc y avoir deux proverbes de catégories différentes ayant la même valeur pour le champ ordre.

Ensuite tu indexes ce champ. Pour récupérer ensuite les dix derniers, tu fais ceci :

SELECT id,proverbe,auteur,membre,avatar,commentaire FROM Proverbe WHERE categorie=0 AND ordre BETWEEN 0 AND 9 ORDER BY ordre DESC

J'espère que ça t'a aidé ;)
--

Hors ligneElidris Le 01/01/2007 à 15:12 Profil de Elidris Configuration de Elidris

Encéphalo plat !
Rebonjour et bonne année à vous tous,
on va encore manger du code à s'en faire vomir cette année^^

J'ai essayé donc tout ce que tu m'as dit, et en effet je n'avais pas vu ça de cette manière,
cepandant comme souvent une solution engendre un nouveau problême,
le changement de page ne se fait plus, j'ai une commande du style:


$query="SELECT id,proverbe,auteur,membre,avatar,commentaire FROM Proverbe 
WHERE categorie='$cat' AND ordre BETWEEN '$Ndeb' AND '$Nmax'";


en fait il ne m'affiche que les 6 premiers proverbes, il voit bien le nombre total et m'affiche le bon nombre de page mais si je tourne la page il n'y a plus rien...

alors qu'avec cette commande ça fonctionne :


$query="SELECT id,proverbe,auteur,membre,avatar,commentaire,ordre,categorie FROM Proverbe 
WHERE categorie='$cat' order by ordre desc "." LIMIT $Ndeb,$Nmax ";


je pense que sans mon code vous ne pourrez pas m'aider, mais on ne sait jamais, je vais chercher beaucoup et
je reviens vous voir si je n'y arrive pas
--
"Les experts auront beau se mettrent tous d'accord, il peuvent se tromper."
Hors ligneAnthony Le 01/01/2007 à 17:19 Profil de Anthony Configuration de Anthony

Admin
Bonne année

En fait tu l'as parfaitement dit, sans ton code je ne pourrais pas t'aider, car il me faudrait la partie qui génère les deux nombres qui encadrent le between (en fonction de la page que tu passes donc).
--

Hors ligneElidris Le 02/01/2007 à 14:46 Profil de Elidris Configuration de Elidris

Encéphalo plat !
Bon et bien je n'ai toujours pas trouvé comment résoudre ce nouveau problème,
j'envoi donc mon code simplifié...


<?php 
$cat
=$_GET['cat'];          
// on récupère le nombre d'image total///
$Nmax 7// nombre par page
$Ndeb=@$_GET["num"]; // 1ère fiche transmise par l'URL
if($Ndeb==""$Ndeb=0;
// nombre total de fiches
$SQL="SELECT count(id) FROM Proverbe where categorie='$cat'";
$res mysql_query($SQL);
$Ntotal mysql_result($res,0,0)-1;
// sélectionne les fiches de la table
$query="SELECT id,proverbe,auteur,membre,avatar,nb_commentaire FROM Proverbe 
WHERE categorie='$cat' AND ordre BETWEEN $Ndeb AND $Nmax ORDER BY ordre DESC"
;
$result mysql_query($query); 
// tant qu'il y a des fiches
while ($val mysql_fetch_row($result)) {
// affiche un champ
$id$val[0];
$proverbe $val[1];
$aut $val[2];
$membre $val[3];          
$avatar 
$val[4];
$nb_commentaire $val[5];     
echo $proverbe;  }  

if($Ndeb 0) {
$avant$Ndeb-$Nmax ;
echo
'<a class="style13" href="index.php?page=modules/page_proverbe&amp;cat='.$cat.'&amp;num=0">
<b>Début&nbsp;</b></a>
<a class="style13" href="index.php?page=modules/page_proverbe&amp;cat='
.$cat.'&amp;num='.$avant.'">
<b>&lt;&lt;&lt;&nbsp;Précédentes&nbsp;</b></a>'
;}
// Page courante
$Npag floor($Ndeb/$Nmax)+1$Npag2 $Npag-1;
$tmp "<font color=\"#e97cf2\"><b>" $Npag "</b></font>";
// Max 9 pages avant
while(($Npag2>0)&&($Npag2>$Npag-6)) {
$tmp "<a class='style13' href='index.php?page=modules/page_proverbe&amp;cat=$cat&amp;num="
 
. ($Npag2-1)*$Nmax "'><b>" $Npag2 "</b></a> " $tmp;
$Npag2--;}
// Max 9 pages après
$Npag2 $Npag;
while((
$Npag2*$Nmax<=$Ntotal)&&($Npag2<$Npag+6)) {
$Npag2++;
$tmp .= " <a class='style13' href='index.php?page=modules/page_proverbe&amp;cat=$cat&amp;num=" . ($Npag2-1)*$Nmax "'><b>"
 
$Npag2 "</b></a>";}
echo 
$tmp;
// Des fiches après ?
if($Ntotal>=$Ndeb+$Nmax) { 
$floor=floor($Ntotal/7)*7;
$suite=$Ndeb+$Nmax;
echo
'<a class="style13" href="index.php?page=modules/page_proverbe&amp;cat='.$cat.'&amp;num='.$suite.'">
<b>&nbsp;Suivantes&nbsp;&gt;&gt;&gt;</b></a>
<a class="style13" href="index.php?page=modules/page_proverbe&amp;cat='
.$cat.'&amp;num='.$floor.'">
<b>&nbsp;Fin</b></a>'
;} 
          
mysql_free_result
($result);
?>
^

Je rappelle le problème : en fait il ne m'affiche que les 7 premiers proverbes, il voit bien le nombre total et m'affiche le bon nombre de page mais si je tourne la page il n'y a plus rien...

en théorie je sais d'où vient le problème mais en pratique je ne sais pas le résoudre...
merci de votre patience ^^
--
"Les experts auront beau se mettrent tous d'accord, il peuvent se tromper."
Hors ligneAnthony Le 02/01/2007 à 16:10 Profil de Anthony Configuration de Anthony

Admin
Là c'est normal, car en fait le between tu confonds avec l'id de la page. Si tu prends la page 1, le between aura cette forme : BETWEEN 0 AND 9

si tu veux afficher 10 éléments par page ;) Si tu veux en afficher 20, BETWEEN 0 AND 19, tu vois le truc ? 0, 1, 2, 3 ... ce sont les numéros des citations, pas des pages.

Bon sinon faut rendre plus propre le code au niveau de la vérification des variables :

$cat=$_GET['cat'];    ===> si $cat n'existe pas, aie, pareil pour $_GET['num']

<?php
/**
* Protège des failles de SQL injection
*/

if(isset($_GET['cat']))
{
   $cat mysql_real_escape_string($_GET['cat']);
}
else
{
   $cat '';
}

/**
* Vérifie que la chaîne passée ne comporte que des nombres entiers
*/

if(isset($_GET['num']) AND ctype_digit($_GET['num']) AND $_GET['num'] > -1)
{
   $Ndeb=$_GET['num'];
}
else
{
   $Ndeb=0;
}
?>
--

Hors ligneElidris Le 03/01/2007 à 14:17 Profil de Elidris Configuration de Elidris

Encéphalo plat !
Ok merci

je me doutais bien que je me ferais reprendre sur le $_GET,
je n'ai pas encore trop approfondi les questions de sécurités.
Mais c'est en cours......

merci encore
--
"Les experts auront beau se mettrent tous d'accord, il peuvent se tromper."
Vous avez résolu votre problème avec VIC ? Faites-le savoir sur les réseaux sociaux !
Vulgarisation-informatique.com
Cours en informatique & tutoriels