8797 sujets

Développement web côté serveur, CMS

Bonsoir tout le monde.

J' ai un petit souci, je me suis basé sur un tuto pour faire un moteur de recherche interne. Il est plutot simple mais il fonctionne bien a un detail prés. On ne peut mettre plus d' un mot clé, sous peine de n' avoir aucun résultat.

Je ne sais pas trop quoi faire pour remédier a ca, je vous montre le piti bout tout simple:


   <?
if(isset($_POST['requete']) && $_POST['requete'] != NULL) // on vérifie d'abord l'existence du POST et aussi si la requete n'est pas vide.
{

$requete = htmlspecialchars($_POST['requete']); // on crée une variable $requete pour faciliter l'écriture de la requête SQL, mais aussi pour empêcher les éventuels malins qui utiliseraient du PHP ou du JS, avec la fonction htmlspecialchars().
$query = mysql_query("SELECT * FROM annonces WHERE titre LIKE '%$requete%'
        OR annonce like '%$requete%'
        OR auteur like '%$requete%'
                ORDER BY id DESC") or die (mysql_error()); // la requête, que vous devez maintenant comprendre <img src="http://forum.phpfrance.com/images/smilies/icon_wink.gif" alt=";)" title="Wink" />
$nb_resultats = mysql_num_rows($query); // on utilise la fonction mysql_num_rows pour compter les résultats pour vérifier par après
if($nb_resultats != 0) // si le nombre de résultats est supérieur à 0, on continue
{
// maintenant, on va afficher les résultats et la page qui les donne ainsi que leur nombre, avec un peu de code HTML pour faciliter la tâche.
?>
    </p>
      <h3 align="center">Résultats de votre recherche.</h3>
      <p>Nous avons trouvé <? echo $nb_resultats; // on affiche le nombre de résultats
if($nb_resultats > 1) { echo ' résultats'; } else { echo ' résultat'; } // on vérifie le nombre de résultats pour orthographier correctement.
?> dans notre base de données. Voici les fonctions que nous avons trouvées :<br/>
          <br/>
          <?
while($donnees = mysql_fetch_array($query)) // on fait un while pour afficher la liste des fonctions trouvées, ainsi que l'id qui permettra de faire le lien vers la page de la fonction
{
?>
          <a href="annonces_c.php?pseudo=<?php echo $_SESSION['pseudo']; ?>&id=<? echo $donnees['id']; ?>"><? echo $donnees['titre']; ?></a><br/>
          <?
} // fin de la boucle
?>
        <br/>
          <br/>
        <a href="rechercher.php">Faire une nouvelle recherche</a></p>
      <?
} // Fini d'afficher les résultats ! Maintenant, nous allons afficher l'éventuelle erreur en cas d'échec de recherche et le formulaire.
else
{ // de nouveau, un peu de HTML
?>
      <h3 align="center">Pas de résultats.</h3>
      <p align="center">Nous n'avons trouvé aucun résultat pour votre requête "<? echo $_POST['requete']; ?>". </p>
      <p align="center"><a href="annonces.php?pseudo=<?php echo $_SESSION['pseudo']; ?>">Réessayez</a> avec autre chose.</p>
      <p>
        <?
}// Fini d'afficher l'erreur ^^
mysql_close(); // on ferme mysql, on n'en a plus besoin
}
else
{ // et voilà le formulaire, en HTML de nouveau !
?>
        <?
}
// et voilà, c'est fini !
?>


Merci d' avance pour le coup de main, je suis perdu Smiley rolleyes

edit: je sais pas si c' est normal, mon code n' apparait pas en entier Smiley ohwell
Modifié par graffx (20 Dec 2009 - 23:17)
C'est le même problème que sur les forums du SDZ ?

(edit) Extrait du post en question :

if(isset($_POST['requete']) && $_POST['requete'] != NULL) // on vérifie d'abord l'existence du POST et aussi si la requete n'est pas vide.
{

$requete = htmlspecialchars($_POST['requete']); // on crée une variable $requete pour faciliter l'écriture de la requête SQL, mais aussi pour empêcher les éventuels malins qui utiliseraient du PHP ou du JS, avec la fonction htmlspecialchars().
$query = mysql_query("SELECT * FROM annonces WHERE titre LIKE '%$requete%'
        OR annonce like '%$requete%'
        OR auteur like '%$requete%'
 		ORDER BY id DESC") or die (mysql_error()); // la requête, que vous devez maintenant comprendre [cligne]
$nb_resultats = mysql_num_rows($query); // on utilise la fonction mysql_num_rows pour compter les résultats pour vérifier par après
if($nb_resultats != 0) // si le nombre de résultats est supérieur à 0, on continue
{
// maintenant, on va afficher les résultats et la page qui les donne ainsi que leur nombre, avec un peu de code HTML pour faciliter la tâche.


Si oui, en fait il faut que tu traites la chaîne de caractères en sortie du formulaire, pour la diviser et récupérer chaque mot, pour construire ta clause WHERE.

Est-ce que tu veux faire tout le temps ET, ou tout le temps OU, ou bien laisser le choix à l'utilisateur (en lui autorisant les mots-clés AND/ET et OU/OR dans l'input du formulaire) ?
Modifié par mistike (21 Dec 2009 - 00:30)
Salut,

@mistike > ça n'est pas htmlspecialchars mais mysql_real_escape_string qu'il faut utiliser.

et c'est également plus simple de faire
if(!empty($_POST['requete']))
que
if(isset($_POST['requete']) && $_POST['requete'] != NULL)


@graffx > tu as un exemple dans ce post pour décomposer ta chaîne en plusieurs mots.
Modifié par Heyoan (21 Dec 2009 - 00:25)
Euh, je précise que le code que j'ai reproduit au-dessus est celui du tuto, recopié sur le post du forum SDZ où la même question était posée. Je l'ai mis là parce que graffx n'arrivait pas à faire apparaître tout son code dans son message.
Bonjour messieurs dames et desolé de ne pouvoir repondre qu emaintenant, la journée de travail ayant été débordante.

En effet c' est bien le meme, pourtant j' ai mis mon code entre les balise php de alsacreations.

Enfin, j' ai pas de chance, parce que l' exemple que vous me montrez, c' est le seul que j' ai trouvé qui corresponde a mon cas, mais hélas, comme je ne comprend pas la manip pour lui dire "cherchez tous les mots en coupant les espaces" plutot que "cherchez un mot ou citations exacte".

Donc en gros, je ne comprend pas trop la methode de l' exemple citée.

Peu etre pourriez vous m' aider a comprendre un peu mieux en quoi elle consiste?


Merci d' avance!
J' ai beau essayer de comprendre, ben je comprend pas!

Si on pouvait me traduire l' exemple, parce que j' ai pas compris du tout comment adapter cette tactique sur mon bout tout moisi Smiley rolleyes
hello, je ne suis pas sûr d'avoir compris le pb, mais normalement, tu dois découper ta chaine de caractère en fonction des espaces (avec une expression régulière, histoire de nettoyer tout ça). Puis ensuite tu peux par exemple détecter si des expressions entre guillemets sont entrées (comme dans la plupart des moteurs de recherches).


        /**
	 * @param String $sMots
	 * @return array
	 */
	private function decoupeMots($sMots) {
		$toReturn 	= null;
		$sMots 		= trim($sMots);
		
		if(empty($sMots))
			return null;
			
		// recherche les expressions entre guillemets
		$pattern = '/"([^"]*)"/i';

		// extraction des termes entres guillemets
		preg_match_all($pattern,$sMots,$matches);	
		
		// suppression des termes entres guillemets
		$sMots = preg_replace($pattern,'',$sMots);
		
		$sMots = trim($sMots);
		
		// découpe de la chaine selon les espaces
		$aMots = preg_split('/\s+/i',$sMots);
		
		// regroupement des expressions entre guillemets et des mots simples 
		$aMots	= array_merge($aMots,$matches[1]);
		
		//supprime les valeurs vides
		foreach ($aMots as $key=>$value)
			if($value=="") unset($aMots[$key]);
		
		return $aMots;
	}

Modifié par eupho (22 Dec 2009 - 00:11)
J'ai plus simple à proposer que la technique de eupho :

function smartSplit ($str) {
$str = preg_replace( '/"([^"]+)"/e', "str_replace(' ', 'ÿ', '$1');", $str);
$ar = explode(' ', $str);
$ar = str_replace('ÿ', ' ', $ar);
return $ar;
}