Précédent   Forum des professionnels en informatique > PHP > PHP & SGBD
PHP & SGBD Forum d'entraide sur les SGBD avec PHP. Avant de poster : FAQ BDD, toutes les FAQ PHP, cours BDD et sources BDD
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 01/08/2006, 17h59   #1
Candidat au titre de Membre du Club
 
Inscription : novembre 2005
Messages : 78
Détails du profil
Informations forums :
Inscription : novembre 2005
Messages : 78
Points : 12
Points : 12
Par défaut [SQL] Requete SELECT un peu confuse

bonjour,

je suit en train de créer un formulaire de recherche qui permet de chosir plusieur critère. Le truc c'est que je n'arrive pas à obtenir les enregistrements que je veux. En gros mon code est le suivant
Citation:
mysql_select_db($database_conn_bt_articles, $conn_bt_articles);

$query_rsdonneesBdd =sprintf("SELECT Titre,Corps FROM classification WHERE CL_autresSupport LIKE '%%%s%%' OR CL_support LIKE '%%%s%%' OR CL_typeDeSupport LIKE '%%%s%%' OR CL_localisationSupport LIKE '%%%s%%' OR CL_année LIKE '%%%s%%' OR CL_mois LIKE '%%%s%%' OR CL_secteur LIKE '%%%s%%' OR CL_regionDeptConcerne LIKE '%%%s%%' OR CL_autresRegion LIKE '%%%s%%' OR Titre LIKE '%%%s%%' OR Corps LIKE '%%%s%%' ", $autresSupport_rsdonneesBdd, $support_rsdonneesBdd,$typeDeSupport_rsdonneesBdd,
$localisationSupport_rsdonneesBdd, $annee_rsdonneesBdd, $mois_rsdonneesBdd, $secteur_rsdonneesBdd, $regionDeptConcerne_rsdonneesBdd, $autresRegion_rsdonneesBdd,
$motcle_titre_rsdonneesBdd,$motcle_texte_rsdonneesBdd);

$rsdonneesBdd = mysql_query($query_rsdonneesBdd, $conn_bt_articles) or die(mysql_error());
$row_rsdonneesBdd = mysql_fetch_assoc($rsdonneesBdd);
$totalRows_rsdonneesBdd = mysql_num_rows($rsdonneesBdd);
donc je souhaite comprendre exactement comment tout cela focntionne et s'il existe d'autres opération que AND ou OR pour effectuer ma recherche. Pour le moment j'arrive juste a obtenir soit tous les enregsitrements (que des OR) soit aucun(que des AND) car je demande quelque chose de trop précis et j'aimerais seulement renseigner quelques champs.

avez vous une idée? d'avance merci
benoitinfrance est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/08/2006, 18h20   #2
Membre habitué
 
Inscription : mai 2003
Messages : 361
Détails du profil
Informations forums :
Inscription : mai 2003
Messages : 361
Points : 111
Points : 111
est ce que tu as un message d'erreur?

fais: echo ($rsdonneesBd);
cari est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/08/2006, 18h48   #3
Candidat au titre de Membre du Club
 
Inscription : novembre 2005
Messages : 78
Détails du profil
Informations forums :
Inscription : novembre 2005
Messages : 78
Points : 12
Points : 12
je n'ai pas de message d'erreur, je voudrais juste qu'il ne me renvoi pas tous les enregistrements des que je fais une requete. alors y aurit t'il méthode pour qu'il vérifie les champs renseigner et qu'il me retourne tous les article qui concerne le departement 44 du mois d'avril par exemple.

Est ce que je suis clair?

je dois y aller, je vérifierai vos réponse demain.

merci encore
benoitinfrance est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/08/2006, 23h31   #4
Membre Expert
 
Inscription : avril 2006
Messages : 1 338
Détails du profil
Informations personnelles :
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations forums :
Inscription : avril 2006
Messages : 1 338
Points : 1 315
Points : 1 315
deja je te conseille d'abandonenr le sprintf
__________________
Stay in Bed .. Save Energy
boo64 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/08/2006, 08h32   #5
Candidat au titre de Membre du Club
 
