Problème Pagination

Eléphant du PHP | 184 Messages

14 oct. 2011, 14:30

Bonjour à vous,

J'ai essayé de faire un petite pagination pour un affichage d'une table.
Mon soucis, c'est que ma pagination ne marche pas au premier affichage. La première fois que j'arrive sur l'affichage, j'ai tous mes enregistrements.
Si je clique sur les numéros de ma pagination, alors je passe bien à ma pagination de 1 à 1 enregistrement.

<?php require_once('../connexion/localhost.php'); ?>
<?php

$conn = mysql_connect($hostname_localhost, $username_localhost, $password_localhost) or trigger_error(mysql_error(),E_USER_ERROR);
 
mysql_query("SET CHARACTER SET 'utf8';")or die(mysql_error()); 
 
mysql_select_db($database_localhost, $conn); 

//param modifiables
$nb_par_page=1;
	
	//
if(isset($_POST['valider']) || isset($_GET['page'])){ //le bouton valider a été cliqué ou appel par pagination
	//nom du script
	$currentScript = $_SERVER["PHP_SELF"];
	//recup id_produit sélectionné ou passé par l'url
	if(isset($_POST['categories'])){
		$categorie = $_POST['categories'];
	}else{
		$categorie = $_GET['categ'];
	}
	//recup page demandée passée par l'URL
	if(isset($_GET['page'])){
		$page_courante=$_GET['page'];
	}else{
		$page_courante=0;
	}
	//calcul nombre de pages
	$sql = "SELECT * FROM produits WHERE id_categorie = '".$categorie."'"; 
	$requete = mysql_query($sql) or die( mysql_error());
	$nb_enr=mysql_num_rows($requete);
	$nb_pages=ceil($nb_enr/$nb_par_page);
	
	//calcul limites d'affichage 
	$debut=$page_courante*$nb_par_page;
	
	//requette avec les limites
	$sql = "SELECT * FROM produits WHERE id_categorie = '".$categorie."' LIMIT ".$debut.",".$nb_par_page." "; 
	$requete = mysql_query($sql) or die( mysql_error()); 
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">

<head>

<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

<title>Base de Données</title>

</head>

<body>

<?php

if(isset($_POST['valider'])){ 
$categorie = $_POST['categories']; 

$sql = "SELECT * FROM produits WHERE id_categorie = '".$categorie."'"; 

$requete = mysql_query($sql) or die( mysql_error());?> 

<table border="1">

<tr ><th>&nbsp;ID produit&nbsp;</th><th>&nbsp;Nom produit&nbsp;</th></tr>
<?php while ($result = mysql_fetch_array($requete)) {?>
	<tr>
	<td align="center" valign="middle">&nbsp;<?php echo $result['ID_produit'];?>&nbsp;</td>
	<td align="center" valign="middle">&nbsp;<?php echo $result['nom_produit'];?>&nbsp;</td>
    <td align="center" valign="middle"><input type="button" name="Supprimer" value="Supprimer" onclick="supprimer(<?php echo $result['ID_produit']; ?>)"/></td> 
    <td align="center" valign="middle">

</form>
<?php

	//affichage
	echo '<table border="1">'; //tableau
	echo '<tr><th>ID produit</th><th>Nom produit</th></tr>'; 
	while ($result = mysql_fetch_array($requete)) {
		echo '<tr>'; //ligne
		echo '<td>'.$result['ID_produit'].'</td>'; //colonne
		echo '<td>'.$result['nom_produit'].'</td>';
		echo '</tr>'; //fin ligne
	}
	echo '</table>';

		//pagination:
	// gestion numeros de page + page courante
		$i=0;
		$j=1;
		
		if($nb_enr>$nb_par_page){
			while($i<$nb_pages){
				if($i!=$page_courante){
					echo "<a href=\"".$currentScript."?page=".$i."&categ=".$categorie."\">&nbsp; ".$j." &nbsp;</a>"; 
					//on passe par l'URL le numero de page demandée (commence à 0) et l'id_produit selectionné
				} else {
					echo  "<a href=\"".$currentScript."?page=".$i."&categ=".$categorie."\" >&nbsp;<b> ".$j." </b>&nbsp;</a>"; 
				   }
			$i++;
			$j++;
			}
		}	
}
?>



Mammouth du PHP | 672 Messages

14 oct. 2011, 14:57

Bonjour.

J'ai juste survolé le code - je n'aime pas trop le mélange PHP/HTML :oops: - mais je dirais que ton test ne passe pas à la première visualisation.
if(isset($_POST['valider']) || isset($_GET['page'])){
   // Pagination
}

Eléphant du PHP | 184 Messages

14 oct. 2011, 15:50

Oui je me doute bien qu'il y a un problème lors du premier affichage mais je n'arrive pas à mettre le doigt dessus :oops:

Mammouth du PHP | 672 Messages

14 oct. 2011, 16:22

Oui je me doute bien qu'il y a un problème lors du premier affichage mais je n'arrive pas à mettre le doigt dessus :oops:
if(isset($_POST['valider']) || isset($_GET['page'])){
   // Pagination
}
A priori, au premier passage tu ne remplis pas la condition...
=> $_POST['valider'] n'est pas défini et $_GET['page'] n'est pas défini (ce qui me semble logique en arrivant sur la page :roll: ).

Pourquoi fais-tu ce test ? Quel est (à ton avis) son utilité ?

Eléphant du PHP | 184 Messages

14 oct. 2011, 16:34

En fait, j'ai une autre page, qui comporte une liste déroulante.

On sélectionne une catégorie dans la liste, on valide, et théoriquement, on arrive sur cette page, qui affiche les produits en fonction de la catégorie demandée :(

Mammouth du PHP | 672 Messages

14 oct. 2011, 17:14

En fait, j'ai une autre page, qui comporte une liste déroulante.

On sélectionne une catégorie dans la liste, on valide, et théoriquement, on arrive sur cette page, qui affiche les produits en fonction de la catégorie demandée :(
- Commence par regarder le contenu des variables : print_r($_POST);
- Affiche les variables utilisée ($debut par exemple) et les requêtes.
- Essaye de comprendre pourquoi ça ne marche pas uniquement au premier passage (donc quand le POST est renseigné mais pas le GET, si j'ai suivi).
- Essaye de repérer dans le code la partie concernée.
- Mets des affichages au points stratégiques (dans les tests, pour vérifier si tu y passes, par exemple)
- Et essaye de simplifier ton code. Tu fais trois requêtes (quasi) identiques, tu fais plusieurs fois les mêmes tests (ou pas loin), tu utilises plusieurs fois les mêmes variables (qui en plus ont un nom générique)...

Dans ton cas, par exemple, le problème c'est :
Au premier passage = >Test sur POST
Tu affiches tous les enregistrements => une requête SQL qui renvoie tout.
Un moyen de débugger serait donc d'afficher quelque chose après chaque requête SQL, et de voir laquelle est utilisée au premier passage et pas après...

Eléphant du PHP | 184 Messages

14 oct. 2011, 18:05

Super effectivement c'était bien mes variables qui n'étaient pas les bonnes !
La pagination passe bien désormais :)

J'aimerai un petit conseil par contre pour mon bouton supprimer, car je n'arrive pas à l'intégrer en php et il ne marche plus tel quel:

<?php
//affichage
	echo '<table align="center" border="1">'; //tableau
	echo '<tr><th>&nbsp;ID produit&nbsp;</th><th>&nbsp;Nom produit&nbsp;</th></tr>'; 
	while ($result2 = mysql_fetch_array($requete)) {
		echo '<tr>'; //ligne
		echo '<td align="center" valign="middle">&nbsp;'.$result2['ID_produit'].'&nbsp;</td>'; //colonne
		echo '<td align="center" valign="middle">&nbsp;'.$result2['nom_produit'].'&nbsp;</td>';?>
        <td align="center" valign="middle"><input type="button" name="Supprimer" value="Supprimer" onclick="supprimer(<?php echo $result2['ID_produit']; ?>)"/></td> 
    <td align="center" valign="middle">

<?php 

echo '<a href="modifier.php?ID_produit='.$result2['ID_produit'].'">
Modifier</a>';

echo '</tr>'; //fin ligne
}
echo '</table>';
J'utilise ce script en bas de page, j'aimerai savoir, il n'y a pas un moyen peut être plus propre d'intégrer une supression sur ma table ?

Code : Tout sélectionner

<script type="text/javascript"> function supprimer(id) { if(confirm('Voulez vous vraiment supprimer ?')) { window.open("?Supprimer=Supprimer&id="+id,"_self"); } } </script>

Mammouth du PHP | 672 Messages

17 oct. 2011, 12:01

J'aimerai un petit conseil par contre pour mon bouton supprimer, car je n'arrive pas à l'intégrer en php et il ne marche plus tel quel:
Je ne comprends pas trop... Le code que tu donnes ne fonctionne plus ?
- Messages d'erreur ?
- Page blanche ?
- Il fonctionne mais ne produit pas le résultat attendu ?

1. Regarde le code source de la page, voir s'il y a quelque chose qui te semble bizarre.
2. Affiche les variables (et les requêtes) dans modifier.php, histoire de voir si le problème est à ce niveau.

Personnellement, je resterais sur du basique, sans JS et sans bouton (parce qu'un bouton hors formulaire (et dans un tableau), ce n'est pas W3C-compliant :oops: )
=> Au lieu de mettre un bouton et le JS pour gérer, construire en PHP le lien vers ?Supprimer=Supprimer&id=xx :
echo '<td align="center" valign="middle"><a href="LaPage.php?Supprimer=Supprimer&id='.$result2['ID_produit'].'" title="supprimer" class="supprimer">Supprimer</a></td>';
Après tu pourras toujours modifier en CSS le lien pour qu'il ressemble à un bouton...

Eléphant du PHP | 184 Messages

20 oct. 2011, 17:48

Merci beaucoup pour tes conseils :)

En fait j'ai utilisé le JS car j'aimerai demander une confirmation avant la suppression, histoire que la personne n'ai pas cliqué dessus sans le vouloir.

Il y a moyen de contourner ?

Mammouth du PHP | 672 Messages

21 oct. 2011, 09:25

En fait, j'ai tendance à travailler d'abord sans le JS, et seulement une fois que le "vrai" traitement (en PHP) est correct je rajoute la couche JS destinée à faciliter les choses pour l'utilisateur.
Il faut savoir que, même si c'est de plus en plus rare, il y a encore des gens qui ne l'utilisent pas. Du coup, tu ne peux pas te permettre de gérer les choses critiques uniquement par ce biais...

Pour la confirmation, deux solutions :
- En PHP => tu rajoutes une page intermédiaire qui demande confirmation. C'est lourd.
- En JS => Un simple alert() peut suffire. Par contre il faut garder en tête que potentiellement certains utilisateurs ne l'auront pas...

Cela-dit, le principe reste le même : tu fais un lien vers la page qui fait le traitement de la suppression.
Et pour le JS tu rajoutes une couche sur le lien, avec (par exemple) un message de confirmation.

Un exemple de page avec JS, qui valide le W3C et qui se "dégrade" (utilisable sans JS, donc) - avec jQuery parce que je suis un fainéant :oops: :
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr">
<head><title>Test</title></head>
<body><!-- blabla -->
<p><a class="supprimer" href="supprimer.php?id=10">supprimer 10</a></p>
<p><a class="supprimer" href="supprimer.php?id=20">supprimer 20</a></p>
<!-- blabla -->
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript">
$(document).ready(function () {
	$(".supprimer").click(function () {
		return confirm('Voulez vous vraiment supprimer ?');
	})
})	
</script></body></html>

Eléphant du PHP | 184 Messages

21 oct. 2011, 09:28

Super, merci beaucoup !

Merci pour cet explication instructive :)