comment garder une valeur de requete?

Eléphanteau du PHP | 19 Messages

12 mars 2009, 18:09

Hello
je tourne en rond depuis klk jours.
je cherche à afficher des resultats d'une base importante,donc sur plusieures pages.J'arrive à afficher une pagination,sauf que les pages suivantes ne gardent pas la requete récupérée du formulaire. donc je me disais que créer une session permettrait de garder cette requete sur chaque page appelées,je me trompe..?
et comment écrire et intégrer cette session si necessaire,car j'ai des retours parse errors.
Si vous avez une autre idée,je prends
(le script est classique pour pagination et requete de BDD)

Code : Tout sélectionner

<?php session_start() ; $recherche = isset($_POST['recherche']); //enregistrement d'une variable de session $_SESSION['recherche'] = $recherche; function barre_navigation ($nb_total, $nb_affichage_par_page, $debut, $nb_liens_dans_la_barre) { $barre = ''; // on recherche l'URL courante munie de ses paramètre auxquels on ajoute le paramètre 'debut' qui jouera le role du premier élément de notre LIMIT if ($_SERVER['QUERY_STRING'] == "") { $query = $_SERVER['PHP_SELF'].'?debut='; } else { $tableau = explode ("debut=", $_SERVER['QUERY_STRING']); $nb_element = count ($tableau); if ($nb_element == 1) { $query = $_SERVER['PHP_SELF'].'?'.$_SERVER['QUERY_STRING'].'&debut='; } else { if ($tableau[0] == "") { $query = $_SERVER['PHP_SELF'].'?debut='; } else { $query = $_SERVER['PHP_SELF'].'?'.$tableau[0].' '.$recherche.'debut='; } } } // on calcul le numéro de la page active $page_active = floor(($debut/$nb_affichage_par_page)+1); // on calcul le nombre de pages total que va prendre notre affichage $nb_pages_total = ceil($nb_total/$nb_affichage_par_page); // on calcul le premier numero de la barre qui va s'afficher, ainsi que le dernier ($cpt_deb et $cpt_fin) // exemple : 2 3 4 5 6 7 8 9 10 11 << $cpt_deb = 2 et $cpt_fin = 11 if ($nb_liens_dans_la_barre%2==0) { $cpt_deb1 = $page_active - ($nb_liens_dans_la_barre/2)+1; $cpt_fin1 = $page_active + ($nb_liens_dans_la_barre/2); } else { $cpt_deb1 = $page_active - floor(($nb_liens_dans_la_barre/2)); $cpt_fin1 = $page_active + floor(($nb_liens_dans_la_barre/2)); } if ($cpt_deb1 <= 1) { $cpt_deb = 1; $cpt_fin = $nb_liens_dans_la_barre; } elseif ($cpt_deb1>1 && $cpt_fin1<$nb_pages_total) { $cpt_deb = $cpt_deb1; $cpt_fin = $cpt_fin1; } else { $cpt_deb = ($nb_pages_total-$nb_liens_dans_la_barre)+1; $cpt_fin = $nb_pages_total; } if ($nb_pages_total <= $nb_liens_dans_la_barre) { $cpt_deb=1; $cpt_fin=$nb_pages_total; } // si le premier numéro qui s'affiche est différent de 1, on affiche << qui sera un lien vers la premiere page if ($cpt_deb != 1) { $cible = $query.(0); $lien = '<A HREF="'.$cible.'"><<</A> '; } else { $lien=''; } $barre .= $lien; // on affiche tous les liens de notre barre, tout en vérifiant de ne pas mettre de lien pour la page active for ($cpt = $cpt_deb; $cpt <= $cpt_fin; $cpt++) { if ($cpt == $page_active) { if ($cpt == $nb_pages_total) { $barre .= $cpt; } else { $barre .= $cpt.' - '; } } else { if ($cpt == $cpt_fin) { $barre .= "<A HREF='".$query.(($cpt-1)*$nb_affichage_par_page).'&recherche='.$_POST['recherche']; $barre .= "'>".$cpt."</A>"; } else { $barre .= "<A HREF='".$query.(($cpt-1)*$nb_affichage_par_page).'&recherche='.$_POST['recherche']; $barre .= "'>".$cpt."</A> - "; } } } $fin = ($nb_total - ($nb_total % $nb_affichage_par_page)); if (($nb_total % $nb_affichage_par_page) == 0) { $fin = $fin - $nb_affichage_par_page; } // si $cpt_fin ne vaut pas la dernière page de la barre de navigation, on affiche un >> qui sera un lien vers la dernière page de navigation if ($cpt_fin != $nb_pages_total) { $cible = $query.$fin; $lien = ' <A HREF="'.$cible.'">>></A>'; } else { $lien=''; } $barre .= $lien; return $barre; } ?> <html> <head> <title>Les livres de la bibliothèque</title> </head> </body> Les différents restaurants :<br /><br /> <?php // on se connecte à notre base $base = mysql_connect ('localhost', 'root', ''); mysql_select_db ('youresto', $base); // Récupère la variable $recherche = isset($_POST['recherche']) ? $_POST['recherche'] : ''; // on prépare une requête permettant de calculer le nombre total d'éléments qu'il faudra afficher sur nos différentes pages $sql = "SELECT count(city) FROM jos_restaurante WHERE city LIKE '".$recherche."%'"; // on exécute cette requête $resultat = mysql_query($sql) or die('Erreur SQL !<br />'.$sql.'<br />'.mysql_error()); // on récupère le nombre d'éléments à afficher $nb_total = mysql_fetch_row($resultat); // on teste si ce nombre de vaut pas 0 if (($nb_total = $nb_total[0]) == 0) { echo 'Aucune réponse trouvée'; } else { echo '<table>'."\n";'<tr><td><td>Description</td></tr>'; // sinon, on regarde si la variable $debut (le x de notre LIMIT) n'a pas déjà été déclarée, et dans ce cas, on l'initialise à 0 if (!isset($_GET['debut'])) $_GET['debut'] = 0; $nb_affichage_par_page = 15; // Préparation de la requête avec le LIMIT $sql = "SELECT title, city FROM jos_restaurante WHERE city LIKE '".$recherche."%' ORDER BY city ASC LIMIT ".$_GET["debut"].",".$nb_affichage_par_page; echo($sql); // on exécute la requête $req = mysql_query($sql) or die('Erreur SQL !<br />'.$sql.'<br />'.mysql_error()); // on va scanner tous les tuples un par un while ($data = mysql_fetch_array($req)) { // on affiches les résultats dans la <table> echo '<tr><td><td>' , htmlentities(trim($data['title'])) , '</td></tr>'; echo '<tr><td><td>' , htmlentities(trim($data['city'])) , '</td></tr>'."\n"; } // on libère l'espace mémoire alloué pour cette requête mysql_free_result ($req); echo '</table><br />'."\n"; // on affiche enfin notre barre echo '<span class="gras">'.barre_navigation($nb_total, $nb_affichage_par_page, $_GET['debut'], 10).'</span>'; } // on libère l'espace mémoire alloué pour cette requête mysql_free_result ($resultat); // on ferme la connexion à la base de données. mysql_close (); echo '</table><br />'; ?> </body> </html>

