furious Gontran Posté 12 Septembre 2004 Posté 12 Septembre 2004 (modifié) j'utilise une limite sur mes requetes mysql pour ne sortir que les lignes m'interressant. Ca marche pour la premiere page, mais toutes les autres pages affiche tout mon tableau. Seul la premiere et la derniere prennent en compte la limite de ma requete. Pourtant, si je teste ma requete sur les pages centrales, celle est bonne: Requete=SELECT * FROM Auteurs Limit 10,20...SELECT * FROM Auteurs Limit 20,30...SELECT * FROM Auteurs Limit 30,40....... Je ne comprend pas trop pourquoi. Mes pages: -- Formulaire:choix de la table avec un champ caché Submit pour initialiser ma variable $position. -- on tombe sur DecoupResult.php que voici: <?php require_once ("Connect.php"); contient mes parametres de connexion require_once ("Connexion.php");fonction de connexion a ma base require_once ("ExecRequete.php");fonction de recherche dans ma base require_once ("AfficheResultat.php");affichage des resultats dans un tableau entierement dynamique define ("TAILLE_GROUPE", 10); $connexion=connexion(NOM,PASSE,BASE,SERVEUR); if (isSet ($_POST['submit'])) { $position=0; $fin=$position+TAILLE_GROUPE; determine la Table selon bouton choisi je n'en ais mis qu'une pour simplifier if (isSet ($_POST['Auteur'])) { $Table="Auteurs"; } else { $position = $_GET['position']; $Table = $_GET['Table']; $fin = $position+TAILLE_GROUPE; } Compte Total de Ligne $qte=ExecRequete("SELECT * FROM $Table", $connexion); $TotalLigne= mysql_num_rows ($qte); Determination et Execution de la requete$Requete="SELECT * FROM $Table Limit $position,$fin"; $resultat=ExecRequete($Requete, $connexion); Titre et lien ajouter dans la base echo "<p><H3 ALIGN='Center'>Table Auteur<BR><BR>"; echo "<A HREF = > Ajouter un auteur </a><BR>"; Lien page precedente if ($position >= TAILLE_GROUPE) { $avant=$position - TAILLE_GROUPE; $fin=$position+TAILLE_GROUPE; $NomTable=$Table; $Requete="SELECT * FROM $Table LIMIT $position,$fin"; $RequeteCode= urlencode($Requete); echo "<A HREF ='DecoupResult.php?fin=$fin&position=$avant&Table=$NomTable'>". "voir les ". TAILLE_GROUPE. " lignes precedentes</A><BR>\n"; } Lien page suivante if ($position + TAILLE_GROUPE < $TotalLigne) { $apres=$position + TAILLE_GROUPE; $NomTable=$Table; echo "<A HREF ='DecoupResult.php?position=$apres&Table=$NomTable'>". "voir les ". TAILLE_GROUPE. " lignes suivantes</A><BR>\n"; } affichage des resultats AfficheResultat ($resultat, $position, TAILLE_GROUPE); ?> Voici le code d'affichage (j'en suis assez fier):<?php require_once("ExecRequete.php"); Function AfficheResultat ($resultat, $position, $nbrLignes) Cette fonction fais un tableau, y insere une entete avec les attributs et les valeurs pour ces resultats { entete tableau echo "<TABLE ALIGN='center' BORDER='1'>\n"; $nbAttr = mysql_num_fields ($resultat); echo "<TR>\n"; placement Nom Attributs for ($i=0; $i<$nbAttr; $i++) echo "<TH>". mysql_field_name ($resultat, $i)."</TH>\n"; echo "<TH>Modifier</TH>\n<TH>Supprimer</TH>\n</TR>\n"; Remplissage while ($tabAttr = mysql_fetch_row ($resultat)) Je me demande si ce n'est pas cette boucle qui me pose probleme, mais j'ais beau bidouiller rien ne marche { echo "<TR>"; for ($i=0; $i<$nbAttr; $i++) { echo "<TD>".$tabAttr[$i]."</TD>"; } echo "</TR>\n"; } } ?> Modifié 12 Septembre 2004 par furious Gontran
furious Gontran Posté 12 Septembre 2004 Auteur Posté 12 Septembre 2004 J'ais posé un compteur dans ma boucle while qui stoppe celle-ci au bout de 10 boucle... Mais la question reste entiere: Pourquoi la limit fonctionnais sur la premiere et derniere page et non sur les pages centrales de resultat ??? J'aimerais bien comprendre... Voici mon code corrigé, servez vous : Mon Formulaire apelle DecoupScript: <html><head><title>Consultation</title><meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"></head><body><?phprequire_once ("Connect.php");require_once ("Connexion.php");require_once ("ExecRequete.php");require_once ("AfficheResultat.php");define ("TAILLE_GROUPE", 10);$connexion=connexion(NOM,PASSE,BASE,SERVEUR); //determine la Table selon bouton choisi if (isSet ($_POST['Auteur'])) { $Table="Auteurs"; $position = 0; $fin = $position+TAILLE_GROUPE; } else { $position = $_GET['position']; $Table = $_GET['Table']; $fin = $position+TAILLE_GROUPE; }//Compte Total de Ligne $qte=ExecRequete("SELECT * FROM $Table", $connexion); $TotalLigne= mysql_num_rows ($qte); $Requete="SELECT * FROM $Table LIMIT $position,$fin";$resultat=ExecRequete($Requete, $connexion);echo "<p><H3 ALIGN='Center'>Table Auteur<BR><BR>";echo "<A HREF = > Ajouter un auteur </a><BR>"; //Liens avant-Apres //lignes a voir avantif ($position >= TAILLE_GROUPE) { $avant=$position - TAILLE_GROUPE; $NomTable=$Table; echo "<A HREF ='DecoupResult.php?position=$avant&Table=$NomTable'>". "voir les ". TAILLE_GROUPE. " lignes precedentes</A><BR>\n"; } // Lignes a voir apresif ($position + TAILLE_GROUPE < $TotalLigne) { $apres=$position + TAILLE_GROUPE; echo "apres=".$apres; $NomTable=$Table; echo "<A HREF ='DecoupResult.php?position=$apres&Table=$NomTable'>". "voir les ". TAILLE_GROUPE. " lignes suivantes</A><BR>\n"; } //affichageAfficheResultat ($resultat, $position, TAILLE_GROUPE);?></body></html> Affiche Resultat: <?phpFunction AfficheResultat ($resultat, $position, $nbrLignes)// Cette fonction fais un tableau, y insere une entete avec les attributs et les valeurs pour ces resultats// decoupés en pages selon $nbrLignes { $Compt=0; //entete tableau echo "<TABLE ALIGN='center' BORDER='1'>\n"; $nbAttr = mysql_num_fields ($resultat); echo "<TR>\n"; //placement Nom Attributs for ($i=0; $i<$nbAttr; $i++) echo "<TH>". mysql_field_name ($resultat, $i)."</TH>\n"; echo "<TH>Modifier</TH>\n<TH>Supprimer</TH>\n</TR>\n"; //Remplissage while ($tabAttr = mysql_fetch_row ($resultat)) { $Compt++; if ($Compt <= $nbrLignes) { echo "<TR>"; for ($i=0; $i<$nbAttr; $i++) { echo "<TD>".$tabAttr[$i]."</TD>"; } echo "</TR>\n"; } }} ?> Je m'ameliore a force, je commence meme à m'auto-repondre
Anonymus Posté 13 Septembre 2004 Posté 13 Septembre 2004 Bientôt, tu pourras même auto-répondre aux autres membres Pour ce qui est de ta première requète : Pourtant, si je teste ma requete sur les pages centrales, celle est bonne: Requete=SELECT * FROM Auteurs Limit 10,20...SELECT * FROM Auteurs Limit 20,30...SELECT * FROM Auteurs Limit 30,40....... Les paramètres de la clause LIMIT sont ainsi : LIMIT $début,$nb_lignes. Ainsi, si tu veux 10 lignes, quelque soit l'endroit où tu commences, ca donnera : LIMIT $debut,10 Si tu veux commencer à la ligne 55, sans savoir combien de lignes tu auras, cela fera : LIMIT 55,$nb_lignes. Etc.. Pour ta variable $position, tu peux la mettre 'cachée'. Mais c'est un paramètre que tu laisses alors sans 'protection'. Le mieux est de prévoir cette éventualité dans le script, en la testant : Si ($position n'existe pas) alors $position=0 Sinon $position=(int)$position. Le "sinon" signifie : Si elle existe, alors c'est forcément un 'entier'. Cela évite les problèmes du style : $position =1;select login from user En effet, il est très facile de passer des requètes sql dans un script non protégé.. ( ) Il faut donc toujours tester les variables renvoyées par les scripts et autres ET si possible, les tester ailleurs que chez le 'client', autrement dit : pas en javascript ou champ Hidden. Anonymus.
furious Gontran Posté 13 Septembre 2004 Auteur Posté 13 Septembre 2004 Ok, merci, c'est un peu plus clair. Je vais essayer d'ameliorer encore mon code...
Sujets conseillés
Veuillez vous connecter pour commenter
Vous pourrez laisser un commentaire après vous êtes connecté.
Connectez-vous maintenant