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

Signaler
Messages postés
48
Date d'inscription
vendredi 6 janvier 2017
Statut
Membre
Dernière intervention
17 février 2020
-
Exileur
Messages postés
1446
Date d'inscription
mercredi 31 août 2011
Statut
Membre
Dernière intervention
4 février 2020
-
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

Messages postés
1446
Date d'inscription
mercredi 31 août 2011
Statut
Membre
Dernière intervention
4 février 2020
77
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
Messages postés
48
Date d'inscription
vendredi 6 janvier 2017
Statut
Membre
Dernière intervention
17 février 2020

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";
Messages postés
1446
Date d'inscription
mercredi 31 août 2011
Statut
Membre
Dernière intervention
4 février 2020
77
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; 

Messages postés
3571
Date d'inscription
jeudi 16 juin 2005
Statut
Membre
Dernière intervention
20 février 2020
933
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
Reivax962
Messages postés
3571
Date d'inscription
jeudi 16 juin 2005
Statut
Membre
Dernière intervention
20 février 2020
933 > philip51
Messages postés
48
Date d'inscription
vendredi 6 janvier 2017
Statut
Membre
Dernière intervention
17 février 2020

Avec l'affichage de l'erreur, fais également echo $sql pour voir exactement à quoi ressemble la requête fautive.
philip51
Messages postés
48
Date d'inscription
vendredi 6 janvier 2017
Statut
Membre
Dernière intervention
17 février 2020
> Reivax962
Messages postés
3571
Date d'inscription
jeudi 16 juin 2005
Statut
Membre
Dernière intervention
20 février 2020

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
Exileur
Messages postés
1446
Date d'inscription
mercredi 31 août 2011
Statut
Membre
Dernière intervention
4 février 2020
77 > philip51
Messages postés
48
Date d'inscription
vendredi 6 janvier 2017
Statut
Membre
Dernière intervention
17 février 2020

<?php
session_start();
require_once "connect.php";


Sinon la session est jamais creer et tes variables $_SESSION ne sont que de simple variables.

Tu devrais séparer ta vue de ton controller.
Pas de raison d'avoir du SQL au milieu de HTML. Si jamais ton serveur SQL es down pour une raison x ou y, ta page se chargera à moitié.

Aussi, les objets / classes sont vraiment trés pratique et trés propre ! Pour faire de la pagination tu peux t'inspirer de https://steemit.com/utopian-io/@alfarisi94/pagination-with-php-oop-system-1-basic-oop-class-fetch-data-with-pdo-database-use-function-in-a-class
philip51
Messages postés
48
Date d'inscription
vendredi 6 janvier 2017
Statut
Membre
Dernière intervention
17 février 2020
> Exileur
Messages postés
1446
Date d'inscription
mercredi 31 août 2011
Statut
Membre
Dernière intervention
4 février 2020

session_start();

est sur ma page index.php

Pour les objets / classes j'ai mis le lien dans les favoris. Je reviendrai dessus pour faire du "propre"
Exileur
Messages postés
1446
Date d'inscription
mercredi 31 août 2011
Statut
Membre
Dernière intervention
4 février 2020
77 > philip51
Messages postés
48
Date d'inscription
vendredi 6 janvier 2017
Statut
Membre
Dernière intervention
17 février 2020

Dak, le mieux c'est vraiment de le mettre dans chaque page qui utilise les sessions...

Pour tes recherches hesite pas à utiliser les fonctionnalités de 'date' ( moins d'un an sur google )
Les derniéres nouveautés PHP sont vraiment pas mal! Typage des variables etc etc
Messages postés
48
Date d'inscription
vendredi 6 janvier 2017
Statut
Membre
Dernière intervention
17 février 2020

Merci
Je vais reprendre tout ça et je reviens !!