Version complète: sur le forum Webmaster Hub : Affichage Reponses par Page...
Webmaster Hub > Création et exploitation de Sites Internet > Les langages du Net > PHP
furious Gontran
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";
}
}
?>
furious Gontran
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... huh.gif

Voici mon code corrigé, servez vous smile.gif :

Mon Formulaire apelle DecoupScript:

CODE
<html>
<head>
<title>Consultation</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
</head>

<body>

<?php
require_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 avant
if ($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 apres
if ($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";
    }
 
 //affichage
AfficheResultat ($resultat, $position, TAILLE_GROUPE);
    
?>
</body>
</html>

Affiche Resultat:

CODE
<?php
Function 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";
    }
    }
}    

?>

whistling.gif
Je m'ameliore a force, je commence meme à m'auto-repondre tongue.gif
Anonymus
Bientôt, tu pourras même auto-répondre aux autres membres wink.gif

Pour ce qui est de ta première requète :
CITATION
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é.. ( sad.gif ) Il faut donc toujours tester les variables renvoyées par les scripts et autres wink.gif ET si possible, les tester ailleurs que chez le 'client', autrement dit : pas en javascript ou champ Hidden.

Anonymus.
furious Gontran
Ok, merci, c'est un peu plus clair.
Je vais essayer d'ameliorer encore mon code...
Ceci est une version "bas débit" de notre forum. Pour voir la version complète avec plus d'information, la mise en page et les images, veuillez cliquer ici.