IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PHP & Base de données Discussion :

souci sur une requête [MySQL]


Sujet :

PHP & Base de données

  1. #21
    Membre Expert Avatar de Fench
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Mai 2002
    Messages
    2 353
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Groenland

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 353
    Par défaut
    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' !!

  2. #22
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 818
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    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 : 16 818
    Billets dans le blog
    14
    Par défaut
    Je n'indenterais pas tout à fait de cette manière mais bon...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $codePays = $_POST['codePays'];
    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 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $codePays = mysql_real_escape_string($_POST['codePays']);
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    echo '<p></p>'; 
    	echo $_POST["codePays"];
    	echo '<p></p>'; 
    	echo $_POST["codeDepartement"];
    Je ferais plutôt ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    		echo '<p>Code pays : '.$codePays.'</p>';
    		echo '<p>Code département : '.$codeDepartement.'</p>';
    Quant à la requête, je l'écrirais plutôt ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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 . "'
    	";
    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.

    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 !

    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 ?

    Voici votre code un peu meilleur, mais je n'ai pas changé grand chose qui puisse résoudre votre problème.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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 !!!';
    	}
    }
    ?>
    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.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « 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 la suite Linux Mageïa !

  3. #23
    Membre Expert Avatar de Fench
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Mai 2002
    Messages
    2 353
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Groenland

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 353
    Par défaut
    Citation Envoyé par CinePhil
    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 :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $codePays = mysql_real_escape_string($_POST['codePays']);
    Euuuuhhhh, j'attendrais peut être un peu avant qu'elle se lance dans les injections sql ou les injections php
    Petite remarque d'ailleurs:
    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.
    Peut être qu'il faudrait plutôt dire à Evelyne que tu devrais te mettre à pdo ou mysqli ....

  4. #24
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 818
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    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 : 16 818
    Billets dans le blog
    14
    Par défaut
    Peut être qu'il faudrait plutôt dire à Evelyne que tu devrais te mettre à pdo ou mysqli ....
    Aussi oui... même si je ne le fais pas encore souvent moi même.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « 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 la suite Linux Mageïa !

  5. #25
    Membre confirmé
    Femme Profil pro
    Inscrit en
    Juillet 2012
    Messages
    210
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Secteur : Service public

    Informations forums :
    Inscription : Juillet 2012
    Messages : 210
    Par défaut
    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

  6. #26
    Membre Expert Avatar de Fench
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Mai 2002
    Messages
    2 353
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Groenland

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 353
    Par défaut
    Citation Envoyé par Evelyne31
    Je suis honteuse pour l'erreur sur codeCommune (la dernière fois j'avais mis 3 m !).
    Tu sais que ce type d'erreur et malheureusement la plus courante et presque pas visible

    Et puis moi, je fais un gros pour l'avoir vu ... µ%¤

  7. #27
    Membre confirmé
    Femme Profil pro
    Inscrit en
    Juillet 2012
    Messages
    210
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Secteur : Service public

    Informations forums :
    Inscription : Juillet 2012
    Messages : 210
    Par défaut
    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 :
    Rien n'interdit ici demander un numéro de gîte à Saint-Etienne, dans les Landes, en Italie !
    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.
    - CinePhil :
    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 ?
    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.
    - CinePhil :
    Je pense qu'il faudrait revoir la structure de votre BDD en établissant les hiérarchies géographiques
    Il me semble que c'est fait :
    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

  8. #28
    Membre Expert
    Homme Profil pro
    Développeur C++
    Inscrit en
    Avril 2012
    Messages
    771
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur C++
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2012
    Messages : 771
    Par défaut
    Bonsoir,

    Citation Envoyé par Evelyne31 Voir le message
    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.
    ! 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 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    http://www.monSite.com?idGite=BoNjOuR
    et donc retrouver ta variable $_GET['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 !

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 2 PremièrePremière 12

Discussions similaires

  1. Soucis avec une requête sur une table de 93 000 entrées
    Par lelectronique.com dans le forum Requêtes
    Réponses: 21
    Dernier message: 17/11/2012, 20h27
  2. Soucis sur une requête sql
    Par tryan dans le forum Langage
    Réponses: 4
    Dernier message: 07/10/2010, 22h10
  3. Pb sur une requête SQL (de champ vide)
    Par Marion dans le forum Langage SQL
    Réponses: 3
    Dernier message: 01/07/2004, 12h12
  4. Problème sur une requête INSERT
    Par Marion dans le forum Langage SQL
    Réponses: 3
    Dernier message: 17/06/2003, 09h45
  5. problème sur une requête!!!!!
    Par Mcgrady_01 dans le forum Langage SQL
    Réponses: 2
    Dernier message: 13/06/2003, 02h17

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo