Pour l'erreur, tu as fait les bons if et else ET donc il y a bien un champ qui doit être empty ...
Comme j'ai regardé ta manière d'écrire le nom des champs, il y en a un qui semble différent:
$_POST["codecommune"]ce ne serait pas 'codeCommune' !!
Version imprimable
Pour l'erreur, tu as fait les bons if et else ET donc il y a bien un champ qui doit être empty ...
Comme j'ai regardé ta manière d'écrire le nom des champs, il y en a un qui semble différent:
$_POST["codecommune"]ce ne serait pas 'codeCommune' !!
Je n'indenterais pas tout à fait de cette manière mais bon...
Affecter la valeur d'une variable ($_POST['codePays']) à une autre ($codePays) ne présente ici aucun intérêt. Par contre, il serait utile de protéger ces données issues d'un formulaire contre les injections SQL :Citation:
Code:$codePays = $_POST['codePays'];
Code:$codePays = mysql_real_escape_string($_POST['codePays']);
Je ferais plutôt ainsi :Citation:
Code:
1
2
3
4 echo '<p></p>'; echo $_POST["codePays"]; echo '<p></p>'; echo $_POST["codeDepartement"];
Quant à la requête, je l'écrirais plutôt ainsi :Code:
1
2 echo '<p>Code pays : '.$codePays.'</p>'; echo '<p>Code département : '.$codeDepartement.'</p>';
Séparation claire dans la requête de ce qui relève de la jointure ou de la restriction, puisque nous avons ici des jointures internes.Code:
1
2
3
4
5
6
7
8
9
10
11 $query = " SELECT ID_gite FROM GITE g JOIN PAYS p ON g.ID_pays = p.ID_pays JOIN DEPARTEMENT cd ON g.ID_departement = cd.ID_departement JOIN COMMUNE cc ON g.ID_commune = cc.ID_commune WHERE numGite = '" . $numGite . "' AND codePays = '" . $codePays . "' AND codeDepartement = '" . $codeDepartement . "' AND codeCommune = '" . $codeCommune . "' ";
J'en profite pour glisser une remarque dont j'avais évoqué la survenue ultérieure dans la discussion :
Rien n'interdit ici demander un numéro de gîte à Saint-Etienne, dans les Landes, en Italie ! :aie:
Je pense qu'il faudrait revoir la structure de votre BDD en établissant les hiérarchies géographiques :
ville -1,1----situer----0,n- pays
|-------0,1----situer----0,n- departement <= + contrainte : pour les villes situées en France.
Ensuite, je suis étonné qu'on demande un ID_gite alors qu'on spécifie déjà dans le WHERE un numGite. Il peut y avoir plusieurs numGite pour un ID_gite ? 8O
Voici votre code un peu meilleur, mais je n'ai pas changé grand chose qui puisse résoudre votre problème.
Il faudrait le code du formulaire car ici le traitement semble correct, en dehors du fait qu'il n'y a pas d'exploitation du résultat de la requête.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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48 <?php //on vérifie que le formulaire a bien été envoyé if (isset($_POST["faire"])) { //on vérifie que les 5 champs obligatoires sont renseignés if (!empty($_POST["codePays"]) && !empty($_POST["codeDepartement"]) && !empty($_POST["codecommune"]) && !empty($_POST["numGite"]) && !empty($_POST["numEchantillon"]) ) { //si oui, on initialise les variables correspondantes $codePays = mysql_real_escape_string($_POST['codePays']); $codeDepartement = mysql_real_escape_string($_POST["codeDepartement"]); $codeCommune = mysql_real_escape_string($_POST["codeCommune"]); $numGite = mysql_real_escape_string($_POST["numGite"]); $numEchantillon = mysql_real_escape_string($_POST["numEchantillon"]); //et on affiche les valeurs, juste pour contrôle provisoire echo '<p>Code pays : '.$codePays.'</p>'; echo '<p>Code département : '.$codeDepartement.'</p>'; ... //puis on lance le reste du traitement : exécution de la requête SANS SORTIR de la condition $bdd = mysql_connect('localhost', 'root', 'root') or die('Impossible de se connecter : ' . mysql_error()); echo 'Connected successfully'; mysql_select_db('lithotheque') or die('Impossible de sélectionner la base de données'); $query = " SELECT ID_gite FROM GITE g JOIN PAYS p ON g.ID_pays = p.ID_pays JOIN DEPARTEMENT cd ON g.ID_departement = cd.ID_departement JOIN COMMUNE cc ON g.ID_commune = cc.ID_commune WHERE numGite = '" . $numGite . "' AND codePays = '" . $codePays . "' AND codeDepartement = '" . $codeDepartement . "' AND codeCommune = '" . $codeCommune . "' "; $result= mysql_query($query) or die('Erreur SQL ! </br>'. $query.'</br>'.mysql_error()); } else { //si au moins un champ du formulaire n'est pas renseigné = message d'erreur echo 'Un champ obligatoire est vide !!!'; } } ?>
Euuuuhhhh, j'attendrais peut être un peu avant qu'elle se lance dans les injections sql ou les injections phpCitation:
Envoyé par CinePhil
Petite remarque d'ailleurs:
Peut être qu'il faudrait plutôt dire à Evelyne que tu devrais te mettre à pdo ou mysqli ....Citation:
note: Si vous utilisez cette fonction et que les guillemets magiques sont activés par défaut sur votre serveur (90% du temps en mutualisé) vous effectuerez un double échappement de certains caractères, un ‘\’ sera par ex. ajouté à tous les apostrophes, guillements & co avant les insertions en base. Cela allourdira votre base de données pour rien et vous obligera à faire un stripslashes() des valeurs inutile en sortie. Si actif la fonction get_magic_quotes_gpc() renverra la valeur 1.
Aussi oui... même si je ne le fais pas encore souvent moi même. :oops:Citation:
Peut être qu'il faudrait plutôt dire à Evelyne que tu devrais te mettre à pdo ou mysqli ....
Merci très sincèrement Fench et CinePhil,
Je suis honteuse pour l'erreur sur codeCommune (la dernière fois j'avais mis 3 m !).
J'étudie vos derniers conseils et remets mon ouvrage sur le métier. Je vous tiens informés.
A +
Evelyne31
Tu sais que ce type d'erreur et malheureusement la plus courante et presque pas visible ;)Citation:
Envoyé par Evelyne31
Et puis moi, je fais un gros :yaisse: pour l'avoir vu ... :lol: µ%¤
Bonsoir,
Tout d'abord toutes mes félicitations à Fench pour avoir trouvé mon erreur "invisible", je calais dessus depuis un bon moment.
Ensuite : j'ai enfin résolu mon problème de requête, j'ai fait un print_r et j'obtiens bien le résultat attendu. De plus, avec vos conseils mon code est tout propre et bien lisible.
Je réponds à toutes vos questions avant de mettre en résolu :
- CinePhil :Ce n'est pas possible car j'ai fait un menu déroulant imbriqué à 3 niveaux (pays, départements, communes) (un grand merci à Eric69 pour son aide à ce sujet). Si on sélectionne un pays, seuls les départements associés sont proposés en 3ème choix, idem pour les communes.Citation:
Rien n'interdit ici demander un numéro de gîte à Saint-Etienne, dans les Landes, en Italie !
- CinePhil :J'ai besoin de l'ID_gite correspondant au numéro de gîte inséré dans le formulaire pour l'insérer ensuite en clé étrangère dans une table.Citation:
je suis étonné qu'on demande un ID_gite alors qu'on spécifie déjà dans le WHERE un numGite. Il peut y avoir plusieurs numGite pour un ID_gite ?
- CinePhil :Il me semble que c'est fait :Citation:
Je pense qu'il faudrait revoir la structure de votre BDD en établissant les hiérarchies géographiques
pays -0,n----contenir_1----1,1- departement
departement -0,n----contenir_2----1,1- commune
Je suis trop contente, je passe enfin à la suite de mon projet :
- terminer le traitement de ce formulaire en faisant mes inserts,
- faire le traitement d'un autre formulaire,
- faire un formulaire de recherche sur ma base,
- réaliser un accès pour les membres et un autre pour le public.
Pour tout cela vos remarques/conseils vont me servir à chaque ligne ainsi que ce site.
Nul doute que je ferai à nouveau appel à ce forum.
Je ne sais plus quoi dire pour vous remercier alors 1001 nouveaux mercis, très bonne soirée et à très bientôt,
Evelyne31
Bonsoir,
! fait très attention ce n'est pas parce que dans ton formulaire tu ne propose que c'est choix que tu oblige l'utilisateur à les utiliser, il peu très bien modifier le formulaire d'envoi de deux façon :
La première si ton formulaire utilise la method GET, il lui suffit alors directement de modifier la variable qui se trouve dans l'url, exemple :
et donc retrouver ta variable $_GET['idGite'] = "BoNjOuR".Code:http://www.monSite.com?idGite=BoNjOuR
Pour les formulaires utilisant la méthode post c'est un peu plus compliqué pour monsieur tout le monde, une extension de firefox permet de modifier TOUTES les variables envoyées en POST avant l'exécution de ton script php, donc tu pourrait quand même avoir $_POST['idGite'] qui soit = à "bonjour".
Quand tu fait de la programmation et que tu demande quelque chose à l'utilisateur une seul règle :
NE JAMAIS LUI FAIRE CONFIANCE !