Problème pour recherche par plusieurs mots clés

Résolu
lonewolfs Messages postés 51 Date d'inscription samedi 2 juin 2007 Statut Membre Dernière intervention 17 octobre 2009 - 4 oct. 2008 à 14:43
nhervagault Messages postés 6063 Date d'inscription dimanche 13 avril 2003 Statut Membre Dernière intervention 15 juillet 2011 - 4 oct. 2008 à 17:17
Bonjour a tous,


J'ai crée une base de donnée pour l'entretien des machines de mon parc.


et j'ai fait une page php pour effectuer mes recherches plus facilement.


Cette page permet de faire des recherches sur plusieurs plan et en
particulier sur des symptomes qui ont engagé une intervention.


Mon script fonctionne mais que sur un seul mot clé dans ma recherche
sur les symptomes et je souhaiterais pouvoir affiner mes recherches en
permettant plusieurs mots clés dans la case symptomes mais j'avoue que
la ca dépasse mes capacités en php.


Je viens donc vers vous, vous demander de l'aide.


Voci mon code :
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">

<html>

<!-- Mise en place du formulaire de recherche -->

<form method="post">

Rechercher par :

Machine :  -

Utilisateur :  -

Lieu :  -

Symptômes : 

</form>

<center>Date,

Lieu,

Machine,

Utilisateur,

Symptômes,

Intervention,

<?php

//récupération des variables

$Machine=$_POST['Machine'];

$Utilisateur=$_POST['Utilisateur'];

$Lieu=$_POST['Lieu'];

$Symptomes=$_POST['Symptomes'];

//Requêtes

