Page 1 sur 2

Catalogue en plusieurs pages

Posté : 22 mars 2013, 13:15
par Stalker
Bonjour.

J'aimerais fractionner un catalogue en plusieurs pages et accéder à ces dernières grâce à un menu déroulant.

J'ai le code pour faire le menu déroulant (il marche bien):
echo"Aller à la page:";
//liste déroulante
  $selected = '';
  echo '<select name="pages">',"\n";
  for($i=1; $i<=50; $i++)
  {
    echo "\t",'<option value="', $i ,'"', $selected ,'>', $i ,'</option>',"\n";
    $selected="''; 
  }
echo '</select>',"\n";
J'aimerais savoir comment récupérer le numéro de page que j'ai sélectionner et l'injecter dans ma requête SQL.

Merci d'avance.

Re: Catalogue en plusieurs pages

Posté : 22 mars 2013, 17:19
par sadeq
Bonjour,
Il faut mettre ta liste de pages dans un <form> puis programmer un submit à chaque changement de choix dans la liste. Comme ça PHP reçoit le numéro de la page sélectionné puis l’intègre dans la requête SQL. Comme ça :
<?php
// num page sélectionné dans la liste par le formulaire
$pages = isset($_GET['pages']) ? $_GET['pages'] : 0;

//affichage de la liste avec rappel de l’élément sélectionné
echo"Aller à la page:";
//liste déroulante
  $selected = '';
  echo '<form><select name="pages" onchange="this.form.submit()">',"\n";
  for($i=1; $i<=50; $i++)
  {
    $selected = ($pages==$i) ? " selected " : "";
    echo "\t",'<option value="', $i ,'"', $selected ,'>', $i ,'</option>',"\n";
  }
echo '</select></form>',"\n";

//requête SQL utilisant la page sélectionnée
if (isset($_GET['pages'])){
   $SQL = "SELECT * FROM catalogue WHERE page = '" . $pages. "'";
   echo $SQL;
}
?>

Re: Catalogue en plusieurs pages

Posté : 22 mars 2013, 17:34
par Stalker
Merci de ce code, mais j'ai du mal à le comprendre et du coup à l'intégrer à ce que j'ai déjà fait.

Est il possible d'utiliser la variable "$pages" dans une requete du genre:
$requete1="	SELECT * 
			FROM  `etoile` 
			LIMIT '".$pages."',30";
J'ai essayé, en vain.

Re: Catalogue en plusieurs pages

Posté : 22 mars 2013, 22:01
par sadeq
Oui mais ce n'est pas comme ça. Il faut calculer le numéro de l'enregistrement à afficher par LIMIT à chaque changement de page. Et voici le principe :
Puisque tu sélectionne à chaque fois 30 enregistrements par page, donc le numéro d'enregistrement de début de chaque page est egal au numéro de la page demandée (-1) * 30. Ce qui donne le code suivant
//num enreg debut page
$num_enreg =  ($pages - 1) * 30;

//Sélection des enregistrements de la page demandée
$requete1="	SELECT * 
			FROM  `etoile` 
			LIMIT ".$num_enreg.",30";
Voilà.

Re: Catalogue en plusieurs pages

Posté : 23 mars 2013, 23:21
par Stalker
Hum, ça ne marche pas. de base quand la page charge, il est écrit que la requête ne peut être exécutée, et quand je sélectionne un chiffre, ça me lance sur ma page d’accueil.

Re: Catalogue en plusieurs pages

Posté : 24 mars 2013, 00:00
par sadeq
Il faut tester ce code à part dans une page de test sans l'intégrer dans ta page actuelle et dis-nous s'il t'affiche bien la bonne requête :
<?php
// num page sélectionné dans la liste par le formulaire
$pages = isset($_GET['pages']) ? $_GET['pages'] : 0;

//affichage de la liste avec rappel de l’élément sélectionné
echo"Aller à la page:";
//liste déroulante
  $selected = '';
  echo '<form><select name="pages" onchange="this.form.submit()">',"\n";
  for($i=1; $i<=50; $i++)
  {
    $selected = ($pages==$i) ? " selected " : "";
    echo "\t",'<option value="', $i ,'"', $selected ,'>', $i ,'</option>',"\n";
  }
echo '</select></form>',"\n";

