Page 1 sur 1

PHP & Pagination avec extraction de BDD MySQL

Posté : 23 mai 2012, 13:58
par Pok
Bonjour,

Je débute en php, et j'essaye de monter un moteur de recherche avec extraction de BDD (mysql / phpmyadmin). J'ai pondu un mix à partir des tuto/exemples... trouvés sur le net en essayant de comprendre comment ça fonctionne. Helas mon système de pagination ne fonctionne pas depuis que j'ai tout passé en mode FULLTEXT (Ajout d'index FULLTEXT dans la BDD, et script php normalement adapté (de ce que j'ai pu en comprendre)).

Observez le résultat : http://www.levac.fr/test/moteur.php Faites une recherche sur le mot-clé "cable", les résultats s'affichent en 1ere page OK..... la pagination s'affiche en bas OK... il existe bel et bien 3 pages pour les résultats du mot clé "cable" OK ........ MAIS dès qu'on clique sur la plage 2 ou 3 ... plus rien ! Il semblerait que lorsqu'on change de page, on perd le mot-clé...... mais pourquoiiii snif ?! Avez vous une idée, que vous pourriez m'expliquer le plus clairement possible s'il vous plait ?

Merci pour l'aide que vous pourrez m'apporter.

Ci-dessous l'image montrant les index fulltext crées :
Image

Puis voici mon code :

Code : Tout sélectionner

<!DOCTYPE html> <html> <head> <title>Recherche</title> <style> .pagination { line-height:2em; } .pagination a, .pagination span { padding:0.2em 0.5em; } .pagination a { border:1px solid #9AAFE5; color:#105CB6; text-decoration:none; } .pagination a:hover { border:1px solid #296BB5; color:#000031; } .pagination .prevnext { font-weight:bold; } .pagination span.disabled { border:1px solid #DDDDDD; color:#999999; } .pagination span.current { border:1px solid #2E6AB1; background-color:#2E6AB1; color:#ffffff; font-weight:bold; } </style> </head> <body> <? mysql_connect('host',bdd','pass'); //ce sont pas vrai log hein... inutile de montrer ça à tout le monde mysql_select_db('bdd'); // idem, pas le vrai ! $requete = htmlspecialchars(str_replace(' ',' +',' '.$_POST['requete'])); print $requete; function pagination($current_page, $nb_pages, $link='?page=%d', $around=3, $firstlast=1) { $pagination = ''; $link = preg_replace('`%([^d])`', '%%$1', $link); if ( !preg_match('`(?<!%)%d`', $link) ) { $link .= '%d'; } if ( $nb_pages > 1 ) { // Lien précédent if ( $current_page > 1 ) { $pagination .= '<a class="prevnext" href="'.sprintf($link, $current_page-1).'" title="Page précédente">&laquo; Précédent</a>'; } else { $pagination .= '<span class="prevnext disabled">&laquo; Précédent</span>'; } // Lien(s) début for ( $i=1 ; $i<=$firstlast ; $i++ ) { $pagination .= ' '; $pagination .= ($current_page==$i) ? '<span class="current">'.$i.'</span>' : '<a href="'.sprintf($link, $i).'">'.$i.'</a>'; } // ... après pages début ? if ( ($current_page-$around) > $firstlast+1 ) { $pagination .= ' &hellip;'; } // On boucle autour de la page courante $start = ($current_page-$around)>$firstlast ? $current_page-$around : $firstlast+1; $end = ($current_page+$around)<=($nb_pages-$firstlast) ? $current_page+$around : $nb_pages-$firstlast; for ( $i=$start ; $i<=$end ; $i++ ) { $pagination .= ' '; if ( $i==$current_page ) { $pagination .= '<span class="current">'.$i.'</span>'; } else { $pagination .= '<a href="'.sprintf($link, $i).'">'.$i.'</a>'; } } // ... avant page nb_pages ? if ( ($current_page+$around) < $nb_pages-$firstlast ) { $pagination .= ' &hellip;'; } // Lien(s) fin $start = $nb_pages-$firstlast+1; if( $start <= $firstlast ) { $start = $firstlast+1; } for ( $i=$start ; $i<=$nb_pages ; $i++ ) { $pagination .= ' '; $pagination .= ($current_page==$i) ? '<span class="current">'.$i.'</span>' : '<a href="'.sprintf($link, $i).'">'.$i.'</a>'; } // Lien suivant if ( $current_page < $nb_pages ) { $pagination .= ' <a class="prevnext" href="'.sprintf($link, ($current_page+1)).'" title="Page suivante">Suivant &raquo;</a>'; } else { $pagination .= ' <span class="prevnext disabled">Suivant &raquo;</span>'; } } return $pagination; } // Numero de page (1 par défaut) if( isset($_GET['page'])){ $page = $_GET['page']; } else { $page = 1; } // Nombre d'info par page $pagination = 10; // Numéro du 1er enregistrement à lire $limit_start = ($page-1)*$pagination; $sql = "SELECT * FROM produits WHERE MATCH (DESIGNATION, DESCRIPTION) AGAINST ('%$requete%' IN BOOLEAN MODE) ORDER BY id DESC LIMIT $limit_start, $pagination"; $resultat = mysql_query($sql); while( $donnee = mysql_fetch_assoc($resultat) ){ ?> <a href="<? echo $donnee['LIEN']; ?>"> <? echo "<h4>{$donnee['DESIGNATION']}</h4>"; ?></a><? echo $donnee['DESCRIPTION']; echo "<hr/>"; } // Nb d'enregistrement total $sql = "SELECT COUNT(ID) as nbArt FROM produits WHERE MATCH (DESIGNATION, DESCRIPTION) AGAINST ('%$requete%' IN BOOLEAN MODE)"; $req = mysql_query($sql) or die(mysql_error()); $data = mysql_fetch_assoc($req); $nbArt = $data['nbArt']; // Pagination $nb_pages = ceil($nbArt/$pagination); // Affichage echo '<p class="pagination">'.pagination($page,$nb_pages).'</p>'; ?> </body> </html>

Re: PHP & Pagination avec extraction de BDD MySQL

Posté : 24 mai 2012, 18:07
par moogli
Salut,

Le problème est simple :
$_POST['requete'] n'existe que la première fois. La seconde fois cela devrait t'affichera et fait que $requete est null.
Donc pd de recherche ;)

Correction :
- utilise $_REQUEST['requete'] plutôt que post ET ajoute le paramètre de recherche dans l'url (en utilisant requete comme nom de variable tu n'aura plus de soucis.
- autre solution utiliser une variable de session et rester correctement l'existence de l'index dans le tableau post, s'il n'existe pas la même chose en session et s'il n'existe pas erreur ;)

