Pagination. $_GET['lapage'] ne récupère rien

Résolu
philip51 Messages postés 50 Statut Membre -  
Exileur Messages postés 1621 Date d'inscription   Statut Membre Dernière intervention   -
Bonjour,
J'essaie de construire une pagination pour afficher les membres.
la première page fonctionne mais pas les suivantes !!
<?php
require_once "connect.php";

$sessionChoix = !empty($_SESSION['choix']) ? $_SESSION['choix'] : NULL; //prendre la valeur de session si remplie
$choix = !empty($_POST['choix']) ? $_POST['choix'] : $sessionChoix; // prendra la valeur de post si elle est remplie, sinon celle de session
$_SESSION['choix'] = $choix;

//echo $_SESSION['choix'];
//echo $choix;
$nom='';
$prenom = !empty($_GET['prenom']) ? $_GET['prenom'] : "";
$id = !empty($_GET['id']) ? $_GET['id'] : ""; // prend l'id de la valeur cliquée sur le tableau
$nationalite = '';
$TotalMembres = '';
$membresParPage = 15;
$nombreDePages = '';
$premiereEntree = '';
$message = '';
$lapage = !empty($_GET['lapage']) ? $_GET['lapage'] : "1";
if (isset($_POST['envoyer']) && $choix){
	$strWhere = "";
	$nationalite = "";
 	switch($choix){
  	case "A":
   		$strWhere = "WHERE nationalite = 'Allemande'";
		$nationalite = "'Allemande'";
  		break;
  	case "F":
    		$strWhere = "WHERE nationalite = 'Française'";
		$nationalite = "'Française'";
  		break;
  	default:
		$nationalite = "'Allemande' OR nationalite = 'Française'";
   		 //aucun choix!
  		break;
 	}
	$sql = "SELECT COUNT(*) AS nb FROM membres " . $strWhere; //compte le nombre de personnes en fonction du choix effectué
 	try{
    		$req = $cnx->query($sql);
    		$data = $req->fetch(); 
    		$TotalMembres = $data['nb']; // compte le nombre d'enregistrements
		$nombreDePages = ceil($TotalMembres/$membresParPage); // compte le nombre de pages
		if (isset($_GET['lapage'])) {
			$pageActuelle = intval($_GET['lapage']);
			if ($pageActuelle > $nombreDePages) {
				$pageActuelle = $nombreDePages;
			}
		}
		else {
			$pageActuelle = 1; // la page actuelle est la n°1
		}
		$premiereEntree = ($pageActuelle - 1) * $membresParPage; // on calcule la première entrée à lire
// si je renseigne manuellement $lapage et $premiereEntree tout fonctionne
//$lapage = 2;
//$premiereEntree = 15;
echo "numéro de page = $lapage , premiere entrée =  $premiereEntree";

 	}catch(Exception $e){
   		echo "Erreur : " . $e->getMessage();
 	}
}
else {
 	$message = "Merci de choisir un affichage !";
}
//echo $_GET['lapage'];
?>

