Script de recherche dans une base de données

Petit nouveau ! | 4 Messages

08 févr. 2007, 16:51

Salut j'expose mon problème en fait je veux faire une sorte de mini moteur de recherche pour les armes d'un jeu et là je tombe sur un os.
L'utilisateur rentre les caractéristiques de l'arme qui lui sont proposé dans une page:
Image

et la seconde page reçois les infos puis va afficher les pnjs proposant l'objet avec les caractéristiques choisie. Et c'est là que je bloque puisque la page qui reçois les données doit rechercher les données dans la base de données selon plein de condition comme:
chapitre et arme et energie ...
j'ai alors pensé a ça comme requete mysql:
$requete="SELECT * FROM collectionneur WHERE";
		if($chapitre!='ND'){ $requete.= "`chapitre` LIKE '%$chapitre%'"; }
		if($arme!='ND' AND $chapitre!='ND'){ $requete.= "AND"; }
		if($arme!='ND'){ $requete.= "`arme` LIKE '%$arme%'"; }
		if($energie!='ND' AND  $chapitre!='ND' OR $energie!='ND' AND $arme!='ND' ){ $requete.= "AND"; }
		if($energie!='ND'){ $requete.= "`energie` LIKE '%$energie%'"; }
		if($classe!='ND' AND  $chapitre!='ND' OR $arme!='ND' OR $energie!='ND' OR $req!='ND' OR $deg!='ND' OR $bonus1!='ND'OR $bonus2!='ND'  ){ $requete.= "AND"; }
		if($classe!='ND'){ $requete.= "`classe` LIKE '%$classe%'"; }
		if($req!='ND' AND  $chapitre!='ND' OR $arme!='ND' OR $energie!='ND' OR $classe!='ND' OR $deg!='ND' OR $bonus1!='ND'OR $bonus2!='ND' ){ $requete.= "AND"; }
		if($req!='ND'){ $requete.= "`req` LIKE '%$req%'"; }
		if($deg!='ND' AND $chapitre!='ND' OR $arme!='ND' OR $energie!='ND' OR $classe!='ND' OR $req!='ND' OR $bonus1!='ND'OR $bonus2!='ND' ){ $requete.= "AND"; }
		if($deg!='ND'){ $requete.= "`deg` LIKE '%$deg%'"; }
		if($bonus1!='ND' AND $chapitre!='ND' OR $arme!='ND' OR $energie!='ND' OR $classe!='ND' OR $req!='ND' OR $deg!='ND'OR $bonus2!='ND' ){ $requete.= "AND"; }
		if($bonus1!='ND'){ $requete.= "`bonus1` LIKE '%$bonus1%'"; }
		if($bonus2!='ND' AND $chapitre!='ND' OR $arme!='ND' OR $energie!='ND' OR $classe!='ND' OR $req!='ND' OR $deg!='ND'OR $bonus1!='ND' ){ $requete.= "AND"; }
		if($bonus2!='ND'){ $requete.= "`bonus2` LIKE '%$bonus2%'"; }
		$requete .= " ORDER BY 'chapitre' ";


		mysql_connect("localhost", "root", "");
		mysql_select_db("rex");
		$reponse=mysql_query($requete) OR die (mysql_error());
		
		$requete="SELECT * FROM collectionneur WHERE";
		if($chapitre!='ND'){ $requete.= "`chapitre` LIKE '%$chapitre%'"; }
		if($arme!='ND' AND $chapitre!='ND'){ $requete.= "AND"; }
		if($arme!='ND'){ $requete.= "`arme` LIKE '%$arme%'"; }
		if($energie!='ND' AND  $chapitre!='ND' OR $energie!='ND' AND $arme!='ND' ){ $requete.= "AND"; }
		if($energie!='ND'){ $requete.= "`energie` LIKE '%$energie%'"; }
		if($classe!='ND' AND  $chapitre!='ND' OR $arme!='ND' OR $energie!='ND' OR $req!='ND' OR $deg!='ND' OR $bonus1!='ND'OR $bonus2!='ND'  ){ $requete.= "AND"; }
		if($classe!='ND'){ $requete.= "`classe` LIKE '%$classe%'"; }
		if($req!='ND' AND  $chapitre!='ND' OR $arme!='ND' OR $energie!='ND' OR $classe!='ND' OR $deg!='ND' OR $bonus1!='ND'OR $bonus2!='ND' ){ $requete.= "AND"; }
		if($req!='ND'){ $requete.= "`req` LIKE '%$req%'"; }
		if($deg!='ND' AND $chapitre!='ND' OR $arme!='ND' OR $energie!='ND' OR $classe!='ND' OR $req!='ND' OR $bonus1!='ND'OR $bonus2!='ND' ){ $requete.= "AND"; }
		if($deg!='ND'){ $requete.= "`deg` LIKE '%$deg%'"; }
		if($bonus1!='ND' AND $chapitre!='ND' OR $arme!='ND' OR $energie!='ND' OR $classe!='ND' OR $req!='ND' OR $deg!='ND'OR $bonus2!='ND' ){ $requete.= "AND"; }
		if($bonus1!='ND'){ $requete.= "`bonus1` LIKE '%$bonus1%'"; }
		if($bonus2!='ND' AND $chapitre!='ND' OR $arme!='ND' OR $energie!='ND' OR $classe!='ND' OR $req!='ND' OR $deg!='ND'OR $bonus1!='ND' ){ $requete.= "AND"; }
		if($bonus2!='ND'){ $requete.= "`bonus2` LIKE '%$bonus2%'"; }
		$requete .= " ORDER BY 'name' ";
		
		$reponseb=mysql_query($requete) OR die (mysql_error());
		
		mysql_close(); //deco de la base de donnée