Pour le test utilise la fonction empty.

@+

Re: PHP & Pagination avec extraction de BDD MySQL

Posté : 30 mai 2012, 11:09
par Invité
Merci pour cet élément de réponse. Après quelques acharnements d'essais, je n'y arrive pas. Ce qui me semble le plus logique à écrire c'est la partie suivante, modifiée comme selon les indications :

$requete = htmlspecialchars(str_replace(' ',' +',' '.$_REQUEST['requete']));
print $requete;

function pagination($current_page, $nb_pages, $link='?page=%d&requete=JE_SAIS_PAS_QUOI_METTRE_ICI', $around=3, $firstlast=1)
__________________________________

J'ai testé avec $link='?page=%d&requete=cable' et ça fonctionne bien, sauf que dans la zone de saisie les gens ne vont pas forcement écrire "cable", il faut bien que j'écrive là, à la place de cable, ... et ben la requete, mais j'trouve pas la bonne manière d'écrire ça en php. Need help please. Y'a-t-il autre chose à rajouter ailleurs ? un $_GET machin chose en plus ? et que dois-je écrire à la place de mon "JE_SAIS_PAS_QUOI_METTRE_ICI". J'ai bien essayé d'ecrire $link='?page=%d&requete=$requete' mais ça ne fonctionne pas.
__________________________________

Pour ce qui est des variables session, ça me dépasse totalement.
Merci pour votre patience.

Re: PHP & Pagination avec extraction de BDD MySQL

Posté : 13 août 2012, 14:08
par Neo-Fx
Bonjour Pok,

J'ai pus voir que sur ta page de test ou bien sur ton site que la recherche + pagination fonctionne.
Donc tu as trouvé la solution non ?!

Pourrais-tu m'expliquer comment tu as fais car j'ai quasiment le même souci.

J'ai un moteur de recherche dynamique (en php+jquery) et à la pagination, je bloque...

Merci d'avance !

Re: PHP & Pagination avec extraction de BDD MySQL

Posté : 09 avr. 2014, 09:53
par oli
Salut,

Le problème est simple :
$_POST['requete'] n'existe que la première fois. La seconde fois cela devrait t'affichera et fait que $requete est null.
Donc pd de recherche ;)

Correction :
- utilise $_REQUEST['requete'] plutôt que post ET ajoute le paramètre de recherche dans l'url (en utilisant requete comme nom de variable tu n'aura plus de soucis.


@+
je tournais en rond depuis 3 jours avec le même problème cité plus haut et ça marche nickel avec $_request :D
merci à toi moogli

Re: PHP & Pagination avec extraction de BDD MySQL

Posté : 09 avr. 2014, 17:13
par moogli
de rien

@+