//requête SQL utilisant la page sélectionnée
if (isset($pages)){
   $num_enreg = ($pages - 1) * 30;
   $SQL = "SELECT * FROM etoile LIMIT  " . $num_enreg. ",30";
   echo $SQL;
}
?>

Re: Catalogue en plusieurs pages

Posté : 24 mars 2013, 16:10
par Stalker
Yep ça marche! Que dois-je modifier pour que ça marche également en intégré? De quelles informations avez vous besoin pour me répondre?

Re: Catalogue en plusieurs pages

Posté : 24 mars 2013, 19:55
par sadeq
C'est parfait, il faut que tu nous donnes le code existant de ta page où la liste des pages doit apparaître (page html + code php où se trouve la requête sql)

Re: Catalogue en plusieurs pages

Posté : 24 mars 2013, 20:59
par Stalker
Le code que vous m'avez donné marche bien dans un nouveau fichier.

Javais déjà essayer d'intégrer dans mon catalogue de départ ce que vous m'avez proposé. Voici ce qui se passe. Lorsque je rentre sur mon catalogue non intégré dans mon "index" j'ai effectivement mon menu déroulant, mais la première page ne s'affiche pas, au lieu de cela, on me dit que la requête ne peut être executée. Par contre cela marche bien lorsque je selectionne une page, cela me l'affiche (même la première).

Après, comme je l'ai dit, intégré dans mon "index", la requete ne s'execute toujours pas (sans doutes normal), mais en sélectionnant une page, cela me redirige vers la page d'acceuil avec dans l'URL "index.php?pages=2".

Cela dit j'ai essayé de "tricher" en écrivant dans l'URL l'adresse de mon catalogue le numero de page: "http://cyberexpert.net/alex/index.php?C ... ue&pages=2" et ça marche! Cela vous donnera peut être une idée de la solution à ce problème

Je vous donne (en résumé) le code de ma page:
$pages = isset($_GET['pages']) ? $_GET['pages'] : 0;
//affichage de la liste avec rappel de l’élément sélectionné
echo"Aller à la page:";
//liste déroulante
  $selected = '';
  echo '<form><select name="pages" onchange="this.form.submit()">',"\n";
  for($i=1; $i<=25; $i++)
  {
    $selected = ($pages==$i) ? " selected " : "";
    echo "\t",'<option value="', $i ,'"', $selected ,'>', $i ,'</option>',"\n";
  }
echo '</select></form>',"\n";
//num enreg debut page
$num_enreg =  ($pages - 1) * 30;

echo '[...]';

$requete1="SELECT * 
           FROM  `etoile` 
           LIMIT ".$num_enreg.",30";
$resultat1=mysql_query($requete1)
           or die ("la requete ne peut pas être executee");
while($ligne=mysql_fetch_array ($resultat1))
	{
	extract($ligne);
	echo "[...tableau...]";
        }

Re: Catalogue en plusieurs pages

Posté : 25 mars 2013, 10:07
par sadeq
Ok, j'ai compris.

1. Pour éviter l'erreur de redirection sur la page d'accueil c'est simple : il faut satisfaire l'URL qui exige le champ CONTENU, et pour ce faire, il faut ajouter un champ caché nommé "CONTENU" dans le form
<form><input type="hidden" name="CONTENU" value="catalogue"/><select name="pages" onchange="this.form.submit()">
pour envoyer la valeur 'catalogue' dans l'URL avec le champ pages qui est transmis par la liste.

2. Pour veiller à ce que la requête soit toujours correcte (et surtout au premier chargement de la page) il faut que la variable $num_enreg soit mise à zéro quand la variable $pages n'a pas de valeur ou est <= à zéro. Et pour en être sûr il faut écrire une affectation conditionnelle comme ça :
$num_enreg = isset($pages) && $pages>0 ? ($pages-1)*30 : 0;
Ou bien, il faut que $pages soit initialisée à 1 par défaut.
$pages = isset($_GET['pages']) ? $_GET['pages'] : 1;

Dans tous les cas, voici le corrigé général :
$pages = isset($_GET['pages']) ? $_GET['pages'] : 1;
//affichage de la liste avec rappel de l’élément sélectionné
echo"Aller à la page:";
//liste déroulante
  $selected = '';
  echo '<form><input type="hidden" name="CONTENU" value="catalogue"/><select name="pages" onchange="this.form.submit()">',"\n";
  for($i=1; $i<=25; $i++)
  {
    $selected = ($pages==$i) ? " selected " : "";
    echo "\t",'<option value="', $i ,'"', $selected ,'>', $i ,'</option>',"\n";
  }
