8791 sujets

Développement web côté serveur, CMS

Bonjour,

Je ne savais pas vraiment où placer ma question en php, alors je l'ai mis dans le bar du forum.

Bon voilà tout, j'ai un petit site web où je dois faire un petit moteur de recherche. J'ai déjà mon bout de code de fait et ça fonctionne, mais après réflexion, je me rend compte qu'il manquerait une petite partie à mon code, mais je ne comprends pas comment. Alors, voilà, quand j'écrit un mot à ma recherche, mon code s’exécute et on me sort les résultats, tout va bien jusque là, mais après réflexion, j'aimerais que lorsque j'écris plusieurs mots, mon code exécute la recherche pour tous les mots de cette recherche dans la bd et me sort tous les résultats de chaque élément qui ont au moins un lien avec 1 mot de la recherche. ça doit bien avoir rapport avec un tableau et un foreach, mais mes essais ne fonctionnent pas.

Voici le code qui fonctionne:


$recherche=$_POST["motscles"];

if(trim($recherche!==""))
{
$compteur=0;
	$Sql= chaine_arr(str_replace(" ","%",$recherche));
	$Sql = " WHERE (Titre_video like '%$Sql%' OR Motscles like '%$Sql%' OR Desc_video like '%$Sql%')";
}


mysql_query("set names 'utf8'");

		$result = mysql_query($query)or die (mysql_error());
		
		if (mysql_num_rows($result)==0)
    {
	echo"<h2>Oups... Aucun résultat, essayez des mots plus générals</h2>";	
	}
	else{
		while ($val = mysql_fetch_array($result))
		{
			
			
			
			echo"je sors mes resultats ici";
			
		}
	}
$query = "SELECT * FROM recherche $Sql"; 





Merci beaucoup de votre coup de main, je sais que ça doit être vraiment une question de débutant, mais ma logique est rouillé en programmation ces temps-ci... Smiley ohwell
Hello,

"Développement web côté serveur", ça me semble pas mal comme destination, non ? Smiley cligne
Un indice :


$tableau_contenant_tout_tes_motcles = array('motcle1','motcle2','...');

foreach ($tableau_contenant_tout_tes_motcles as $k => $v) {
    $ta_requete = msql_query('requete sql');

    if(mysql_num_rows($ta_requete) == 0) {
        echo 'pas de resultats';
    }

    else {
        echo 'tes resultats';
    }

}


Ca me paraît plus simple, sans compteur, essaye peut-être.
Modifié par Pedrothelion (11 Sep 2013 - 17:37)
Bonjour,

Je vous remercie beaucoup pour votre réponse,

Mais si je ne connais pas combien il y a de mots-clés, dois-je laisser le array vide?
De plus, je ne suis pas certaine de bien comprendre ce qu'est la valeur $k ainsi que $v ?

Merci de votre aide!

Smiley biggrin
Bonjour,
Un explode te permet de savoir combien tu as de mots :

  $tableau_mots = explode(" ", $_POST['recherche']);


Si tu ne comprends pas $k et $v, c'est que tu n'as pas compris le fonctionnement de foreach... Ce sont 2 variables qui vont nous servir pour exploiter les résultats de ta requête. Relit un cours sur foreach Sydgie !

"mais ma logique est rouillé en programmation ces temps-ci..."

Pensais-tu dérouiller ta logique au bar du forum ? Smiley cligne
Bonne journée...
sydgie a écrit :
Bonjour,

Je vous remercie beaucoup pour votre réponse,

Mais si je ne connais pas combien il y a de mots-clés, dois-je laisser le array vide?
De plus, je ne suis pas certaine de bien comprendre ce qu'est la valeur $k ainsi que $v ?

Merci de votre aide!

Smiley biggrin


Il y aura forcement un ou plusieurs mot-cles dans ce tableau puisque tu le remplis à partir du moment où l'internaute entrera une chaine de caractère dans le formulaire de recherche. Par contre oui si il valide le formulaire mais qu'il n'y a aucune chaine de caractère dans le formulaire tu ne remplis pas ce tableau évidemment, à toi de le contrôler.
Olivebio a écrit :


Pensais-tu dérouiller ta logique au bar du forum ? Smiley cligne
Bonne journée...



Oui, je ne suis pas programmeuse, mais plutôt intégrateur, alors je connais la base du php, mais pour faire des trucs compliqués, c'est autre chose XD

Je vais regarder cela la tête reposé, car ça me semble si compliqué Smiley confused . Je n'ai pas vraiment utiliser de foreach de ma vie mais plutôt des whiles.

Je vous remercie de votre aide. Je vous redonnerais des nouvelles.
Hello,

Il faut savoir que le foreach n'est pas obligatoire pour faire un moteur de recherche !
On peut très bien utiliser un while :
$tableau_mots = explode(" ", $_POST['recherche']);
while($i<count($tableau_mots))

ou encore un :
for($i= 1; $i <= count($tableau_mots); $i++)

Peu importe, le principal c'est de faire un tour de boucle pour chaque mot du tableau : on peut alors envoyer une requête pour chaque mot à chaque tour de boucle.
Mais le mieux c'est de construire une seule requête : c'est donc dans la boucle que la partie variable de cette requête est construite :
$Sql .=" Titre_video LIKE '%". $tableau_mots[$i] ."%' OR";

Good luck ! Smiley banane
Merci beaucoup, je crois que je comprends mieux maintenant, c'est le foreach qui m'a mélangé. Smiley lol ...à suivre Smiley langue
ça avance, j'ai un bon coup de pouce.

Mais nous avons un petit soucie: les vidéos de ma recherche affichent parfois en double quand 2 mots dans la recherche se retrouve dans les mots-clés d'une vidéo par exemple.

J'aimerais que lorsque le id d'une vidéo est affiché, on ne l'affiche pas de nouveau malgré les mots de la recherche en commun.

Je crois que je devrais refaire un autre tableau pour stocker les id déjà affichés, mais je sais mal comment m'y prendre.


$i2=0;
while ($val = mysql_fetch_array($result))
{
   if($val[id_video]!==$tab)
{
       résultats des videos ici              
}
$tab[$i2]=$val[id_video];
$i2++;
}


Si vous avez une idée n'hésitez pas! Nous y sommes presque Smiley cligne

Merci!
Bonjour,
A mon avis, ça devrait ressembler à un truc de ce style:
$i2=0;
while ($val = mysql_fetch_array($result)){
   if(!in_array($val[id_video],$tab)){ //si ta valeur renvoyée par la requête n'est pas dans le tableau des vidéos déjà récupérées, on affiche la vidéo et on l'ajoute au tableau des vidéos déjà récupérées
	//résultats des videos ici              
    	$tab[$i2]=$val[id_video]; //on insère l'id de ta vidéo dans le tableau des vidéos qu'on a déjà récupérées
	$i2++;
   }

}
GroquikMLV a écrit :
Bonjour,
A mon avis, ça devrait ressembler à un truc de ce style:
$i2=0;
while ($val = mysql_fetch_array($result)){
   if(!in_array($val[id_video],$tab)){ //si ta valeur renvoyée par la requête n'est pas dans le tableau des vidéos déjà récupérées, on affiche la vidéo et on l'ajoute au tableau des vidéos déjà récupérées
	//résultats des videos ici              
    	$tab[$i2]=$val[id_video]; //on insère l'id de ta vidéo dans le tableau des vidéos qu'on a déjà récupérées
	$i2++;
   }

}


Merci beaucoup! Ce truc est magique. Ça fonctionne! Smiley smile

Mon moteur de recherche fonctionne à merveille. Je vous remercie tous!