Problème de requete

Fermé
minarina - 21 juil. 2005 à 22:55
 minarina - 25 juil. 2005 à 14:55
Bonjour,

J'ai un formulaire html qui me permet de faire une recherche article par mot-clé et on peut choisir par checkbox la catégorie de l'article.
Pour le résultat des requêtes je n'arrive pas à faire afficher le résultat voulu.
Je voudrai afficher par exemple tous les articles de ma table "article" qui comportent des accessoires.
Je ne sais pas si ça vient de ma requête, de la boucle ou bien autre chose. En fait, peut importe la catégorie ou le mot clé que je tape il m'affiche toujours le meme résultat
J'ai aucun message d'erreur qui apparait et visiblement pas de problèmes de syntaxes mais reprenez moi si je me trompe!
Je débute alors j'ai peur de me mélanger les piceaux dans tout ça ! lol
Je vous montre le code que j'ai écrit et pouvez vous me dire d'ou vient l'erreur svp.
merci d'avance


//voici le formulaire html
<FORM ACTION="ma_recherche.php" METHOD="POST
<INPUT TYPE="text" NAME="mots_cles" VALUE="mot-clé">
Catégorie
<INPUT TYPE="checkbox" NAME="categorie" VALUE="oui">blabla
<INPUT TYPE="checkbox" NAME="categorie" VALUE="oui">bloblo
<INPUT TYPE="checkbox" NAME="categorie" VALUE="oui">blibli
//il y a à peu près une quizaine de checkbox pour le choix de la catégorie
<input type="submit" name="recherche" value="OK">
<input type="reset" value="Recommencer">
</FORM>

//voici ma table
Champ Type Null Défaut
code_article text Non
nom_article varchar(20) Oui NULL
mots_cles text Non NULL
cle_unique int(10) Non auto_increment
code_famille text Non

<?
// Connexion à la base
mysql_connect($host, $login, $pass) or die ("impossible de se connecter au serveur"); 

// Sélection de la base
mysql_select_db($bdd) or die ("impossible de se connecter a la base de donnees"); 

//on crée la requête SQL
$sql='SELECT * FROM article WHERE mots_cles LIKE "%osier%" ORDER BY code_article';     

// on envoie la requête 
$req = mysql_query($sql) or die('Erreur SQL !<br>'.$sql.'<br>'.mysql_error()); 

//résultat de la requête
$recherche = $_POST['recherche'];  
$mots_cles = $_POST['mots_cles'];
$categorie = $_POST['categorie'];

	if (empty($mots_cles))  
	{ 
	echo '<center><h1>Vous devez entrer un mot clé</h1></center>'; 
	exit; 
	} 		
		if (empty($categorie))
		{
		echo '<center><h1>Vous devez sélectionner au moins une catégorie</h1></center>';
		exit;
		}		
		
$result=mysql_query('SELECT * FROM article WHERE mots_cles LIKE "%osier%" ORDER BY code_article') or die('Erreur SQL !<br>'.$sql.'<br>'.mysql_error());
				
echo '<font color=#ffffff><center><hr width="50%" color=orange>
				...Voici le résultat de votre recherche...<br><hr width="50%" color=orange><br>
				<a href="#" onclick="window.print()"><img src="imprimante.gif" border="o" alt="imprimer le résultat"></a><br><br>';								
// début du tableau
	{   echo '<table border=2 bordercolor=orange>';
	   }
// première ligne on affiche les titres des colonnes
       echo '<tr>';
	   echo '<th bgcolor="#ffffff"><b><u>code article</center></u></b></td>';
       echo '<th bgcolor="#ffffff"><b><u>nom article</u></b></td>';
       echo '<th bgcolor="#ffffff"><b><u>descriptif</u></b></td>';
	   echo '<th bgcolor="#ffffff"><b><u>famille</u></b></td>';
	   echo '<th bgcolor="#ffffff"><b><u>images</u></b></td>';
	   echo '</tr>'."\n";
	   
