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 15/12/2011, 16h29   #1
Membre du Club
 
Inscription : juillet 2006
Messages : 150
Détails du profil
Informations forums :
Inscription : juillet 2006
Messages : 150
Points : 40
Points : 40
Par défaut requête avec multiple And et COLLATE utf8_unicode_ci LIKE '%%"

Bonjour
j'essaye de passer une requête qui me permet de trouver de multiples champs, mais la requête renvoie un résultat uniquement si le champ est rempli, si il est vide la requête ne renvoie rien et il ya donc une erreur.
Comment faire pour que si des champs sont laissés vide par l'utilisateur, la requête n'en tienne pas compte.
Je ne sais pas si c'est clair, je veux que si l'utilisateur rempli le champ titre1 par exemple ,la requête ressorte toutes les fiches ayant la variable titre1 sans tenir compte si les autres champs sont remplis ou non.
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
$masterech=
  "titre1 COLLATE utf8_unicode_ci LIKE '%" . $titre1 . "%' 
 AND titre2 COLLATE utf8_unicode_ci LIKE '%" . $titre2 . "%' 
 AND realis COLLATE utf8_unicode_ci LIKE '%" . $realisateur . "%' 
  AND monteur COLLATE utf8_unicode_ci LIKE '%" . $monteur . "%' 
  AND truq COLLATE utf8_unicode_ci LIKE '%" . $truquiste . "%' 
  AND compo COLLATE utf8_unicode_ci LIKE '%" . $compositeur . "%' 
  AND musiq COLLATE utf8_unicode_ci LIKE '%" . $musik . "%' 
  AND contact COLLATE utf8_unicode_ci LIKE '%" . $contact . "%' 
  AND speak1 COLLATE utf8_unicode_ci LIKE '%" . $speak1 . "%' 
  AND speak2 COLLATE utf8_unicode_ci LIKE '%" . $speak2 . "%'
  AND v1 COLLATE utf8_unicode_ci LIKE '%" . $v1 . "%' 
  AND v2 COLLATE utf8_unicode_ci LIKE '%" . $v2 . "%' 
  AND formator COLLATE utf8_unicode_ci LIKE '%" . $formatorigine . "%' 
  AND standard COLLATE utf8_unicode_ci LIKE '%" . $standard . "%' 
  AND contenu COLLATE utf8_unicode_ci LIKE '%" . $contenu . "%' 
  AND observation COLLATE utf8_unicode_ci LIKE '%" . $observation . "%'";
 
 $sqlafichmaster= "SELECT * FROM  films WHERE $masterech  ORDER BY master DESC " ;
 
$resultat1 = mysql_query($sqlafichmaster) or die(mysql_error());
while ($master =mysql_fetch_array ($resultat1)){
rvm31 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/12/2011, 16h41   #2
Membre éclairé
 
Femme
Développeur .NET
Inscription : avril 2009
Messages : 264
Détails du profil
Informations personnelles :
Sexe : Femme
Localisation : France, Marne (Champagne Ardenne)

Informations professionnelles :
Activité : Développeur .NET
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : avril 2009
Messages : 264
Points : 323
Points : 323
Tu dois construire ta requête au fur et à mesure, en testant via PHP si tes variables sont vides ou non.

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
 
$masterech= '';
if(strlen($titre1))
$masterech .=  "titre1 COLLATE utf8_unicode_ci LIKE '%" . $titre1 . "%' AND ";
 
if (strlen($titre2))
$masterech .= "titre2 COLLATE utf8_unicode_ci LIKE '%" . $titre2 . "%' AND ";
 
// etc ...
// penser à supprimer le dernier AND de la chaine 
 
 $sqlafichmaster= "SELECT * FROM  films WHERE $masterech  ORDER BY master DESC " ;
 
$resultat1 = mysql_query($sqlafichmaster) or die(mysql_error());
while ($master =mysql_fetch_array ($resultat1)){
Isythiel est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/12/2011, 20h53   #3
Membre du Club
 
Inscription : juillet 2006
Messages : 150
Détails du profil
Informations forums :
Inscription : juillet 2006
Messages : 150
Points : 40
Points : 40
merci Isythiel

mais je pense qu'il ya 2 bug dans ta proposition.
1 la variable $masterech est redifini a chaque nouvelle valeur, si plus d'une valeur est définit je perd la première requête. j'ai donc numéroté les variables.
2 les AND à la fin provoquent une erreur si il n'y a qu'un champ défini, je les ait mis devant mais la j'ai un souci si c'est la premiere valeur définit.
Code :
1
2
3
4
5
6
7
8
9
10
if(strlen($titre1))
$masterech0 .=  "AND titre1 COLLATE utf8_unicode_ci LIKE '%" . $titre1 . "%' ";
 
if (strlen($titre2))
$masterech1 .= "AND titre2 COLLATE utf8_unicode_ci LIKE '%" . $titre2 . "%'  ";
 
 if (strlen($realisateur))
$masterech2 .= "AND realis COLLATE utf8_unicode_ci LIKE '%" . $realisateur . "%'  "; 
 
$masterech=$masterech1.$masterech2;
pour résoudre ça je pensais faire un compteur qui définit si c'est la première ligne et dans ce cas ne pas mettre le and.
je voulais faire quelque chose comme ça
Code :
1
2
3
4
5
6
7
8
9
 
$compteur=0
if (strlen($titre2)){
$masterech1 .= "titre2 COLLATE utf8_unicode_ci LIKE '%" . $titre2 . "%'  ";
if ($compteur>0)
$masterech1 .= " AND titre2 COLLATE utf8_unicode_ci LIKE '%" . $titre2 . "%'  ";
$compteur=1
}
// et pareil pour la suite
Je n'ai pas testé si ça fonctionnait, et peut être existe t-il une façon plus simple?
rvm31 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/12/2011, 21h24   #4
Membre du Club
 
Inscription : juillet 2006
Messages : 150
Détails du profil
Informations forums :
Inscription : juillet 2006
Messages : 150
Points : 40
Points : 40
la bonne syntaxe est celle la semble t-il
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
//titre1 si ce n'est pas la premiere requete
if (strlen($titre1) AND ($compteur>0))
$masterech1 .= "AND titre1 COLLATE utf8_unicode_ci LIKE '%" . $titre1 . "%'  ";
// si 1ere requete
if (strlen($titre1) AND ($compteur==0)){
$masterech1 .= " titre1 COLLATE utf8_unicode_ci LIKE '%" . $titre1 . "%'  ";
$compteur=1;
}
//idem pour autres variables 
if (strlen($titre2) AND ($compteur>0))
$masterech1 .= "AND titre2 COLLATE utf8_unicode_ci LIKE '%" . $titre2 . "%'  ";
// si 1ere requete
if (strlen($titre2) AND ($compteur==0)){
$masterech1 .= " titre2 COLLATE utf8_unicode_ci LIKE '%" . $titre2 . "%'  ";
$compteur=1;
}
rvm31 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/12/2011, 23h11   #5
Expert Confirmé
 
Avatar de rawsrc
 
Homme Martin
Dev indep
Inscription : mars 2004
Messages : 1 462
Détails du profil
Informations personnelles :
Nom : Homme Martin
Âge : 35
Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Dev indep

Informations forums :
Inscription : mars 2004
Messages : 1 462
Points : 2 552
Points : 2 552
Envoyer un message via Skype™ à rawsrc
Bonsoir,

Le mieux au lieu de trainer des AND partout avec un compteur c'est de passer par un tableau :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
$where = array();
 
if (strlen($titre1)) {
   $where[] =  "titre1 COLLATE utf8_unicode_ci LIKE '%" . $titre1 . "%' ";
}
 
if (strlen($titre2)) {
   $where[] =  "titre2 COLLATE utf8_unicode_ci LIKE '%" . $titre2 . "%' ";
}
 
// ... ... ... //
 
// à la fin : 
$sqlWhere = implode(' AND ', $where);
Lisible et plus propre
__________________
# Dans la Création, tout est permis mais tout n'est pas utile...
rawsrc est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/12/2011, 09h23   #6
Membre éclairé
 
Femme
Développeur .NET
Inscription : avril 2009
Messages : 264
Détails du profil
Informations personnelles :
Sexe : Femme
Localisation : France, Marne (Champagne Ardenne)

Informations professionnelles :
Activité : Développeur .NET
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : avril 2009
Messages : 264
Points : 323
Points : 323
C'est pour ça que j'avais dit :

Code :
// penser à supprimer le dernier AND de la chaine

...

Je te donnais l'algo, j'ai pas testé le code mais l'idée y était...
Après à toi de l'adapter à ta situation.
Isythiel est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/12/2011, 22h30   #7
Membre du Club
 
Inscription : juillet 2006
Messages : 150
Détails du profil
Informations forums :
Inscription : juillet 2006
Messages : 150
Points : 40
Points : 40
ok merci pour le coup du tableau effectivement c'est mieux.
rvm31 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 05h16.


 
 
 
 
Partenaires

Hébergement Web