Inscription : novembre 2005
Messages : 78
Détails du profil
Informations forums :
Inscription : novembre 2005
Messages : 78
Points : 12
Points : 12
merci de ta réponse boo64 mais je ne vois pas pourquoi je devrai enlever le "sprintf" et ensuite ma question était comment faire pour ne pas avoir une requete trop restrictive ou trop large pour que les enregistrements que j'obtient soit pertinent.

Si je place dans ma requete que des AND entre chaque condition, je n'obtient aucun résultat et si je place que des OR j'obtient tous les enregistrement de la base.

y'aurait il une solution a ce problème ou est ce que ma base a été ma crée? j'avoue que je suis un peu perdu.
benoitinfrance est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/08/2006, 08h36   #6
Membre du Club
 
Avatar de djedje37et28
 
Étudiant
Inscription : septembre 2005
Messages : 220
Détails du profil
Informations personnelles :
Âge : 30
Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : septembre 2005
Messages : 220
Points : 51
Points : 51
si tu as du mal avec le sql regardes ca:
http://eric.univ-lyon2.fr/~jdarmont/tutoriel-sql/
sinon précises ce que tu veux que ta requete face .
merci
djedje37et28 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/08/2006, 08h45   #7
Membre chevronné
 
Avatar de gerald2545
 
Inscription : février 2003
Messages : 643
Détails du profil
Informations forums :
Inscription : février 2003
Messages : 643
Points : 660
Points : 660
il semble que tu aies besoin de travailler ton sql : http://sql.developpez.com/.
Citation:
Si je place dans ma requete que des AND entre chaque condition, je n'obtient aucun résultat et si je place que des OR j'obtient tous les enregistrement de la base.
oui, jusque là ça paraît assez normal, c'est de la logique :
- AND : toutes tes conditions doivent être vraies
- OR : 1 seule condition doit être vraie
gerald2545 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/08/2006, 08h47   #8
Candidat au titre de Membre du Club
 
Inscription : novembre 2005
Messages : 78
Détails du profil
Informations forums :
Inscription : novembre 2005
Messages : 78
Points : 12
Points : 12
Merci pour ton tuto.

En fait j'ai créer un formulaire de recherche avec différents champs ( à completer ou liste déroulante). l'utilisateur peut s'il le souhaite ne remplir qu'une partie de ces champs. Prenons un exemple, il sélectionne dans le menu déroulant support "le journal des entreprise" puis dans le menu déroulant région " région pays de la loire". mais il laisse les autres champs vide car il veut effectuer une recherche sur tous les numéros du journal des entreprise qui sont paru dans les pays de la loire.

c'est a ce moment la que ma requete entre en jeu. j'aimerais que meme si je n'est pas completer tous les champs du formulaire, elle me retourne les enregistrements concernés.

Le truc c'est que j'ai beau manipuler ma requete en remplacant AND par OR ou encore en les mélageant dans ma requete rien n'y fais, je suis toujours face au meme probleme. soit ma requete ne me retourne aucun enregistrement (que des AND) soit elle me retourne tous enrgistrement (que des OR).

voila ce que j'attend de ma requete.

j'espère avoir été clair
benoitinfrance est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/08/2006, 08h51   #9
Membre chevronné
 
Avatar de gerald2545
 
Inscription : février 2003
Messages : 643
Détails du profil
Informations forums :
Inscription : février 2003
Messages : 643
Points : 660
Points : 660
laisse le soin à l'utilisateur de choisir dans une liste déroulante "ET" ou "OU" entre tes critères de recherche, que tu traduis par "AND" ou "OR" dans ta requete, tout en ignorant les critères de recherche qui n'ont pas été utilisés.
gerald2545 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/08/2006, 08h55   #10
Candidat au titre de Membre du Club
 
Inscription : novembre 2005
Messages : 78
Détails du profil
Informations forums :
Inscription : novembre 2005
Messages : 78
Points : 12
Points : 12
Comment puis-je traduire ce choix de ET/OU depuis mon formulaire vers ma requete en SQL et ensuite comment faire pour ignorer les champs non renseignés?
benoitinfrance est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/08/2006, 09h05   #11
Membre chevronné
 
Avatar de gerald2545
 
Inscription : février 2003
Messages : 643
Détails du profil
Informations forums :
Inscription : février 2003
Messages : 643
Points : 660
Points : 660
tu fais une liste déroulante ET/OU dans ton formulaire entre tes critères (e.g. support ET/OU région ET/OU....)
J'imagine que tu as un nombre de critères limité?