// on fait une boucle qui va faire un tour pour chaque enregistrement 
	    	while($data=mysql_fetch_array($result))	   
	    	{	  
			 
// lecture et affichage des résultats pour chaque lignes    
		echo '<tr>';
		echo '<td bgcolor="#ffffff">'.$data['code_article']. '</td>';
		echo '<td bgcolor="#ffffff">'.$data['nom_article']. '</td>';
		echo '<td bgcolor="#ffffff">'.$data['mots_cles']. '</td>';
		echo '<td bgcolor="#ffffff">'.$data['code_famille']. '</td>';	
		echo '<td bgcolor="#ffffff">'.$data['images']. '</td>';	
		echo '</tr>'."\n";
       		}
        echo '</table>'."\n";
		
//fin du tableau

//fermeture de la connexion Mysql 
mysql_close(); 
?>

6 réponses

kilian Messages postés 8731 Date d'inscription vendredi 19 septembre 2003 Statut Modérateur Dernière intervention 20 août 2016 1 527
21 juil. 2005 à 23:05
Salut,

En même temps ta requête, c'est toujours la même. Elle n'est pas fonction des mots clés envoyés.
Et je me demande aussi si une clause LIKE ne devrait pas plutôt être suivie d'une chaîne entourée de simple quotes ' au lieu de doubles quotes "
A mon avis, c'est toujours de simple quotes pour une chaine de caractère dans une requête mysql, mais j'en suis pas sûr.

PS: Je viens de regarder, apparemment, ça marche aussi avec des doubles-quotes.)
0
Padoo Messages postés 109 Date d'inscription jeudi 21 juillet 2005 Statut Membre Dernière intervention 6 février 2009 18
22 juil. 2005 à 09:16
atteniotn dans ton code :

<INPUT TYPE="checkbox" NAME="categorie" VALUE="oui">blabla
<INPUT TYPE="checkbox" NAME="categorie" VALUE="oui">bloblo
<INPUT TYPE="checkbox" NAME="categorie" VALUE="oui">blibli

Ici quelque soit la case cochée, la variable categorie prendra la valeur "oui". Ca ne te permet pas de savoir quelle case a ete cochee. Et si tu coches plusieurs cases, seule la derniere sera en memoire. Si tu veut l'ensemble de tes valeurs, iil faut les stoquer dans une variable de type tableau, categorie[].

//on crée la requête SQL
$sql='SELECT * FROM article WHERE mots_cles LIKE "%osier%" ORDER BY code_article';

La tu recupere dans ta BD l'ensemble de la table article

// on envoie la requête
$req = mysql_query($sql) or die('Erreur SQL !<br>'.$sql.'<br>'.mysql_error());

La tu execute ta erquete

//résultat de la requête
$recherche = $_POST['recherche'];
$mots_cles = $_POST['mots_cles'];
$categorie = $_POST['categorie'];

Et la tu recupere les variables de ton formulaire, pas les resultats de ta requete precedente!
Si tu veux recuperer le resultat de ta requete, il faut que tu fasse:
while($ligne=mysql_fetch_array($result))
{
$variable1=$ligne['variable1'];
... Pour chaque champ de ta table.
A chaque passage de boucle, tu parcourt une ligne de la BD qui correspond a ta requete. si tu sort de la boucle, tu ne conserve que les dernieres variables enregistrees, ou il faut que tu les recuprer ds un tableau, c'est tjs pareil. Tu peux aussi faire le traitement direct dans la boucle, comme un affichage par exemple.
}
0
Merci pour vos réponses, vous m'avez éclairé !!
Par contre j'ai changé mon formulaire et j'ai remplacé les checkboxs par un menu déroulant car j'ai trop de familles articles.
Voici mes modifs :

<FORM ACTION="ma_recherche.php" METHOD="POST"><img src="loupe.gif" width=28 height=28>
<INPUT TYPE="text" NAME="mots_cles" VALUE="mot cle" onFocus="this.value=''">

<SELECT NAME="famille">
<OPTION>- - - - - - - - - - - CHOIX - - - - - - - - - -
<OPTION VALUE="blabla">blabla
<OPTION VALUE="blibli">blibli
<OPTION VALUE="bloblo">bloblo
<OPTION VALUE="blublu">blublu
<OPTION VALUE="bleble">bleble
</OPTION>
</SELECT>
<input type="submit" name="recherche" value="OK">
<input type="reset" value="Recommencer">
</form>

