Précédent   Forum des professionnels en informatique > PHP > PHP & SGBD > PHP & MySQL
PHP & MySQL Forum d'entraide sur les fonctions MySQL avec PHP. Avant de poster -> FAQ MySQL, Cours MySQL et Sources MySQL. Pour les questions concernant le moteur MySQL plutôt que les fonctions PHP, merci d'utiliser le forum MySQL.
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 25/11/2011, 14h41   #1
Invité de passage
 
Femme
Étudiant
Inscription : septembre 2010
Messages : 72
Détails du profil
Informations personnelles :
Sexe : Femme
Âge : 22
Localisation : France

Informations professionnelles :
Activité : Étudiant
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : septembre 2010
Messages : 72
Points : 3
Points : 3
Par défaut Requete qui s'adapte aux critères d'un formulaire

Bonjour à tous, je suis en ce moment sur une requête qui ne me semble pas claire du tout.

Ça le sera je pense pour ceux qui en ont le métier

J'ai un formulaire de recherche de vidéos avec comme critère de recherche possible :

- nom du présentateur
- lieux
- personnage

Il peuvent changer suivant le choix de l'utilisateur.


Mon soucis vient du fait que l'affichage n'est pas bon du tout.

ex : Si l'utilisateur laisse vide 2 critères et qu'il souhaite uniquement les vidéos en Français, mon affichage m'affiche des vidéos Anglaise, Allemande etc...

je dois donc avoir un soucis avec la requête ci-dessous...

voici ma requête :

Code sql :
1
2
3
4
5
6
7
8
SELECT *
FROM video 
WHERE actor LIKE '" . $actor . "'
OR actor2 LIKE '" . $actor . "'
OR lieux LIKE '" . $lieux . "'
OR presentateur LIKE '" . $presentateur . "'
ORDER BY CREATED
LIMIT 0 , 30

Merci par avance !
Lekno est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/11/2011, 15h54   #2
ced
Rédacteur/Modérateur

 
Avatar de ced
 
Homme Cédric Duprez
Inscription : avril 2002
Messages : 3 823
Détails du profil
Informations personnelles :
Nom : Homme Cédric Duprez
Âge : 36
Localisation : France, Loiret (Centre)

Informations professionnelles :
Secteur : Agroalimentaire - Agriculture

Informations forums :
Inscription : avril 2002
Messages : 3 823
Points : 6 426
Points : 6 426
Personnellement, je construirais la requête différemment, en enlevant du WHERE les critères qui ne sont pas renseignés dans le formulaire, plutôt que de laisser des OR avec des chaînes potentiellement vides.
En effet, je ne sais pas comment est remplie la base quand l'info n'est pas renseignées sur ces champs (NULL ou chaîne vide), mais le mieux reste encore de supprimer de la requête tous les critères qui ne sont pas renseignés. D'autant plus que si les données ont été insérées par un LOAD DATA INFILE, il y a toutes les chances pour que les données manquantes soient sous forme de chaine vide et non pas sous forme de NULL. Et du coup, les critères de la requête se révèlent tous justes pour des critères non renseignés dans le formulaire.

En conclusion, il vaut mieux créer dynamiquement les colonnes à faire figurer dans le WHERE, en limitant aux critères renseignés dans le formulaire.
__________________
Rédacteur / Modérateur SGBD
Mes tutoriels et la FAQ MySQL

----------------------------------------------------
Pensez aux balises code et au tag
Je ne réponds pas aux questions techniques par message privé, les forums sont là pour ça
ced est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/11/2011, 16h17   #3
Invité de passage
 
Femme
Étudiant
Inscription : septembre 2010
Messages : 72
Détails du profil
Informations personnelles :
Sexe : Femme
Âge : 22
Localisation : France

Informations professionnelles :
Activité : Étudiant
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : septembre 2010
Messages : 72
Points : 3
Points : 3
Merci pour ta réponse, concrètement je pourrai passer par quel système pour faire ceci ?

Effectuer une recherche dans ma DB via un formulaire ou potentiellement tout les champs ne sont pas remplie ?
Lekno est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/11/2011, 12h49   #4
Invité de passage
 
Femme
Étudiant
Inscription : septembre 2010
Messages : 72
Détails du profil
Informations personnelles :
Sexe : Femme
Âge : 22
Localisation : France

Informations professionnelles :
Activité : Étudiant
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : septembre 2010
Messages : 72
Points : 3
Points : 3
J'ai modifié ma requête :

Code php :
1
2
3
4
5
6
7
8
 
    $affichage = 'SELECT ID, nom, prenom, ville
FROM client
WHERE nom="' . $nom . '"
    OR prenom="' . $prenom . '"
        OR ville="' . $ville . '"
LIMIT 0 , 30
';

La requête fonctionne aprfaitement lorsque je n'ai que un seul critère de recherche.

Par contre si je rentre deux ou trois critère ( Ville + nom ) j'ai des résultats non logique.

C'est normal je comprend bien ma requête avec les OR, mais je ne vois pas du tout comment écrire ma requête pour lui faire prendre un compte les critères multiples !

Merci par avance
Lekno est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/11/2011, 15h10   #5
Expert Confirmé
 
Homme
Inscription : mai 2002
Messages : 1 655
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 29
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : mai 2002
Messages : 1 655
Points : 2 657
Points : 2 657
Bonjour si vous persistez à ne vouloir qu'une seule requête statique ... (je préfère la remarque de ced à votre méthode en fait)

Code :
1
2
3
4
5
6
7
 
SELECT ID, nom, prenom, ville
FROM client
WHERE (1 = $isNom OR nom="' . $nom . '")
AND (1 = $isPrenom OR prenom="' . $prenom . '")
AND (1=$isVille OR ville="' . $ville . '")
LIMIT 0 , 30
Les varialbes is% sont à renseigner à 1 sauf si le critère est utilisé, dans quel cas il faut les renseigner à 0.
punkoff est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/11/2011, 16h40   #6
Invité de passage
 
Femme
Étudiant
Inscription : septembre 2010
Messages : 72
Détails du profil
Informations personnelles :
Sexe : Femme
Âge : 22
Localisation : France

Informations professionnelles :
Activité : Étudiant
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : septembre 2010
Messages : 72
Points : 3
Points : 3
Citation:
Envoyé par punkoff Voir le message
Bonjour si vous persistez à ne vouloir qu'une seule requête statique ... (je préfère la remarque de ced à votre méthode en fait)

Code :
1
2
3
4
5
6
7
 
SELECT ID, nom, prenom, ville
FROM client
WHERE (1 = $isNom OR nom="' . $nom . '")
AND (1 = $isPrenom OR prenom="' . $prenom . '")
AND (1=$isVille OR ville="' . $ville . '")
LIMIT 0 , 30
Les varialbes is% sont à renseigner à 1 sauf si le critère est utilisé, dans quel cas il faut les renseigner à 0.
Ce n'est pas que je persiste mais mon niveaux ne me permet pas de mettre au point autre chose, et comme je l'ai dis plus haut le réponse de Ced peut être très complète je n'y ai pas compris grand chose et cela même après quelques recherches.

Pouvez vous m'indiquer le nom de ce qu'est votre requête que je puisse chercher de la documentation dessus
Lekno est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/11/2011, 13h44   #7
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 11 029
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur d'études en informatique
Secteur : Enseignement

Informations forums :
Inscription : août 2006
Messages : 11 029
Points : 18 331
Points : 18 331
Envoyer un message via MSN à CinePhil
PHP te permet de construire la requête dynamiquement.

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
$affichage = '
	SELECT ID, nom, prenom, ville
	FROM client 
	WHERE 1 
';
 
if($nom != '')
{
	$affichage .= "AND nom = '".mysql_real_escape_string($nom)."' ";
}
 
if($prenom != '')
{
	$affichage .= "AND prenom = '".mysql_real_escape_string($prenom)."' ";
}
 
if($ville != '')
{
	$affichage .= "AND ville = '".mysql_real_escape_string($ville)."' ";
}
 
$affichage .= 'LIMIT 30';
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/11/2011, 14h22   #8
Invité de passage
 
Femme
Étudiant
Inscription : septembre 2010
Messages : 72
Détails du profil
Informations personnelles :
Sexe : Femme
Âge : 22
Localisation : France

Informations professionnelles :
Activité : Étudiant
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : septembre 2010
Messages : 72
Points : 3
Points : 3
Merci pour ta réponse, peux tu juste m'indiquer quelque chose en supplément.


A quoi correspond le "." devant le "=" ?

Cordialement
Lekno est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/11/2011, 14h25   #9
Membre actif
 
Homme
Inscription : avril 2011
Messages : 426
Détails du profil
Informations personnelles :
Sexe : Homme