mysql_connect(\"localhost\", \"root\", \"\") or die (\"Pas de connexion à la base de données\"); // Connexion à MySQL

mysql_select_db(\"Entretien\") or die (\"Pas de connexion à la base\"); // Sélection de la base coursphp

// Si seul Machine est rempli

if ((!empty($Machine)) and (empty($Utilisateur)) and (empty($Lieu)) and (empty($Symptomes)))

{

$reponse = mysql_query(\"SELECT * FROM intervention WHERE `Machine`='$Machine'\"); // Requête SQL

}

//Si seul Utilisateur est rempli

if ((empty($Machine)) and (!empty($Utilisateur)) and (empty($Lieu)) and (empty($Symptomes)))

{

$reponse = mysql_query(\"SELECT * FROM intervention WHERE `Utilisateur`='$Utilisateur'\"); // Requête SQL

}

//Si seul Lieu est rempli

if ((empty($Machine)) and (empty($Utilisateur)) and (!empty($Lieu)) and (empty($Symptomes)))

{

$reponse = mysql_query(\"SELECT * FROM intervention WHERE `Lieu`='$Lieu'\"); // Requête SQL

}

//Si seul Symptome est rempli ***************************************************************************************

if ((empty($Machine)) and (empty($Utilisateur)) and (empty($Lieu)) and (!empty($Symptomes)))

{

$reponse = mysql_query(\"SELECT * FROM intervention WHERE `Symptomes` LIKE '%$Symptomes%'\"); // Requête SQL

}

//****************************************************************************************************************

//Si Machine et Utilisateur sont rempli

if ((!empty($Machine)) and (!empty($Utilisateur)) and (empty($Lieu)) and (empty($Symptomes)))

{

$reponse = mysql_query(\"SELECT * FROM intervention WHERE `Machine`='$Machine' and `Utilisateur`='$Utilisateur'\"); // Requête SQL

}

//Si Machine, Utilisateur e t Lieu sont rempli

if ((!empty($Machine)) and (!empty($Utilisateur)) and (!empty($Lieu)) and (empty($Symptomes)))

{

$reponse = mysql_query(\"SELECT * FROM intervention WHERE `Machine`='$Machine' and `Utilisateur`='$Utilisateur' and `Lieu`='$Lieu'\"); // Requête SQL

}

// Si tous les champs sont remplis

if ((!empty($Machine)) and (!empty($Utilisateur)) and (!empty($Lieu)) and (!empty($Symptomes)))

{

$reponse = mysql_query(\"SELECT * FROM intervention WHERE `Machine`='$Machine' and `Utilisateur`='$Utilisateur' and `Lieu`='$Lieu' and `Symptomes` LIKE '%$Symptomes%'\"); // Requête SQL

}

//*******************************************************************************************

//Si Utilisateur et Lieu sont rempli

if ((empty($Machine)) and (!empty($Utilisateur)) and (!empty($Lieu)) and (empty($Symptomes)))

{

$reponse = mysql_query(\"SELECT * FROM intervention WHERE `Utilisateur`='$Utilisateur' and `Lieu`='$Lieu'\"); // Requête SQL

}

//Si utilisateur et Symptomes sont rempli

if ((empty($Machine)) and (!empty($Utilisateur)) and (empty($Lieu)) and (!empty($Symptomes)))

{

$reponse = mysql_query(\"SELECT * FROM intervention WHERE `Utilisateur`='$Utilisateur'and `Symptomes` LIKE '%$Symptomes%'\"); // Requête SQL

}

//Si Lieu et Symptomes sont rempli

if ((empty($Machine)) and (empty($Utilisateur)) and (!empty($Lieu)) and (!empty($Symptomes)))

{

$reponse = mysql_query(\"SELECT * FROM intervention WHERE `Lieu`='$lieu' and `Symptomes` LIKE '%$Symptomes%'\"); // Requête SQL

}

//Si Machine et lieu sont rempli

if ((!empty($Machine )) and (empty($Utilisateur)) and (!empty($Lieu)) and (empty($Symptomes)))

{

$reponse = mysql_query(\"SELECT * FROM intervention WHERE `Machine`='$Machine' and `Lieu`='$Lieu'\"); // Requête SQL

}

//Si Machine et Symptomes sont rempli

if ((!empty($Machine)) and (empty($Utilisateur)) and (empty($Lieu)) and (!empty($Symptomes)))

{

$reponse = mysql_query(\"SELECT * FROM intervention WHERE `Machine`='$Machine' and `Symptomes` LIKE '%$Symptomes%'\"); // Requête SQL

}

// On fait une boucle pour lister tout ce que contient la table :

while ($donnees = mysql_fetch_array($reponse) )

{

?>

----

<center><?php echo $donnees['Date']; ?></center>,

<center><?php echo $donnees['Lieu']; ?></center>,

<center><?php echo $donnees['Machine']; ?></center>,

<center><?php echo $donnees['Utilisateur']; ?></center>,

<center><?php echo $donnees['Symptomes']; ?></center>,

<center><?php echo $donnees['Intervention']; ?></center>,

<?php

}

mysql_close(); // Déconnexion de MySQL

?>
</center>




Si vous pouvez me donner une piste, un lien, une aide, je suis preneur de tout ce qui peut me faire avancer.


Merci par avance


Lonewolf

5 réponses

lonewolfs Messages postés 51 Date d'inscription samedi 2 juin 2007 Statut Membre Dernière intervention 17 octobre 2009
4 oct. 2008 à 17:13
C'est bon, j'ai trouvé.

Voici la solution

$Symptomes = str_replace(" ", "%' AND Symptomes LIKE '%", $Symptomes);

Merci a tous

Amicalement
3
nhervagault Messages postés 6063 Date d'inscription dimanche 13 avril 2003 Statut Membre Dernière intervention 15 juillet 2011 37
4 oct. 2008 à 16:23
Salut

Voici une idée que tu peux suivre

Tu construis ta requête de façon dynamique.

Alors tu commence par faire la requête et après tu execute la requête fabriquée

Je ne vais pas recoder ta page (je m'y perd)

voici le principe

$sql = "SELECT * FROM intervention WHERE 1=1"; //--> 1=1 renvoie toutes les données de la table permet de gerer le AND de maniere propre

/*Lieu*/
if(!empty($Lieu)){
$sql .= " AND `Lieu`='$Lieu'"
}
/*Machine*/
if(!empty($Machine)){

$sql .= " AND `Machine`='$Machine'"

}

Etc

Et execution de la requete
$reponse = mysql_query($sql);

Et voila ton probleme résolue de manière propre et maintenable

6 * 3 lignes courtes ;-)
+ 1 ligne pour l'execution c'est un peu mieux

Bon coding.
0
lonewolfs Messages postés 51 Date d'inscription samedi 2 juin 2007 Statut Membre Dernière intervention 17 octobre 2009
4 oct. 2008 à 16:58
Bonjour et merci

effectivement, ca permet un code moins lourd et plus lisible.

Néanmoins ca ne resoud pas le problème de la recherche sur plusieurs mots dans le champs "Symptomes".

Actuellement, avec mon code, je suis limité à un mot pour cette recherche, ce qui est peu pratique et je souhairerais pouvoir avoir plusieurs mots pour celles ci.

Amicalement
0
nhervagault Messages postés 6063 Date d'inscription dimanche 13 avril 2003 Statut Membre Dernière intervention 15 juillet 2011 37
4 oct. 2008 à 17:13
Comment est fait ton champ symptôme pour avoir une idée (comment il est remplit en base)

avec une concatenation de OR LIKE dans la clause tu y arriveras peut etre

Mais avec des perfs pourries.

Ou sinon il faut chercher dans les recherches de types fulltext que je n'ai pas eu l'occassion d'utiliser sur mysql.
Internet te donneras des tutoriels sur les recherches fulltext.
0

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

Posez votre question
nhervagault Messages postés 6063 Date d'inscription dimanche 13 avril 2003 Statut Membre Dernière intervention 15 juillet 2011 37
4 oct. 2008 à 17:17
J'ai pas compris ta réponse.
Peux-tu mettre un exemple de la chaine SQL formée avant et avec ta methode?

Merci
0
Rejoignez-nous