merci
Modifié en dernier par chanteur06 le 13 mars 2009, 11:40, modifié 1 fois.

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

12 mars 2009, 18:41

Modération :
chanteur06, afin d'améliorer la lisibilité de ton message,
pense à utiliser les balises [code] ou [php] (selon le langage utilisé).

Elles sont disponibles au-dessus de la zone de saisie de ton message
lorsque tu postes un nouveau message.

Des indications sont disponibles sur la manière de mettre en forme vos messages dans la FAQ
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Invité
Invité n'ayant pas de compte PHPfrance

12 mars 2009, 18:44

dsl il me semblait les avoir utlisiées

Eléphanteau du PHP | 13 Messages

13 mars 2009, 11:17

Salut, je n'ai pas regardé tout ton code car sa ne m'avancerait à rien!

Donc je pense que tu devrais faire ainsi ::
if (isset($_SESSION['recherche'])) $recherche = $_SESSION['recherche'];
else if (isset($_POST['recherche'])) $recherche = $_POST['recherche'];

//enregistrement d'une variable de session
$_SESSION['recherche'] = $recherche; 

Eléphanteau du PHP | 19 Messages

13 mars 2009, 11:44

j'ai mis ton code en haut du script ..et toujours le meme soucis....
je tourne ne rond depuis des jours,je vais voir de mon coté mais si tu as un script qui peut convenir...
il faut un formulaire de recherche,connection à la base,recupérer la valeur de la recherche et afficher le resultat en pagination....
je commence à etre pret à payer....lol

