Problème affichage - PHP & MySQL

Fermé
termi-zzz Messages postés 63 Date d'inscription mardi 18 décembre 2007 Statut Membre Dernière intervention 12 mai 2009 - 20 déc. 2007 à 19:13
 Alain42 - 22 déc. 2007 à 11:51
Bonjour,

je viens de créer un mini-moteur de recherche sur mon site (depuis une table/base de données) et je rencontre un petit problème pour afficher les résultats sur plusieurs pages...


Ma page actuelle (qui fonctionne) :

//si pas de mots-clés supérieurs à 3 chiffres on demande une nouvelle recherche
// problème avec les plusieurs pages quand ça réactualise
if (($_POST["text"] == "")||($_POST["text"] == "%")||(strlen($_POST["text"])<=3)) {
echo '<font class="mini"><font class="gris">Recherche - Il y a 0 résultat pour : '.$_POST["text"].'</font></font><br><hr><br>';
echo '<font class="letter">V</font>euillez reformuler votre recherche plus clairement s\'il vous plaît, pas assez précis pour trouver un truc !<br><br>';
}

//sinon on commence la requête
else {
$req = mysql_query("SELECT * from recherche where recherche_motscles LIKE '%$_POST[text]%' ORDER BY recherche_priority ASC ")
or die ("erreur req ".mysql_error());
$res= mysql_num_rows($req);

//si les résultats sont supérieurs à 27 on demande une nouvelle recherche
if ($res>27) {
echo '<font class="mini"><font class="gris">Recherche - Il y a '.$res.' résultats pour : '.$_POST["text"].'</font></font><br><hr><br>';
echo '<font class="letter">V</font>euillez reformuler votre recherche plus clairement s\'il vous plaît, trop de résultats !<br><br>';
}

//sinon
else {

//si les résultats sont supérieurs à 0 on affiche la recherche
if ($res>0) {
echo '<font class="mini"><font class="gris">Recherche - Il y a '.$res.' résultat(s) pour : '.$_POST["text"].'</font></font><br><hr><br>';

$result = mysql_query("SELECT * from recherche where recherche_motscles LIKE '%$_POST[text]%' ORDER BY recherche_priority ASC");
while( $sortie = mysql_fetch_array($result))
{
echo '<font class="titre"><a href="'.$sortie['recherche_url'].'">'.$sortie['recherche_titre'].'</a>& lt;/font><br / >';
echo $sortie['recherche_description'].'<br /><br />';
echo '<b><a href="'.$sortie['recherche_url'].'"><img src="images/picto-noir.gif"> Voire la page'.'</b></a><br /><hr>';
}
}

//sinon si aucun résultat on affiche la recherche avec d'autres critères plus softs
else {

$array_chaine=explode(" ",$_POST[text]);

//problème ici pour gérer les limites
$query="SELECT * FROM recherche WHERE ";
for($i=0;$i<sizeof($array_chaine);$i++){
if(strlen($array_chaine[$i])>3){
if($i>0){$query.=" OR ";}
$query.="recherche_motscles LIKE '%$array_chaine[$i]%'";
}
}
$query.= " ORDER BY recherche_priority ASC ";

$reqx = mysql_query($query)
or die ("erreur req ".mysql_error());

$res= mysql_num_rows($reqx);

echo '<font class="mini"><font class="gris">Recherche - Il y a '.$res.' résultat(s) pour : '.$_POST["text"].'</font></font><br><hr><br>';

while( $sortie = mysql_fetch_array($reqx))
{
echo '<font class="titre"><a href="'.$sortie['recherche_url'].'">'.$sortie['recherche_titre'].'</a>& lt;/font><br / >';
echo $sortie['recherche_description'].'<br /><br />';
echo '<b><a href="'.$sortie['recherche_url'].'"><img src="images/picto-noir.gif"> Voire la page'.'</b></a><br /><hr>';
}
}
}
}



Les données limites à rajouter dans cette page :

//au début des requêtes
$page = isset($_GET['page']) ? $_GET['page'] : '';

$limit=7;
if($debut==""){$debut=0;}
$debut=$page*$limit;
// Compte du nombre de champs
$nb_total=mysql_num_rows($ret);
// Requête
$limite=mysql_query("$requete limit $debut,$limit");

//avant les requêtes principales
$limit_str = "LIMIT ". $page * $limit .",$limit";

$limit_str


echo '<br \>Pages : ';
if ($page>0) {
$precedent=$page-1;
echo "<b><a href=\"$PHP_SELF?page=$precedent\">Précèdente</a></b> ";
}

$a=0;
$j=1;

if($nb_total>$limit) {
while($a<($nb_total/$limit)) {
if($a!=$page){echo " <a href=\"$PHP_SELF?page=$a\">$j</a> | ";}
else { echo "<b>$j |</b>";}
$a++;$j++;
}
}

if($debut+$limit<$nb_total) {
$suivant=$page+1;
echo " <b><a href=\"$PHP_SELF?page=$suivant\">Suivante</a></b>";
}



