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 08/03/2010, 11h14   #1
Membre à l'essai
 
Inscription : février 2010
Messages : 103
Détails du profil
Informations forums :
Inscription : février 2010
Messages : 103
Points : 22
Points : 22
Par défaut requête SQL avec variables non renseignées

Bonjour,
J'ai une requête mySQL qui porte sur une bdd de 8 tables, le tout dans un script PHP.

La requête en question :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Select nomspot, image
from tspot, tacces, tcommune, tdifficulte, tlocalite, tpays, tregion, ttype 
				where tspot.nocommune=tcommune.nocommune 
				and ttype.notype=tspot.notype 
				and tlocalite.nolocal=tspot.nolocal 
				and tspot.nodiff=tdifficulte.nodiff 
				and tacces.noacces=tspot.noacces 
				and tregion.noregion=tcommune.noregion
				and tpays.nopays=tregion.noregion
				and tspot.nocommune='".$_POST["nocommune"]."'
				and tspot.notype='".$_POST["notype"]."'
				and tspot.nolocal='".$_POST["nolocal"]."'
				and tspot.nodiff='".$_POST["nodiff"]."'
				and tspot.noacces='".$_POST["noacces"]."'
				and tpays.nopays='".$_POST["nopays"]."'
				and tregion.noregion='".$_POST["noregion"]."';
La requête retourne bien le résultat voulu quand TOUTES les variables renseignées concordent. Si il y a incompatibilité, mon script me retourne bien un message d'erreur. En revanche, ce que j'aimerais, c'est que la requête me retourne des résultats même si toutes les variables ne sont pas renseignées.

Je m'explique : si je renseigne par exemple nocommune=1
notype=1
nolocal=2
nodiff=1
noacces=1
nopays=1
noregion=1,

il existe un "nomspot" qui regroupe toutes ces caractéristiques, et la requête me le retourne.
En revanche si je ne renseigne que : nopays=1, je voudrais avoir tous les "nomspot" correspondant à ce pays, sans tenir compte de "notype", "nolocal" ou encore "noacces".
Est-ce possible, ou faut-il que je crée différentes requête en fonction des champs remplis?

En espérant avoir été clair, je vous remercie d'avance de votre attention et de vos eventuelles réponses.
Boris56 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/03/2010, 11h29   #2
Membre Expert
 
Avatar de Fench
 
Inscription : mai 2002
Messages : 1 570
Détails du profil
Informations personnelles :
Localisation : France

Informations forums :
Inscription : mai 2002
Messages : 1 570
Points : 1 703
Points : 1 703
Bonjour,

Soit plusieurs requête ...

Soit l'utilisation des OR mais là il faudra faire une écriture bien carrée ...
Par ex:
Code :
1
2
3
4
 
Select nomspot, image
from tspot, tacces, tcommune, tdifficulte, tlocalite, tpays, tregion, ttype 
where (les and pour les jointures) + (les and pour les valeurs)
Avec pour les and concernant les valeurs faire tes différents cas
Par ex:
Code :
1
2
3
4
5
6
7
8
 