Modérateur PHPfrance
Modérateur PHPfrance | 2575 Messages

13 mars 2009, 11:59

En principe, t'as pas besoin de session pour retrouver les données paginées. T'as besoin simplement de mémoriser le n° du premier enregistrement affiché dans la page en cours et le nombre d'enregistrements affichés par page.

Si ta base de données est sous MYSQL, la solution est simplifiée. Est-ce que c'est le cas?
--------//////----//---//----//////
-------//---//----//---//----//---//
------//////----//////-----//////
-----||--------||--||---||
Prendre le recul n'est pas une perte de temps.


ps: Affrontez moi dans l'arène

Eléphanteau du PHP | 13 Messages

13 mars 2009, 13:34

Exact "sadeq", faut voir sa!

Si c'est juste l'affichage de la bdd sous mysql sur plusieurs pages, suffit de lui indiquer une limite!
Par contre, faut aussi faire la fonction qui affichera le nombre de pages et les liens qui vont avec ...
// En passant le numéro de la page en GET
$page = (int)$_GET['page'];
$nbr_parpage = 15;
$nbr_debut = (($page <= 1)?0:$nbr_parpage * ($page - 1));

$result = mysql_query('SELECT * FROM `ma_table` ORDER BY id DESC LIMIT '.$nbr_debut.', '.$nbr_parpage);
Il faut biensur l'adapter à ton code!

Eléphanteau du PHP | 19 Messages

14 mars 2009, 13:18

et ça correspond pas à ça...? :

Code : Tout sélectionner

// sinon, on regarde si la variable $debut (le x de notre LIMIT) n'a pas déjà été déclarée, et dans ce cas, on l'initialise à 0 if (!isset($_GET['debut'])) $_GET['debut'] = 0; $nb_affichage_par_page = 15; // Préparation de la requête avec le LIMIT $sql = "SELECT title, city FROM jos_restaurante WHERE city LIKE '".$recherche."%' ORDER BY city ASC LIMIT ".$_GET["debut"].",".$nb_affichage_par_page; echo($sql); // on exécute la requête $req = mysql_query($sql) or die('Erreur SQL !<br />'.$sql.'<br />'.mysql_error());

.....?[/code]

Modérateur PHPfrance
Modérateur PHPfrance | 2575 Messages

15 mars 2009, 18:36

SI si, ça correspond.
--------//////----//---//----//////
-------//---//----//---//----//---//
------//////----//////-----//////
-----||--------||--||---||
Prendre le recul n'est pas une perte de temps.


ps: Affrontez moi dans l'arène

Eléphanteau du PHP | 19 Messages

16 mars 2009, 15:10

ben c'est bien ce qui est sur le script et ça fonctionne pas,ma requete se vide au click de la page suivante....!

Modérateur PHPfrance
Modérateur PHPfrance | 2575 Messages

16 mars 2009, 17:50