<link rel="stylesheet" type="text/css" href="css/style_connexion.css" /> <!---liaison avec la feuille se style --->
<div style="text-align:center;margin-left:auto;margin-right:auto;background-color:#7FDD4C;width:85%;box-shadow:0.7em 0.7em 0.7em #3A9D23;">
	<p>
	<FORM name="research" ACTION = "index.php?page=comodmember" METHOD="POST">
		<br />
		<p style="text-align:left;">  <b> Sélectionner la liste des membres à afficher :</b><br />
						       <input type="radio" name="choix" Value="T" <?php if($_SESSION["choix"] == "T"){ echo 'checked = "checked"';} ?>style="margin-left:5em;">Tous * 
			<span style="margin-left:2em;"><input type="radio" name="choix" Value="A" <?php if($_SESSION["choix"] == "A"){ echo 'checked = "checked"';} ?>>Allemand.e.s</span>
			<span style="margin-left:2em;"><input type="radio" name="choix" Value="F" <?php if($_SESSION["choix"] == "F"){ echo 'checked = "checked"';} ?>>Français.e.s</span>
			<span style="margin-left:2em;"><input type="submit" name="envoyer" Value="Afficher" style="cursor:pointer;"></span>
			<br/>
			<span style="font-size:0.8em;">  * Affichage par défaut</span></p>
			<b>Pour modifier les données d'un membre, cliquez sur son nom</b><br />
		<?php 
		if (!empty($_SESSION['choix'])){
			error_reporting(E_ALL);
			ini_set('display_errors', TRUE);
			ini_set('display_startup_errors', TRUE);
			//préparation de la requête et des variables
			$sql = "SELECT * FROM membres WHERE nationalite = $nationalite ORDER BY nom, prenom LIMIT $premiereEntree, $membresParPage"; 
			try {
				$requete = $cnx->prepare($sql);
				$requete->execute();
				$arr_membres = $requete->fetchAll();// on stocke le resultat de la requete dans un array
			}
			catch(Exception $e){
  				// en cas d'erreur dans la requete:
   				echo " Erreur ! ".$e->getMessage();
			}
			if(!empty($arr_membres)){ // on s'assure que la variable n'est pas vide puis on écrit la table avec son contenu
				echo 'Nombre total de membres : '. $TotalMembres .'<br />';
				echo '<table border=1 style="text-align:left;width:100%;">';
				echo '<tr style="text-align:center;"><td style="width:15em;">NOM</td><td style="width:8em;">PRENOM</td><td style="width:8em;">TELEPHONE</td><td style="width:20em;">ADRESSE INTERNET</td></TR>';
				foreach($arr_membres as $M){ // on boucle dessus à l'aide d'un foreach
					echo '<tr>';
					?>
					  <td><a href="index.php?page=comodmember&id=<?php echo $M['id'];?>&prenom=<?php echo $M['prenom'];?>"><?php echo $M['nom'];?></a></td>
					  <td><?php echo $M['prenom'];?></td>
					  <td><?php echo $M['telephone'];?></td><td><?php echo $M['mail'];?></td></tr> 
					<?php
				}
				echo '</table>';
			}
		}
		?>
	</p>
	<?php 
 		echo $message; echo '<br />';
		if (empty($message)){
			for ($i = 1; $i <= $nombreDePages; $i++) {
				if ($i == $pageActuelle) {
					echo ' [ '.$i.' ] ';
				}
				else {
					echo '<a href= "index.php?page=comodmember&lapage = '.$i.'">'.' '.$i.'</a>';
				}
			}
		}
	?><br />
	</FORM>
</div>
<?php
if (!empty($id)){
	echo '<div style="">';
	echo $id .' '.$prenom;
}
echo '</div>';
?>


Quand je clique sur une page j'ai le message suivant :
"Erreur ! SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'ORDER BY nom, prenom LIMIT , 15' at line 1"

Quelqu'un peut m'aider ?
Merci d'avance

Configuration: Windows / Chrome 79.0.3945.130

