recherche multiple dans table bdd

Répondre
dansesouslapluie
le 07/06/2009 à 10:26
dansesouslapluie
Bonjour à tous ,

J'ai reussi à rechercher un mot dans un champ d'une table à l'aide d'un formulaire mais je n'arrive pas à faire la même recherche dans plusieurs champs à la fois (2 champs :"Code_CE" et "annee"):

J'ai essayé de nbreux scripts dont voici le dernier:

$req = mysql_query("SELECT Id_rando, rando FROM $table WHERE Code_CE, annee LIKE '%".$_POST['Code_CE']."%', '%".$_POST['annee']."%' Order by Id_rando Asc ");

En fait, je tourne encore en rond.
Une piste SVP, merci.
RV
dansesouslapluie
le 07/06/2009 à 14:42
dansesouslapluie
Le script suivant fonctionne :

$req = mysql_query("SELECT Id_rando, rando FROM $table WHERE Code_CE LIKE '%".$_POST['Code_CE']."%' OR annee LIKE '%".$_POST['annee']."%' Order by Id_rando Asc ");


Par contre, quand je laisse une case du formulaire vierge, cela me retourne quand même un enregistrement comme si la valeur " " était contenu dans le champ de la table ( ce qui n'est pas le cas ).
Si quelqu'un a une idée!
RV
LupusMic
le 07/06/2009 à 15:39
LupusMic
Lit la documentation de select, surtout ce qui concerne like.

Le problème est que tu ne comprends pas ce que tu fais, du coup, tu ne peux pas comprendre le résultat.

« comme si la valeur " " était contenu dans le champ de la table »

C'est une erreur d'interprétation de ta part. La clause like attends un motif de recherche. Si le champ 'annee' de ton formulaire est vide, alors $_POST['annee'] contiendra une chaîne vie (''). Ce n'est pas ' '. Du coup, la requête SQL construite correspondra à ceci (j'ignore code_ce) :

SELECT Id_rando, rando FROM $table WHERE annee LIKE '%%' Order by Id_rando Asc


Comme on peut aisément comprendre de cette requête, tout les occurrences d'annee correspondant à n'importe quel caractère va correspondre. Du coût, l'ensemble des tuples seront retournés par le serveur MySQL.

Lis la documentation sur select.

Il faut aussi que tu acquière la logique booléenne. Google est ton ami pour ça. Mais en gros :

true and true = true
false and true = false
true and false = false
false and false = false

true or true = true
true or false = true
false or true = true
false or false = false

Ceci est pour la base. Mais il faut aussi considérer plusieurs concepts :
* Protéger les données soumises via formulaire (voir mysql_real_escape_strin)
* Éviter like autant que possible. Like est très inefficace, surtout pour les champs de date.
* Construction conditionnelle de la requête. Si un champ du formulaire doit être ignoré lorsqu'il est vide, la clause where doit être construite par étapes.

Voilà pour l'essentiel.
Développeur récurrent, procédural et relationnel. Caustique soupe-au-lait.
dansesouslapluie
le 07/06/2009 à 21:13
dansesouslapluie
Bonsoir et merci ; Ta réponse est limpide et j'apprécie tous tes conseils!

Mais que dois je utiliser à la place de 'where ... like' si c'est inefficace pour selectionner des enregistrements de ma table ?
A première vue, mise à part le PB de la chaine vide, une seule instruction me permet de faire fonctionner ma recherche sur tous les champs de ma table. Cela me semble au contraire trés efficace.
RV
Répondre

Ecrire un message

Votre message vient d'être créé avec succès.
LoadingChargement en cours