PHP & Pagination avec extraction de BDD MySQL

Pok
Invité n'ayant pas de compte PHPfrance

23 mai 2012, 13:58

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>

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

24 mai 2012, 18:07

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.

@+
Il en faut peu pour être heureux ......

Invité
Invité n'ayant pas de compte PHPfrance

30 mai 2012, 11:09

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.

Neo-Fx
Invité n'ayant pas de compte PHPfrance

13 août 2012, 14:08

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 !

oli
Invité n'ayant pas de compte PHPfrance

09 avr. 2014, 09:53

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

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

09 avr. 2014, 17:13

de rien

@+
Il en faut peu pour être heureux ......