<?
// Connexion à la base
mysql_connect($host, $login, $pass) or die ("impossible de se connecter au serveur"); 

// Sélection de la base
mysql_select_db($bdd) or die ("impossible de se connecter a la base de donnees"); 

//on crée la requête SQL
$sql='SELECT * FROM article WHERE mots_cles LIKE "%osier%" ORDER BY code_article';     

// on envoie la requête 
$result = mysql_query($sql) or die('Erreur SQL !<br>'.$sql.'<br>'.mysql_error()); 

echo '<font color=#ffffff><center><hr width="50%" color=orange>
      ...Voici le résultat de votre recherche...<br><hr width="50%" color=orange><br>
<a href="#" onclick="window.print()"><img src="imprimante.gif" border="o" alt="imprimer le résultat"></a><br><br>';

// début du tableau
    {   echo '<table border=2 bordercolor=orange>';
       }
// première ligne on affiche les titres des colonnes
       echo '<tr>';
       echo '<th bgcolor="#ffffff"><b><u>code article</center></u></b></td>';
       echo '<th bgcolor="#ffffff"><b><u>nom article</u></b></td>';
       echo '<th bgcolor="#ffffff"><b><u>descriptif</u></b></td>';
       echo '<th bgcolor="#ffffff"><b><u>famille</u></b></td>';
       echo '<th bgcolor="#ffffff"><b><u>images</u></b></td>';
       echo '</tr>'."\n";
       
// on fait une boucle qui va faire un tour pour chaque enregistrement 
            while($data=mysql_fetch_array($result))    
            {     
             
// lecture et affichage des résultats pour chaque lignes    
        echo '<tr>';
        echo '<td bgcolor="#ffffff">'.$data['code_article']. '</td>';
        echo '<td bgcolor="#ffffff">'.$data['nom_article']. '</td>';
        echo '<td bgcolor="#ffffff">'.$data['mots_cles']. '</td>';
        echo '<td bgcolor="#ffffff">'.$data['famille']. '</td>';
        echo '<td bgcolor="#ffffff">'.$data['images']. '</td>'; 
        echo '</tr>'."\n";
            }
        echo '</table>'."\n";
        
//fin du tableau

//fermeture de la connexion Mysql 
mysql_close(); 
?>


Voilà donc avec ça j'arrive à récupérer tout ce qu'il y a dans ma table article.
Maintenant je voudrai récupérer le résultat de chaque famille, comment dois je m'y prendre.
Est ce que je dois écrire dans mon code une requête pour chaque famille ou bien y a t-il une autre solution.
Merci beaucoup
0
Padoo Messages postés 109 Date d'inscription jeudi 21 juillet 2005 Statut Membre Dernière intervention 6 février 2009 18
22 juil. 2005 à 18:13
Bjr,

non, tu peux faire une requete avec une clause where du style
"SELECT * FROM table WHERE $famille='$famille_desiree'";
si tu demandes à l'utilisateur de selectionner la famille et que tu stockes la variable dans une variable $famille_desiree
Ravie d'avoir pu t'aider!
0

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

Posez votre question
Pour le moment c'est + clair pour moi et l'aide que l'on m'apporte et très utile.
Je vous tiens au courant de l'évolution de mon code et si la solution est trouvée je manquerai pas de vous le dire.
merci encore
bonne soirée et bon week nd à ceux qui seront pas connectés sur le forum.
@ +++
0
bonjour,

j'ai résolu mon problème et je voulais vous en informer.
il fallait rajouter ceci dans mon code :

$mots_cles = $_POST['mots_cles']; 
$mots_cles = trim($mots_cles);     
$regexp = " *\+ *| +"; 
$mots_cles = spliti($regexp, $mots_cles);


et ceci juste après la création de la requête
foreach($mots_cles as $mots_cles)         { 
  $sql .= "mots_cles LIKE '%".$mots_cles."%' OR ";
  } 
  $sql = substr($sql, 0, strlen($sql)-3);   
$sql .= "ORDER BY code_article"; 


voilà merci pour ceux qui ont essayé de m'aider.
bon courage
peut etre à bientôt
0