...... au click de la page suivante....!
Le click sur le lien "Page Suivante" doit transmettre tous les paramètres exigés par ton code.
Voici une suggestion de solution :
// La variable $recherche
$recherche = isset($_GET['recherche']) ? $_GET['recherche'] : "";

// La variable $debut
$debut = isset($_GET['debut']) ? $_GET['debut'] : 0;

// nombre de lignes par page
$nb_affichage_par_page = 15;

// Préparation de la requête avec le LIMIT
$sql = "SELECT title, city FROM jos_restaurante WHERE city LIKE '" . $recherche . "%' ORDER BY city ASC LIMIT " . $debut . "," . $nb_affichage_par_page;

// on exécute la requête
$req = mysql_query($sql) or die('Erreur SQL !<br />'.$sql.'<br />'.mysql_error()); 

// Construction du lien "page suivante"
$suivant = $debut + $nb_affichage_par_page;
echo '<a href="?recherche=' . $recherche . '&debut=' . $suivant . '" >Page Suivante</a>';

// Construction du lien "page précédente"
$precedent = $debut - $nb_affichage_par_page;
if ($precedent <0) $precedent = 0; // Correction du début si négatif
echo '<a href="?recherche=' . $recherche . '&debut=' . $precedent. '" >Page Précédente</a>';

// Affichage des données d'une page
....

Ou alors si tu utilise des boutons de formulaire, tu dois écrire le formulaire comme ça:
// La variable $recherche
$recherche = isset($_GET['recherche']) ? $_GET['recherche'] : "";

// La variable $debut
$debut = isset($_GET['debut']) ? $_GET['debut'] : 0;

// nombre de lignes par page
$nb_affichage_par_page = 15;

// Préparation de la requête avec le LIMIT
$sql = "SELECT title, city FROM jos_restaurante WHERE city LIKE '" . $recherche . "%' ORDER BY city ASC LIMIT " . $debut . "," . $nb_affichage_par_page;

// on exécute la requête
$req = mysql_query($sql) or die('Erreur SQL !<br />'.$sql.'<br />'.mysql_error()); 

// Construction du lien "page suivante"
$suivant = $debut + $nb_affichage_par_page;

// Construction du lien "page précédente"
$precedent = $debut - $nb_affichage_par_page;
if ($precedent <0) $precedent = 0; // Correction du début si négatif

// Affichage du formulaire de saisie du critère recherché
echo '<form action="GET"><p>
Recherche <input type="text" name="recherche" value="' . $recherche . '" />
<input type="submit" value="Rechercher" />
</p></form>';

// Affichage du bouton page suivante
echo '<form action="GET"><p>
<input type="hidden" name="recherche" value="' . $recherche . '" />
<input type="hidden" name="debut" value="' . $suivant . '" />
<input type="submit" value="Page Suivante" />
</p></form>';

// Affichage du bouton page précédente
echo '<form action="GET"><p>
<input type="hidden" name="recherche" value="' . $recherche . '" />
<input type="hidden" name="debut" value="' . $precedent. '" />
<input type="submit" value="Page Précédente" />
</p></form>';

// Affichage des données d'une page
....

Les champs de type 'hidden' (caché) rappellent les valeurs de paramètres à renvoyer systématiquement quand un bouton submit est activé sur un formulaire.
Dans cet exemple, on a un formulaire pour chaque bouton "Page Suivante" ou "Page Précédente" qui rappelle les 2 paramètres "recherche" et "debut".
Le paramètre "recherche" reste constant quelque soit la pagination, par contre le paramètre "debut" va changer de valeur selon le recalcule des variables $suivant et $precedent.

Donc, dans tous les cas, on aura, une valeur $recherche, une valeur $suivant attachée au bouton "Page Suivante" et une valeur $precedent attachée au bouton "Page Précédente" .
--------//////----//---//----//////
-------//---//----//---//----//---//
------//////----//////-----//////
-----||--------||--||---||
Prendre le recul n'est pas une perte de temps.


ps: Affrontez moi dans l'arène