Déjà, avec tous les " if " et " else " présent au sein du moteur, pas facile de trouver les bons endroits où placer les " limites ". Mais le principal problème, c'est qu'avec tous ces " if " et " else " quand je clique sur pages suivantes, il affiche la page avec le GET " ?page=$suivant " sauf que là, la page " recherche.php " se réactualise et du coup il recommence la recherche avec un formulaire vide donc tout foire littéralement dès qu'il y a une page supplémentaire dans la recherche. Un autre problème, c'est pour rajouter les " limites " à l'intérieur de certaine requête aussi bien surchargée. J'ai mis des // avec des explications, je vous laisse voire le code ci-dessous pour mieux comprendre...


Est-ce que quelqu'un pourrait m'aider pour placer le code " limite par page " ? Et jeter un coup d'oeil à tous ces scripts pour me conseiller ... Où placer les " limites " ? Comment éviter les bugs ? Gérer les " if " ? Comment gérer la seconde requête avec les limites ?

Merci d'avance de votre aide ! a+
A voir également:

6 réponses

Bonjour,

vas voir sur le moteur de recherche G..... "php affichage multipage"
0
termi-zzz Messages postés 63 Date d'inscription mardi 18 décembre 2007 Statut Membre Dernière intervention 12 mai 2009 2
21 déc. 2007 à 16:18
Merci Alain, je connaissais bien le système affichage par pages, mais là j'avais un problème avec les if/else etc... j'ai tant bien que mal réussi à gérer tout ça.

Par contre, je souhaite faire une recherche pour le premier mot du texte entré dans le formulaire, et pour ça j'ai mis ça:


$array=explode(" ",$_POST[text]);

$requetez = "SELECT * from recherche where recherche_motscles LIKE '%$array[0]%' ORDER BY recherche_priority DESC";


Pas de bug mais ça ne fait pas la recherche comme ça devrait... Ca ne fait pas une recherche du premier mot comme si on entrait que seulement ce mot car j'ai testé et ça ne marche pas bien... Ai-je fais une erreur dans la synthaxe ?

Car si je tape "exemple" dans la recherche, ma première requête va trouver 5 résultats. Si je tape "exemple bordel de merde" la requête ci-dessus va trouver 0 résultats, hors elle devrait en trouver 5 aussi tu es d'accord ? C'est pour ça je comprends pas comment ça se fait que ça marche pas, à moins que j'ai fait une erreur de synthaxe ?...

a+
0
termi-zzz Messages postés 63 Date d'inscription mardi 18 décembre 2007 Statut Membre Dernière intervention 12 mai 2009 2
21 déc. 2007 à 16:31
juste pour rappel ma première requête c'est celle qui recherche l'expression entière càd "LIKE '$_POST[text]'"

et si je souhaite recherchez mot par mot (et non le 1er mot) pour ma requête ci-dessus, comment dois-je faire ? par exemple avec l'exemple si dessus faire une recherche individuel de "exemple" OR "bordel" OR "de" OR "merde" est-ce possible ? comment faire pour découper le $i ?


$query="SELECT * FROM recherche WHERE ";
for($i=0;$i<sizeof($array_chaine);$i++){
if(strlen($array_chaine[$i])>3){
if($i>0){$query.=" OR ";}
$query.="recherche_motscles LIKE '%$array_chaine[$i]%'";
}
}
$query.= " ORDER BY recherche_priority DESC ";

j'pensais pas que c'était aussi dur de faire un moteur de recherche... :p
0
termi-zzz Messages postés 63 Date d'inscription mardi 18 décembre 2007 Statut Membre Dernière intervention 12 mai 2009 2
21 déc. 2007 à 16:36
d'ailleurs j'ai du mal à comprendre comment la fonction explode peut me permettre dans ma 3e requête (ci-dessus) de rechercher les mots en les découpant, exemple en entrant "de" => ca prend le motc-lé "description"... ? j'suis perdu help me mdr
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Bonjour,

regarde calmement ta boucle, tu verras qu'elle fabrique une requête :
SELECT ... WHERE recherche_motscles LIKE 'mot1%' OR recherche_motscles LIKE 'mot2%' OR recherche_motscles LIKE 'mo31%' ORDER ...

en ne prenant en compte que les mots de plus de 3 caractères
0
Bonjour,

pour une recherche qui risque de faire plus d'une page, perso je procéderait ainsi:

- tu definis une variable nombre maxi par page $limit_page=20; par exemple

-tu fais une première requette sans LIMIT

- tu compte le nbr de resultats $nb_res=mysql_num_rows(...)

if( $nb_res < $limit_page){

par une boucle while tu affiche les résultats

else{
// calcul du nbr de pages
$nb_page=round($nb_res/$limit_page,0);

et la tu fais une nouvelle requette avec LIMIT $deb,$fin

et affichage par boucle while

$deb et $fin calculés par recup $deb=$_GET poste lors du click sur n°page suivante
$fin=$deb+$limit_page

}

en fin de page sous les resultats tu generes des liens avec comme libelé le numero page, et qui passe en parametre url le futur $deb

bien sur au premier affichage, pense a mettre $deb=1 par defaut

vas voir sur google il y a des scripts d'exemple de pagination php

j'ai aussi pensé:

au lieu de faire le test pour les mots >2 lettres pour ne pas les rechercher:

au lieu de faire if(strlen($mot){....

tu peux definir un array des non desires et rechercher si le mot n'est pas dedans:

$array_indesires=array("le","les","la","a","et","un", etc...); // c'est plus souple !
if(!in_array($mot){........ // si il n'est pas dans la liste on fait la recherche
:
0