mais sa ne marche pas.
Pour ça si vous avez des idées ou une solution faite moi signe ;)

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

08 févr. 2007, 17:14

Qu'est ce qui ne fonctionne pas ? la requête sql générée est-elle correcte ? est ce les résultats qui ne sont pas bons ? as-tu des messages d'erreurs ?

Dans la mesure où tu utilises des menus déroulants, je suppose que les valeurs que tu proposes proviennent de ta base. Tu as donc en principe des valeurs exactes, utilise plutôt un = à la place du LIKE :) (le like sert uniquement quand tu as un élément partiel de requête, et est plus gourmand en ressource, donc a éviter s'il n'est pas nécessaire ;))

Par ailleurs pour te simplifier un peu la vie sur tes test, tu peux ajouter un premier critère et ne mettre que des AND, ou bien utiliser une autre chaine (ce qui accessoirement te permet de la réutiliser :
$requete="SELECT * FROM collectionneur WHERE 1 = 1 "; 
if($chapitre!='ND')
 $requete.= " AND chapitre = '".$chapitre."'"; // les ` n'ont d'intérêt que si le nom de ton champ est un mot clé réservé sql
if($arme!='ND')
 $requete.= " AND arme = '".$arme."'";
...
voire donc :
$requete="SELECT * FROM collectionneur "; 
$sousRequete = '';
if($chapitre!='ND') {
 $sousRequete.= ($sousRequete != '') ? ' AND ' : ' WHERE '; // s'il y a des critères ajoute and, sinon ajoute where
 $sousRequete.= " chapitre = '".$chapitre."'"; 
}
if($arme!='ND') {
 $sousRequete.= ($sousRequete != '') ? ' AND ' : ' WHERE ';
 $sousRequete.= " arme = '".$arme."'";
}
...
$requete.= $sousRequete; // avantage, tu peux réutiliser les critères dans ta 2nd requête
HTH
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Petit nouveau ! | 4 Messages

09 févr. 2007, 20:25

Merci de ton aide Ryle sa marche :lol: grâce a toi je suis débloquer je vais pouvoir avancer.
Encore merci ;)