(les and pour les valeur) =
      (les and d'un premier groupe) OR
      (les and d'un deuxième groupe) OR
      ....
      (les and d'une valeur simple comme NoPays) OR
      (les and d'une autre valeur simple) OR
      ....
__________________
Actuellement AI à l'INRA
fait gagner du temps à ceux qui aident , donc un message avec la balise résolu laisse plus de temps pour résoudre d'autres problèmes (balise à cliquer en bas de l'écran)
Fench est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/03/2010, 11h47   #3
Expert Confirmé
 
Avatar de RunCodePhp
 
Inscription : janvier 2010
Messages : 2 242
Détails du profil
Informations personnelles :
Localisation : Réunion

Informations forums :
Inscription : janvier 2010
Messages : 2 242
Points : 2 597
Points : 2 597
Salut

Citation:
La requête retourne bien le résultat voulu quand TOUTES les variables renseignées concordent
Il faudrait créer une chaine SQL qui se contruierait selon la présence ou non des paramètres POST.

Petite parenthèse en passant.
Il est préférable d'utiliser des jointures "naturelles" dans le FROM (JOIN ou INNER JOIN par exemple), et non de simple équivalences entre les tables.
On réserve le WHERE uniquement pour les clauses (ou conditions)
Et pour simplifier les tout, mettre des "alias" aux tables.

A titre d'exemple :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
 
$select = 'SELECT nomspot, image';
 
$from ' FROM tspot ts
JOIN tcommune tc ON tc.nocommune = ts.nocommune
JOIN tdifficulte td ON td.nodiff = ts.nodiff
... etc ...';
 
$where = ' WHERE';
if (isset($_POST["nocommune"]) && !empty($_POST["nocommune"])) {
	$where .= " ts.nocommune = '".$_POST["nocommune"]."'";
}
... etc pour les autre POST ...
 
$sql = $select.$from.$where;
Citation:
En revanche si je ne renseigne que : nopays=1, je voudrais avoir tous les "nomspot" correspondant à ce pays, sans tenir compte de "notype", "nolocal" ou encore "noacces".
Il faudrait alors tenir compte de ta condition au niveau Php.

Un truc du genre :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
 
$where = ' WHERE';
if (isset($_POST["nopays"]) && $_POST["nopays"] == 1) {
	// Construire le $where avec uniquement les équivalences souhaités
	// On exclus les notype, nolocal, noacces
}
else {
	if (isset($_POST["notype"]) && !empty($_POST["notype"])) {
		$where .= " ts.notype= '".$_POST["notype"]."'";
	}
	// ... etc ...
}
__________________
Win XP | WampServer 2.2 | Apache 2.2.21 | Php 5.3.8 | MySQL 5.5.16
Si debugger, c'est supprimer des bugs, alors programmer ne peut être que les ajouter [Edsger Dijkstra]

Dernière modification par RunCodePhp ; 08/03/2010 à 12h05.
RunCodePhp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/03/2010, 13h53   #4
Membre à l'essai
 
Inscription : février 2010
Messages : 103
Détails du profil
Informations forums :
Inscription : février 2010
Messages : 103
Points : 22
Points : 22
Re Bonjour, et Merci beaucoup !

J'ai les résultats escomptés, j'ai utilisé la méthode décrite par RunCodePhp avec la construction de la requête en fonction de la présence de variable. J'y avais pensé, mais étant un grand novice en php, je ne connaissais ni "isset", ni "!empty" .

Juste pour info la requête ressemble pour l'instant à cela, et fonctionne :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
$select = 'SELECT nomspot, image';
 
    $from = ' FROM tspot ts, tpays tp, tregion tr, tcommune tc'
    ;
 
	$where = ' where ts.nocommune=tc.nocommune
				and tr.noregion=tc.noregion
				and tp.nopays=tr.nopays';
if (isset($_POST["nocommune"]) && !empty($_POST["nocommune"])) {
	$where .= " and ts.nocommune = '".$_POST["nocommune"]."'";
}
if (isset($_POST["nopays"]) && !empty($_POST["nopays"])) {
	$where .= " and tp.nopays = '".$_POST["nopays"]."'";
}
if (isset($_POST["noregion"]) && !empty($_POST["noregion"])) {
	$where .= " and tr.noregion = '".$_POST["noregion"]."'";
}
if (isset($_POST["nodiff"]) && !empty($_POST["nodiff"])) {
	$where .= " and ts.nodiff = '".$_POST["nodiff"]."'";
}
if (isset($_POST["noacces"]) && !empty($_POST["noacces"])) {
	$where .= " and ts.noacces = '".$_POST["noacces"]."'";
}
if (isset($_POST["nolocal"]) && !empty($_POST["nolocal"])) {
	$where .= " and ts.nolocal = '".$_POST["nolocal"]."'";
}
if (isset($_POST["notype"]) && !empty($_POST["notype"])) {
	$where .= " and ts.notype = '".$_POST["notype"]."'";
}
 
	$requete = $select.$from.$where;
Je l'ai simplifiée, n'ayant pas besoin d'autant de jointures et je changerai ces dernières en "JOIN" comme conseillé par la suite.

Un grand merci pour cette rapidité et cette efficacité, je suis bluffé !
Boris56 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/03/2010, 14h50   #5
Membre Expert
 
Avatar de Fench
 
Inscription : mai 2002
Messages : 1 570
Détails du profil
Informations personnelles :
Localisation : France

Informations forums :
Inscription : mai 2002
Messages : 1 570
Points : 1 703
Points : 1 703
Bien joué pour le code RunCodePhp

J'suis partis en quenouille pour le coup ...

Mets nous un beau Résolu 'Boris' tu sais bien que je suis dans ma semaine des tags résolus
__________________
Actuellement AI à l'INRA
fait gagner du temps à ceux qui aident , donc un message avec la balise résolu laisse plus de temps pour résoudre d'autres problèmes (balise à cliquer en bas de l'écran)
Fench 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 +1. Il est actuellement 16h07.


 
 
 
 
Partenaires

Hébergement Web