Problème affichage - PHP & MySQL
termi-zzz
Messages postés
63
Date d'inscription
Statut
Membre
Dernière intervention
-
Alain42 -
Alain42 -
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+
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:
- Problème affichage - PHP & MySQL
- Affichage double ecran - Guide
- Easy php - Télécharger - Divers Web & Internet
- Problème affichage fenêtre windows 10 - Guide
- Windows 11 affichage classique - Guide
- Mysql community server - Télécharger - Bases de données
6 réponses
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+
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+
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
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
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
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
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
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:
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: