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

Résolu/Fermé
philip51 Messages postés 49 Date d'inscription vendredi 6 janvier 2017 Statut Membre Dernière intervention 25 février 2020 - 3 févr. 2020 à 10:31
Exileur Messages postés 1475 Date d'inscription mercredi 31 août 2011 Statut Membre Dernière intervention 16 décembre 2022 - 4 févr. 2020 à 15:58
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

Exileur Messages postés 1475 Date d'inscription mercredi 31 août 2011 Statut Membre Dernière intervention 16 décembre 2022 150
3 févr. 2020 à 10:41
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
philip51 Messages postés 49 Date d'inscription vendredi 6 janvier 2017 Statut Membre Dernière intervention 25 février 2020
3 févr. 2020 à 10:52
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
Exileur Messages postés 1475 Date d'inscription mercredi 31 août 2011 Statut Membre Dernière intervention 16 décembre 2022 150
3 févr. 2020 à 11:13
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
Reivax962 Messages postés 3671 Date d'inscription jeudi 16 juin 2005 Statut Membre Dernière intervention 11 février 2021 1 011
Modifié le 3 févr. 2020 à 11:24
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
Exileur Messages postés 1475 Date d'inscription mercredi 31 août 2011 Statut Membre Dernière intervention 16 décembre 2022 150
3 févr. 2020 à 11:50
Bien vu
0
Reivax962 Messages postés 3671 Date d'inscription jeudi 16 juin 2005 Statut Membre Dernière intervention 11 février 2021 1 011 > Exileur Messages postés 1475 Date d'inscription mercredi 31 août 2011 Statut Membre Dernière intervention 16 décembre 2022
3 févr. 2020 à 12:03
Merci, mais ça ne remplace pas la démarche de recherche du bug que tu as exposée :)
0
philip51 Messages postés 49 Date d'inscription vendredi 6 janvier 2017 Statut Membre Dernière intervention 25 février 2020
4 févr. 2020 à 10:45
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
Reivax962 Messages postés 3671 Date d'inscription jeudi 16 juin 2005 Statut Membre Dernière intervention 11 février 2021 1 011 > philip51 Messages postés 49 Date d'inscription vendredi 6 janvier 2017 Statut Membre Dernière intervention 25 février 2020
4 févr. 2020 à 11:07
Avec l'affichage de l'erreur, fais également echo $sql pour voir exactement à quoi ressemble la requête fautive.
0
philip51 Messages postés 49 Date d'inscription vendredi 6 janvier 2017 Statut Membre Dernière intervention 25 février 2020 > Reivax962 Messages postés 3671 Date d'inscription jeudi 16 juin 2005 Statut Membre Dernière intervention 11 février 2021
4 févr. 2020 à 11:28
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

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
philip51 Messages postés 49 Date d'inscription vendredi 6 janvier 2017 Statut Membre Dernière intervention 25 février 2020
3 févr. 2020 à 11:52
Merci
Je vais reprendre tout ça et je reviens !!
0