Informations forums :
Inscription : avril 2011
Messages : 426
Points : 171
Points : 171
A une concaténation
heretik25 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/11/2011, 14h35   #10
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 11 029
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur d'études en informatique
Secteur : Enseignement

Informations forums :
Inscription : août 2006
Messages : 11 029
Points : 18 331
Points : 18 331
Envoyer un message via MSN à CinePhil
Concrètement :
Code :
1
2
3
$une_variable .= 'un_texte';
// est équivalent à :
$une_variable = $une_variable.'un_texte';
Ou encore plus concrètement :
Code :
1
2
3
$bonjour = 'Salut ';
$bonjour .= 'Lekno';
echo $bonjour;
=> Salut Lekno
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/11/2011, 14h42   #11
Invité de passage
 
Femme
Étudiant
Inscription : septembre 2010
Messages : 72
Détails du profil
Informations personnelles :
Sexe : Femme
Âge : 22
Localisation : France

Informations professionnelles :
Activité : Étudiant
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : septembre 2010
Messages : 72
Points : 3
Points : 3
Je te remercie bien
Lekno est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/11/2011, 16h14   #12
Invité de passage
 
Femme
Étudiant
Inscription : septembre 2010
Messages : 72
Détails du profil
Informations personnelles :
Sexe : Femme
Âge : 22
Localisation : France

Informations professionnelles :
Activité : Étudiant
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : septembre 2010
Messages : 72
Points : 3
Points : 3
J'ai encore un petit soucis, il faudrait je pense que je passe par une sous requête, je m'explique dite moi si c'est un erreur.

Si je veux récuperer les habitants d'une ville ou le nom ou prenom de la personne est dupont.

Car sans la sous requête avec une suite de AND et de OR, il me liste bien mais sans tenir compte de la ville car je fais

WHERE ville= paris
AND nom = dupond
OR prenom = dupond

Une requête comme celle ci pourrai elle être valide ?

Code sql :
1
2
3
4
5
6
7
SELECT *
FROM clients
WHERE ville = 'paris'
AND (SELECT *
FROM clients 
WHERE prenom = 'dupont'
OR nom = 'dupont')

j'isole en quelque sorte la seconde requête de la première. C'est en gros ca mon idée

Merci par avance !
Lekno est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/11/2011, 17h31   #13
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 11 029
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur d'études en informatique
Secteur : Enseignement

Informations forums :
Inscription : août 2006
Messages : 11 029
Points : 18 331
Points : 18 331
Envoyer un message via MSN à CinePhil
Vite fait...
Code SQL :
1
2
3
4
5
6
7
8
SELECT -- les colonnes nécessaires et pas étoile !
FROM clients
WHERE ville = 'Paris'
  AND 
  (
    nom = 'Dupont'
    OR prenom = 'Dupont'
  )
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 30/11/2011, 10h10   #14
Membre éclairé
 
Homme Gérard Okono
Développeur Web
Inscription : juillet 2006
Messages : 711
Détails du profil
Informations personnelles :
Nom : Homme Gérard Okono
Localisation : Cameroun

Informations professionnelles :
Activité : Développeur Web
Secteur : Administration - Collectivité locale

Informations forums :
Inscription : juillet 2006
Messages : 711
Points : 328
Points : 328
Citation:
Envoyé par CinePhil Voir le message
if($nom != '')
{
$affichage .= "AND nom = '".mysql_real_escape_string($nom)."' ";
}
[/code]
Ne pas oublier de mettre des espaces avant le AND :
Code :
1
2
 
$affichage .= " AND nom = '".mysql_real_escape_string($nom)."' ";
okoweb est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/11/2011, 10h53   #15
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 11 029
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur d'études en informatique
Secteur : Enseignement

Informations forums :
Inscription : août 2006
Messages : 11 029
Points : 18 331
Points : 18 331
Envoyer un message via MSN à CinePhil
J'avais mis les espaces en fin de ligne des morceaux précédents.
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/11/2011, 12h24   #16
Invité de passage
 
Femme
Étudiant
Inscription : septembre 2010
Messages : 72
Détails du profil
Informations personnelles :
Sexe : Femme
Âge : 22
Localisation : France

Informations professionnelles :
Activité : Étudiant
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : septembre 2010
Messages : 72
Points : 3
Points : 3
Je te remercie bien, ça marche impeccable et j'ai appris d'autres éléments
Lekno est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 07h24.


 
 
 
 
Partenaires

Hébergement Web