echo '</select></form>',"\n";
//num enreg debut page
$num_enreg =  isset($pages) && $pages>0 ? ($pages - 1) * 30 : 0;

echo '[...]';

$requete1="SELECT *
           FROM  `etoile`
           LIMIT  ".$num_enreg.",30";
$resultat1=mysql_query($requete1)
           or die ("la requete ne peut pas être executee");
while($ligne=mysql_fetch_array ($resultat1))
        {
        extract($ligne);
        echo "[...tableau...]";
        }
 

Re: Catalogue en plusieurs pages

Posté : 25 mars 2013, 11:18
par Stalker
Merci, ça marche très bien. Et ça va me permettre de mieux comprendre comment tout ça marche, donc très constructif.

Re: [RESOLU] Catalogue en plusieurs pages

Posté : 09 avr. 2013, 11:09
par Stalker
je remonte un peu le sujet.

Comme le script peut il détecter le nombre de page existantes? La j'ai mis un nombre de pages que j'ai compté moi même mais j'aimerais qu'il le fasse automatiquement.

Merci d'avance.

Re: [RESOLU] Catalogue en plusieurs pages

Posté : 09 avr. 2013, 20:24
par sadeq
Salut,

Il faut compter les enregistrements dans une requête SQL SELECT. Le nombre de pages est le nombre d'enregistrements divisé par 30 (+1)
car : pour 20 enregistrements par exemple on aura une seule page => (20/30)+1
et pour 35 enregistrements on aura 2 pages => (35/30)+1
etc.
Bien sur, il s'agit de faire une division entière (inval() en PHP)

Voici donc une proposition de solution :
//n° de la page demandée 
$pages = isset($_GET['pages']) ? $_GET['pages'] : 1;

//calcul du nombre de pages = partie entière(nb d'enregistrements /30) +1
$requete0="SELECT COUNT(*) as nb FROM  `etoile`";
$resultat0=mysql_query($requete0) or die ("la requete ne peut pas être executee");
if ($ligne=mysql_fetch_array ($resultat0) && $ligne['nb']>0)  { $nb_pages = intval($ligne['nb']/30)+1; } else { $nb_pages = 0; }

//affichage de la liste avec rappel de l’élément sélectionné
echo"Aller à la page:";
//liste déroulante
  $selected = '';
  echo '<form><input type="hidden" name="CONTENU" value="catalogue"/><select name="pages" onchange="this.form.submit()">',"\n";
  for($i=1; $i<=$nb_pages; $i++)
  {
    $selected = ($pages==$i) ? " selected " : "";
    echo "\t",'<option value="', $i ,'"', $selected ,'>', $i ,'</option>',"\n";
  }
echo '</select></form>',"\n";
//num enreg debut page
$num_enreg =  isset($pages) && $pages>0 ? ($pages - 1) * 30 : 0;

echo '[...]';

$requete1="SELECT *
           FROM  `etoile`
           LIMIT  ".$num_enreg.",30";
$resultat1=mysql_query($requete1)
           or die ("la requete ne peut pas être executee");
while($ligne=mysql_fetch_array ($resultat1))
        {
        extract($ligne);
        echo "[...tableau...]";
        }
 

Re: [RESOLU] Catalogue en plusieurs pages

Posté : 10 avr. 2013, 09:51
par Stalker
Pour ce que tu me donne, le catalogue s'affiche bien, je peux changer de page en entrant ?pages=X dans l'URL, mais il n'y a aucun chiffre dans le menu défillant.

Re: [RESOLU] Catalogue en plusieurs pages

Posté : 10 avr. 2013, 14:41
par sadeq
Désolé j'ai oublié des parenthèses dans le IF. voici le corrigé :
//calcul du nombre de pages = partie entière(nb d'enregistrements /30) +1
$requete0="SELECT COUNT(*) as nb FROM  `etoile`";
$resultat0=mysql_query($requete0) or die ("la requete ne peut pas être executee");
if (  ($ligne=fetch_array($resultat0))  && $ligne['nb']>0 )  { $nb_pages = intval($ligne['nb']/30)+1; } else { $nb_pages = 0; }