Pour ne pas prendre en compte les critères non modifiés, il faut sans doute que tu jous avec la valeur par défaut de chaque critère....e.g. par défaut pour chaque liste déroulante tu sélectionnes le mot "Choisissez...". SI au moment du traitement de ton formulaire tu trouves la valeur "Choisissez.., cela signifie que l'utilisateur ne l'a pas utilisé pour sa sélection....
gerald2545 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/08/2006, 09h08   #12
Candidat au titre de Membre du Club
 
Inscription : novembre 2005
Messages : 78
Détails du profil
Informations forums :
Inscription : novembre 2005
Messages : 78
Points : 12
Points : 12
oki je vois comment faire mais le truc c'est que j'ai une douzaine de critère. donc l'uitilisateur ne va pas s'amuser a faire un choix de ET OU à chaque fois.
benoitinfrance est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/08/2006, 09h25   #13
Membre chevronné
 
Avatar de gerald2545
 
Inscription : février 2003
Messages : 643
Détails du profil
Informations forums :
Inscription : février 2003
Messages : 643
Points : 660
Points : 660
et bien à ce moment là, une autre solution est peut-être l'utilisation d'AJAX, ou un rechargement de formulaire.
Pour chaque critère sélectionné, tu fais une vérif dans ta base de données et tu mets à jour tes listes déroulantes pour n'afficher que les critères correspondant aux critères que l'utilisateur a sélectionné....je ne sais pas si je suis clair....
gerald2545 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/08/2006, 09h25   #14
Membre Expert
 
Inscription : avril 2006
Messages : 1 338
Détails du profil
Informations personnelles :
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations forums :
Inscription : avril 2006
Messages : 1 338
Points : 1 315
Points : 1 315
je te deconseille le sprintf pasque il est quand meme lourd alor que ca revient au eùe et est plus lisible enfin c'est que mon avis

$req ="select a,b from matable where a = $mavariable" avec $mavariable entre cote si c'est une chaine de caractere
__________________
Stay in Bed .. Save Energy
boo64 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/08/2006, 09h25   #15
Expert Confirmé

 
Avatar de Amara
 
Inscription : juillet 2004
Messages : 2 684
Détails du profil
Informations personnelles :
Localisation : France, Sarthe (Pays de la Loire)

Informations forums :
Inscription : juillet 2004
Messages : 2 684
Points : 2 910
Points : 2 910
+1 avec Boo abandonne le sprintf qui est une horreur niveau lisiblité (et don débuggage), d'ailleurs on te l'avait déjà dit dans un autre topic

Perso je pense pas qu'il faille s'embêter avec des OR / AND, ce que tu veux c'est juste une requête avec un nombre variable de conditions (donc avec que du AND).

L'idée est la suivante (en algo) :

Code :
1
2
3
4
$req = "SELECT * FROM table WHERE 1=1"
TANT QUE conditions FAIRE
   $req .= " AND condition=valeur"
FIN TANT QUE
Les conditions tu les récupères avec des isset et des tests sur tes variables résultats du formulaire dans ta page de traitement.
__________________
Pas de questions techniques par MP, le forum est là pour ça et est plus efficace.

Orthographe : une connexion (avec un x), un langage (sans u), une requête (un seul t), 'une quote' (avec qu), une syntaxe (sans h)
Amara est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/08/2006, 09h28   #16
Membre émérite
 
Avatar de guitou12
 
Guillaume
Inscription : juillet 2006
Messages : 813
Détails du profil
Informations personnelles :
Nom : Guillaume
Âge : 29

Informations forums :
Inscription : juillet 2006
Messages : 813
Points : 905
Points : 905
Envoyer un message via MSN à guitou12
Citation:
Envoyé par benoitinfrance
oki je vois comment faire mais le truc c'est que j'ai une douzaine de critère. donc l'uitilisateur ne va pas s'amuser a faire un choix de ET OU à chaque fois.

Il te faut construire ta requête dynamiquement suivant les sélections effectuées par les utilisateurs sur tes divers champs, j'avais déjà répondu à 1 ou 2 posts dans le style pour des recherches de biens immobiliers je vais essayer de retrouver ça !

