Bonjour

Tout d'abord, merci pour ce site et vos tuto qui m'aident beaucoup depuis pas mal de temps.
J'ai suivi le tuto ici pour faire une recherche sur une BDD. Super tuto au passage, très clair.
Mais je rencontre un souci que je n'arrive pas à résoudre.
Voila ci-dessous le code en entier (il manque juste la connexion à la BDD):

<?php 
if (isset ($_GET'recherche'])){
    $recherche=$_GET'recherche'];
    $s=explode(" ",$recherche);
    $sql="SELECT * FROM annonces";
    $i=0;
    foreach ($s as $mot){
      if(strlen($mot)>3){
        if($i==0) {
            $sql.=" WHERE ";
        }
        else{
            $sql.=" OR ";
        }
        $sql.="annonce LIKE '%$mot%'";
        $i++;
       }
    }
    echo $sql."<br/>";
    $req=mysql_query($sql) or die( mysql_error());
    echo mysql_num_rows($req)."Résultats";
    while($d=mysql_fetch_assoc ($req)){
        echo 'Pseudo : <strong>'.stripslashes($d'prenom']).' </strong><br />';
        $c=$d'annonce'];
        $i=0;
        foreach ($s as $mot) {
        if(strlen($mot)>3){
            $i++;
            if($i>4){$i=1;}
            $c = str_ireplace($mot,'<span class="surligne'.$i.'">'.$mot.'</span>',$c);
        } 
        }
        echo '<p class="annonce"> '.nl2br(stripslashes($c)).' </p>';
    } 
}
else {
echo "Vous n'avez pas indiqué de mot-clés";
}
?>

Le code fonctionne, j'arrive a rechercher plusieurs mots, a les surligner, etc.
Mon problème se situe avec la fonction "strlen" pour ne prendre en compte que les mots supérieurs à 3 lettres. En effet, avec ce code (contrairement au tuto^^), si je tape un mot inférieur à 3 lettres ou aucun mot, il m'affiche toutes les entrées de la BDD au lieu de m'afficher "Vous n'avez pas indiqué de mot-clés".
J'ai pas mal cherché, et c'est logique, car il saute le premier foreach et affiche directement le "$sql="SELECT * FROM annonces";" de la ligne 5.
Voila, ce n'est surement pas grand chose, mais j'avoue que je bloque pas mal, parce que tout semble identique au tuto (mais ce n'est surement pas le cas^^).

Merci d'avance

Foyout

3 réponses


SnoT
Réponse acceptée

Ben tu as juste à faire un truc du style :

<?php
if (isset ($_GET'recherche'])){
    $recherche=$_GET'recherche'];
    $s=explode(" ",$recherche);
    $sql="SELECT * FROM annonces";
    $tabWhere = array();
    foreach ($s as $mot)
      if(strlen($mot)>3)
        $tabWhere] = "annonce LIKE '%$mot%'";
    if(sizeof($tabWhere) > 0)
    {
      $sql .= ' WHERE '.implode(' OR ', $tabWhere);
      $req=mysql_query($sql) or die( mysql_error());
      echo mysql_num_rows($req)." Résultats";
      while($d=mysql_fetch_assoc ($req)){
          echo 'Pseudo : <strong>'.stripslashes($d'prenom']).' </strong><br />';
          $c=$d'annonce'];
          $i=0;
          foreach ($s as $mot) {
          if(strlen($mot)>3){
              $i++;
              if($i>4){$i=1;}
              $c = str_ireplace($mot,'<span class="surligne'.$i.'">'.$mot.'</span>',$c);
          }
          }
          echo '<p class="annonce"> '.nl2br(stripslashes($c)).' </p>';
      }
    }else
      echo "Les mots clés doivent comporter plus 3 lettres";
}
else {
echo "Vous n'avez pas indiqué de mot-clés";
}
?>
foyout
Auteur

Merci beaucoup, c'est impeccable

foyout
Auteur

J'aurais également une autre question afin d'achever toute ma partie codage.
J'utilise sur les autres pages de mon site le code suivant (adapté d'un tuto) pour afficher uniquement 5 résultats par page et générer automatiquement les pages suivantes :

$messagesParPage=5; //Nous allons afficher 5 messages par page.
$retour_total=mysql_query('SELECT COUNT(*) AS total FROM annonces'); //Nous récupérons le contenu de la requête dans $retour_total
$donnees_total=mysql_fetch_assoc($retour_total); //On range retour sous la forme d'un tableau.
$total=$donnees_total'total']; //On récupère le total pour le placer dans la variable $total.
//Nous allons maintenant compter le nombre de pages.
$nombreDePages=ceil($total/$messagesParPage);
if(isset($_GET'page'])) // Si la variable $_GET'page'] existe...
{
     $pageActuelle=intval($_GET'page']);

     if($pageActuelle>$nombreDePages) // Si la valeur de $pageActuelle (le numéro de la page) est plus grande que $nombreDePages...
     {
          $pageActuelle=$nombreDePages;
     }
}
else // Sinon
{
     $pageActuelle=1; // La page actuelle est la n°1    
}
$premiereEntree=($pageActuelle-1)*$messagesParPage; // On calcul la première entrée à lire
// La requête sql pour récupérer les messages de la page actuelle.
$retour_messages=mysql_query('SELECT * FROM annonces WHERE categorie="Autres" ORDER BY id DESC LIMIT '.$premiereEntree.', '.$messagesParPage.'');
while($donnees_messages=mysql_fetch_assoc($retour_messages)) // On lit les entrées une à une grâce à une boucle
{
 //Je vais afficher les messages dans des petits tableaux. C'est à vous d'adapter pour votre design...
     //De plus j'ajoute aussi un nl2br pour prendre en compte les sauts à la ligne dans le message.
echo ' Pseudo : <strong>'.stripslashes($donnees_messages'prenom']).' </strong><br />
<p class="annonce"> <?php '.nl2br(stripslashes($donnees_messages'annonce'])).''</p>
}

Est ce qu'il serait possible de combiner les deux codes afin d'afficher les résultats obtenu par le premier code sur plusieurs pages générées automatiquement ?
Merci encore

Foyout