5 réponses

  1. Exileur Messages postés 1621 Date d'inscription   Statut Membre Dernière intervention   150
     
    Hello,

    "ORDER BY nom, prenom LIMIT , 15"
    Il semblerait que la variable $premiereEntree soit vide, null ou false ce qui te génére une requéte mal-formée.

    Elles sont ou les classes ? QQ

    A plus dans l'bus
    0
  2. philip51 Messages postés 50 Statut Membre
     
    C'est bien là mon problème !! Si je renseigne manuellement $lapage et $premiereEntree, la requête fonctionne.
    Je ne comprends pas pourquoi $_GET['lapage'] ne récupère pas le numéro de la page sélectionnée
    $lapage = 3;
    $premiereEntree = ($lapage - 1) * $membresParPage;
    echo "numéro de page = $lapage , premiere entrée =  $premiereEntree";
    
    0
  3. Exileur Messages postés 1621 Date d'inscription   Statut Membre Dernière intervention   150
     
    Bon, déja.

    Tu démarres pas les sessions PHP, tes variables SESSIONS seront toujours vide -> https://www.php.net/manual/fr/function.session-start.php

    Ensuite, : -> $lapage = !empty($_GET['lapage']) ? $_GET['lapage'] : "1";
    $premiereEntree = '';

    Premiere entrée est un chiffre on est d'accord ?
    Alors
     $lapage = !empty($_GET['lapage']) ? $_GET['lapage'] : 1;
    $premiereEntree = 0;
    ou au pire
    $premiereEntree = NULL;


    Bref, voila ce qui nous interesses :

    Si pas de page, ça fonctionne ( donc le else est ok, et le probléme dans le if )

    		if (isset($_GET['lapage'])) {
    $pageActuelle = intval($_GET['lapage']);
    if ($pageActuelle > $nombreDePages) {
    $pageActuelle = $nombreDePages;
    }
    }
    else {
    $pageActuelle = 1; // la page actuelle est la n°1
    }


    Donc SI $_GET['lapage'] (donc tu arrives sur la page avec une url comme http://monsite.com/mapage.php?lapage=1 et le bloc
    echo '<a href= "index.php?page=comodmember&lapage = '.$i.'">'.' '.$i.'</a>';
    est fonctionnel)
    pageActuelle = 1;

    Nous y voila. pageActuelle est elle bien setté ?
    Vaut elle plus que nombre de page ?

    Que vaut echo "numéro de page = $lapage , premiere entrée = $premiereEntree"; ??

    Et je termine par la concaténation qui n'est pas faite comme elle devrait :
    			$sql = "SELECT * FROM membres WHERE nationalite = " . $nationalite . " ORDER BY nom, prenom LIMIT " . $premiereEntree . ", " . $membresParPage; 

    0
  4. Reivax962 Messages postés 3742 Statut Membre 1 011
     
    Bonjour,

    Quand tu génères le lien de numéro de page, tu as des espaces surnuméraires qu'il faut enlever.
    echo '<a href= "index.php?page=comodmember&lapage = '.$i.'">'.' '.$i.'</a>';

    Doit être
    echo '<a href="index.php?page=comodmember&lapage='.$i.'">'.' '.$i.'</a>';

    Pas d'espace dans une URL !

    Xavier
    0
    1. Exileur Messages postés 1621 Date d'inscription   Statut Membre Dernière intervention   150
       
      Bien vu
      0
    2. Reivax962 Messages postés 3742 Statut Membre 1 011 > Exileur Messages postés 1621 Date d'inscription   Statut Membre Dernière intervention  
       
      Merci, mais ça ne remplace pas la démarche de recherche du bug que tu as exposée :)
      0
    3. philip51 Messages postés 50 Statut Membre
       
      Bonjour,

      1/ J'avais effectivement oublié la session
      2/ Je traitais pas le cas où le clique est sur le numéro de page => donc il n'y avait pas de traitement
      3/ J'ai réécris la requête de sélection
      4/ J'avais bien remarqué qu'il ne fallait pas d'espace dans l'URL

      maintenant tout est ok
      ah non encore une chose.
      la première fois que je clique sur le lien du menu qui amène à cette page aucun soucis tout est ok. Je fais diverses sélections pour tester que tout se passe normalement. MAIS si je clique de nouveau sur le lien du menu qui amène à cette page j'ai un message d'erreur :
      Erreur ! SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ' 15' at line 1
      

      Je remets tout le code de la page
      <?php
      require_once "connect.php";
      
      $sessionChoix = !empty($_SESSION['choix']) ? $_SESSION['choix'] : NULL; //prendre la valeur de session si remplie
      $choix = !empty($_POST['choix']) ? $_POST['choix'] : $sessionChoix; // prendra la valeur de post si elle est remplie, sinon celle de session
      $_SESSION['choix'] = $choix;
      
      $lapage = !empty($_GET['lapage']) ? $_GET['lapage'] : 1; // prend la valeur de la page
      $_SESSION['lapage'] = $lapage;
      
      $id = !empty($_GET['id']) ? $_GET['id'] : ""; // prend l'id de la valeur cliquée sur le tableau
      
      $nom = !empty($_GET['nom']) ? $_GET['nom'] : "";;
      $prenom = !empty($_GET['prenom']) ? $_GET['prenom'] : "";
      
      $TotalMembres = '';
      $membresParPage = 15;
      $nombreDePages = '';
      $premiereEntree = '';
      $message = '';
      $nationalite = "";
      $strWhere = "";
      
      switch($choix){ //teste quel choix est sélectionné
        case "A":
         	$strWhere = "WHERE nationalite = 'Allemande'";
      	$nationalite = "'Allemande'";
        	break;
        case "F":
          	$strWhere = "WHERE nationalite = 'Française'";
      	$nationalite = "'Française'";
        	break;
        default:
      	$nationalite = "'Allemande' OR nationalite = 'Française'";
          	break;
      }
      
      
      if (isset($_POST['envoyer']) && $choix){ //teste si le bouton envoyer et le choix de la nationalité sont cliqués
      	$sql = "SELECT COUNT(*) AS nb FROM membres " . $strWhere; //compte le nombre de personnes en fonction du choix effectué
       	try{
          		$req = $cnx->query($sql);
          		$data = $req->fetch(); 
          		$TotalMembres = $data['nb']; // récupère le nombre d'enregistrements
      		$nombreDePages = ceil($TotalMembres/$membresParPage); // compte le nombre de pages
      		if (isset($_GET['lapage'])) { // teste si le numéro de la page est cliqué
      			$pageActuelle = intval($_GET['lapage']); // affecte le numéro de la page à la page actuelle
      			if ($pageActuelle > $nombreDePages) {	// teste si la page actuelle est supérieure aux nombre de pages
      				$pageActuelle = $nombreDePages; // si oui la page actuelle est égale aux nombre de pages
      			}
      		}
      		else {
      			$pageActuelle = 1; // si le numéro de page n'est pas sélectionné,la page actuelle est la n°1
      		}
      		$premiereEntree = ($pageActuelle - 1) * $membresParPage; // on calcule la première entrée à lire
      
       	}catch(Exception $e){
         		echo "Erreur : " . $e->getMessage();
       	}
      }
      else if (isset($_GET['lapage'])) { // teste si la un numéro de page est sélectionné
      	$sql = "SELECT COUNT(*) AS nb FROM membres " . $strWhere; //compte le nombre de personnes en fonction du choix effectué
       	try{
          		$req = $cnx->query($sql);
          		$data = $req->fetch(); 
          		$TotalMembres = $data['nb']; // compte le nombre d'enregistrements
      		$nombreDePages = ceil($TotalMembres/$membresParPage); // compte le nombre de pages
      		$pageActuelle = intval($_GET['lapage']);
      		if ($pageActuelle > $nombreDePages) {
      			$pageActuelle = $nombreDePages;
      		}
      		$premiereEntree = ($pageActuelle - 1) * $membresParPage; // on calcule la première entrée à lire
       	}catch(Exception $e){
         		echo "Erreur : " . $e->getMessage();
       	}
      }
      ?>
      
      <link rel="stylesheet" type="text/css" href="css/style_connexion.css" /> <!---liaison avec la feuille se style --->
      <div style="text-align:center;margin-left:auto;margin-right:auto;background-color:#7FDD4C;width:85%;box-shadow:0.7em 0.7em 0.7em #3A9D23;">
      	<p>
      	<FORM name="research" ACTION = "index.php?page=comodmember" METHOD="POST">
      		<br />
      			<p style="text-align:left;">  <b> Sélectionner la liste des membres à afficher :</b><br />
      						       <input type="radio" name="choix" Value="T" <?php if($_SESSION["choix"] == "T"){ echo 'checked = "checked"';} ?>style="margin-left:5em;">Tous * 
      			<span style="margin-left:2em;"><input type="radio" name="choix" Value="A" <?php if($_SESSION["choix"] == "A"){ echo 'checked = "checked"';} ?>>Allemand.e.s</span>
      			<span style="margin-left:2em;"><input type="radio" name="choix" Value="F" <?php if($_SESSION["choix"] == "F"){ echo 'checked = "checked"';} ?>>Français.e.s</span>
      			<span style="margin-left:2em;"><input type="submit" name="envoyer" Value="Afficher" style="cursor:pointer;"></span>
      			<br/>
      			<span style="font-size:0.8em;">  * Affichage par défaut</span></p>
      			<b>Pour modifier les données d'un membre, cliquez sur son nom</b><br />
      		<?php 
      		if (!empty($_SESSION['choix'])){
      			error_reporting(E_ALL);
      			ini_set('display_errors', TRUE);
      			ini_set('display_startup_errors', TRUE);
      			//préparation de la requête et des variables
      			$sql = "SELECT * FROM membres WHERE nationalite = ".$nationalite." ORDER BY nom, prenom LIMIT ".$premiereEntree.", $membresParPage"; 
      			try {
      				$requete = $cnx->prepare($sql);
      				$requete->execute();
      				$arr_membres = $requete->fetchAll();// on stocke le resultat de la requete dans un array
      			}
      			catch(Exception $e){
        				// en cas d'erreur dans la requete:
         				echo " Erreur ! ".$e->getMessage();
      			}
      			if(!empty($arr_membres)){ // on s'assure que la variable n'est pas vide puis on écrit la table avec son contenu
      				//echo 'Nombre total de membres : '. $TotalMembres .'<br />';
      				//foreach($arr_membres as $M){ // on boucle dessus à l'aide d'un foreach
      				//	echo $M['prenom'] .' '. $M['nom'].'<br />';
      				echo 'Nombre total de membres : '. $TotalMembres .'<br />';
      				echo '<table border=1 style="text-align:left;width:100%;">';
      				echo '<tr style="text-align:center;"><td style="width:15em;">NOM</td><td style="width:8em;">PRENOM</td><td style="width:8em;">TELEPHONE</td><td style="width:20em;">ADRESSE INTERNET</td></TR>';
      				foreach($arr_membres as $M){ // on boucle dessus à l'aide d'un foreach
      					echo '<tr>';
      					?>
      					  <td><a href="index.php?page=comodmember&id=<?php echo $M['id'];?>&prenom=<?php echo $M['prenom'];?>"><?php echo $M['nom'];?></a></td>
      					  <td><?php echo $M['prenom'];?></td>
      					  <td><?php echo $M['telephone'];?></td><td><?php echo $M['mail'];?></td></tr> 
      					<?php
      				}
      				echo '</table>';
      			}
      		}
      		echo '</p>';
      		if (!empty($message)){
      			echo $message; echo '<br />';
      		}
      		if (empty($message)){
      			for ($i = 1; $i <= $nombreDePages; $i++) {
      				if ($i == $pageActuelle) {
      					echo ' [ '.$i.' ] ';
      				}
      				else {
      					echo '<a href= "index.php?page=comodmember&lapage='.$i.'">'.' '.$i.'</a>';
      				}
      			}
      		}
      	?>
      	<br />
      	</FORM>
      	<br />
      </div>
      <?php
      if (!empty($id)){
      	echo '<div style="">';
      	echo $id .' '.$prenom ;
      }
      echo '</div>';
      ?>
      

      Pourquoi ce message ? un problème de session ?
      Je crois que je peux encore améliorer ce code après.
      Merci d'avance
      0
    4. Reivax962 Messages postés 3742 Statut Membre 1 011 > philip51 Messages postés 50 Statut Membre
       
      Avec l'affichage de l'erreur, fais également echo $sql pour voir exactement à quoi ressemble la requête fautive.
      0
    5. philip51 Messages postés 50 Statut Membre > Reivax962 Messages postés 3742 Statut Membre
       
      OK Merci,
      c'est cette requête qui ne contient pas la première limite si je clique de nouveau sur le lien du menu qui affiche cette page
      $sql = "SELECT * FROM membres WHERE nationalite = ".$nationalite." ORDER BY nom, prenom LIMIT ".$premiereEntree.", $membresParPage"; 
      

      donc j'ai modifié
      $premiereEntree = '';
      

      par
      $premiereEntree = 0;
      

      et je n'ai plus de message d'erreur

      Je considère ce problème résolu. Merci encore
      0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. philip51 Messages postés 50 Statut Membre
     
    Merci
    Je vais reprendre tout ça et je reviens !!
    0