EDIT : voilà l'exemple typique de ce qu'il faudrait que tu fasses

http://www.developpez.net/forums/sho...d.php?t=187040

PS: laisse vraiment tomber le sprintf à relire c'est IMPOSSIBLE
__________________
Le . est la base de toute bonne concaténation, marre de voir des
echo "Mavar1 = $toto et Mavar2 = $titi";
ou pire echo 'Mavar1 = ',$toto,' et Mavar2 = ',$titi;
pratiquez plutôt le echo 'Mavar1 = '.$toto.' et Mavar2 = '.$titi;
guitou12 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/08/2006, 09h30   #17
Membre chevronné
 
Avatar de gerald2545
 
Inscription : février 2003
Messages : 643
Détails du profil
Informations forums :
Inscription : février 2003
Messages : 643
Points : 660
Points : 660
oui mais ce qu'il ne veut pas apparamment, c'est un retour "vide"...or avec uniquement des AND entre chaque critère, il y aura des moments où la requête ne renverra rien...
A benoitinfrance de préciser ce qu'il veut exactement....
gerald2545 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/08/2006, 09h33   #18
Expert Confirmé

 
Avatar de Amara
 
Inscription : juillet 2004
Messages : 2 684
Détails du profil
Informations personnelles :
Localisation : France, Sarthe (Pays de la Loire)

Informations forums :
Inscription : juillet 2004
Messages : 2 684
Points : 2 910
Points : 2 910
Citation:
Envoyé par gerald2545
oui mais ce qu'il ne veut pas apparamment, c'est un retour "vide"...or avec uniquement des AND entre chaque critère, il y aura des moments où la requête ne renverra rien...
A benoitinfrance de préciser ce qu'il veut exactement....
bah nan si il construit sa requête comme il faut et si aucun critère n'est saisi il aura un SELECT * FROM table c'est tout donc tout les enregistrements (si c'était par rapport à ma réponse précédente...).
__________________
Pas de questions techniques par MP, le forum est là pour ça et est plus efficace.

Orthographe : une connexion (avec un x), un langage (sans u), une requête (un seul t), 'une quote' (avec qu), une syntaxe (sans h)
Amara est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/08/2006, 09h42   #19
Membre chevronné
 
Avatar de gerald2545
 
Inscription : février 2003
Messages : 643
Détails du profil
Informations forums :
Inscription : février 2003
Messages : 643
Points : 660
Points : 660
je disais ça par rapport aux premiers posts de benoitinfrance sur ce thread, où il disait
Citation:
soit ma requete ne me retourne aucun enregistrement (que des AND) soit elle me retourne tous enrgistrement (que des OR).
On est tous d'accord pour n'utiliser que des "AND" entre les critères, si au moins 1 critère est sélectionné....
moi j'ai interprété le besoin de benoitinfrance comme : je veux que a requête génère toujours des résultats (pertinent bien sûr).
Donc si on crée une requête dynamique suivant les choix de l'utilisateur (admettons qu'il utilise les 12 critères à sa disposition), il y a de fortes chances que la requête créée ne renvoie aucun enregistrement....

Edit : aprtès relecture ma citation n'est pas pertinente et j'ai peut-être mal interprété le besoin...
gerald2545 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/08/2006, 09h46   #20
Candidat au titre de Membre du Club
 
Inscription : novembre 2005
Messages : 78
Détails du profil
Informations forums :
Inscription : novembre 2005
Messages : 78
Points : 12
Points : 12
pour le sprintf, il est vrai que j'avais déjà eu le conseil mais étant donné que ca marchait comme ca je ne voyais pas l'intéret de changer. maintenant sous la pression générale j'ai fais la modification.

en ce qui concerne le retour de ma requete je suis d'accord avec JWhite quand il dit que si rien est sélectionner, je veux tous les enregistrements.

Par contre pour ton algo JWhite, je n'est pas tout saisi, pourrais tu m'expliquer un peu lus en détail:
Citation:
$req = "SELECT * FROM table WHERE 1=1"
TANT QUE conditions FAIRE
$req .= " AND condition=valeur"
FIN TANT QUE
benoitinfrance est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 14h18.


 
 
 
 
Partenaires

Hébergement Web