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 :

Ma requête UPDATE ne fonctionne pas


Sujet :

PHP & Base de données

  1. #1
    Membre habitué
    Profil pro
    Étudiant
    Inscrit en
    Mars 2013
    Messages
    388
    Détails du profil
    Informations personnelles :
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2013
    Messages : 388
    Points : 172
    Points
    172
    Par défaut Ma requête UPDATE ne fonctionne pas
    Bonjour,
    Je n'arrive pas à modifier mon formulaire.
    J'ai deux pages :
    Page 1 : modification_suppression_structure.php : permet de rechercher un nom afin de le modifier
    Page 2 : lecture_structure.php : permet d'afficher les champs après la recherche
    Voici le code de la page 1 :
    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
    <?php
    if (isset($_POST['modifier'])){
    	echo"holla";
    	$thematique=addslashes($_POST['thematique']);
    	$nv_nom_contact=addslashes($_POST['nv_nom_contact']); 
    	$desc_contact=addslashes($_POST['desc_contact']);
    	$nom_struct=addslashes($_POST['nom_struct']);
    	$nom_service=addslashes($_POST['nom_service']);
    	$adres_struct=addslashes($_POST['adres_struct']);
    	$pays=$_POST['country'];
    	$code_postal=$_POST['postalcode'];
    	$ville=addslashes($_POST['place']);
    	$tel_struct=$_POST['tel_struct'];
    	$fax_struct=$_POST['fax_struct'];
    	$page_web=addslashes($_POST['page_web']);
    	$mail_struct=$_POST['mail_struct'];
    	$date_ajout = date('Y-m-d H:i:s'); //filemtime('modification_structure.php'); 
    	$filename='modification_suppression_structure.php';
    	$date_maj = date("Y-m-d H:i:s", filemtime($filename)); 
    	$nom_contact=$_POST['nom_contact']; //contact à rechercher
    $reponse = $bdd->query("SELECT * FROM structure WHERE nom_contact='$nom_contact'");
    $donnees = $reponse->fetch(PDO::FETCH_ASSOC);	
    $id= $donnees['id_struct'];	
      PRINT_r($donnees).'<br />';
    $bdd->exec("UPDATE structure SET nom_contact='$nv_nom_contact', desc_contact='$desc_contact',nom_struct='$nom_struct',nom_service='$nom_service',adres_struct='$adres_struct',code_postal='$code_postal',ville='$ville',pays='$pays',tel_struct='$tel_struct',fax_struct='$fax_struct',mail_struct='$mail_struct',page_web='$page_web' WHERE id_struct= '$id'");			
     
    }
    En fait, j'ai besoin de print_r($_POST) et de print-r($_donnees) pour afficher toutes les informations. Ceci parce que dans ma page 2, j'ai le code d'affichage des champs ( $donnee['champ'] ).

    Merci

  2. #2
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Commence déjà par retirer tous tes addslashes() et à remplacer par des requêtes préparées PDO : tes requêtes actuelles sont des trous béants.
    Ensuite fonctionnellement ça serait bien de vérifier si le nom recherché correspond à quelque chose et à quoi il correspond avant de lancer une mise à jour sur le premier élément trouvé.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  3. #3
    Membre habitué
    Profil pro
    Étudiant
    Inscrit en
    Mars 2013
    Messages
    388
    Détails du profil
    Informations personnelles :
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2013
    Messages : 388
    Points : 172
    Points
    172
    Par défaut
    Merci pour votre réponse.
    Commence déjà par retirer tous tes addslashes() et à remplacer par des requêtes préparées PDO : tes requêtes actuelles sont des trous béants.
    Je n'ai pas trouvé d'autre solution pour faire accepter le / dans ma BDD. Je ne savais pas que "prepare" pouvait faire ça ?

    Ensuite fonctionnellement ça serait bien de vérifier si le nom recherché correspond à quelque chose et à quoi il correspond avant de lancer une mise à jour sur le premier élément trouvé.
    En effet, je devrais vérifier si certaines données existent déjà sous le même nom. Pour le moment, j'essaie juste de faire fonctionner la modification.
    Merci pour vos conseils

  4. #4
    Membre expert
    Avatar de Dendrite
    Femme Profil pro
    Développeuse informatique
    Inscrit en
    Juin 2008
    Messages
    2 129
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 58
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeuse informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juin 2008
    Messages : 2 129
    Points : 3 627
    Points
    3 627
    Billets dans le blog
    8
    Par défaut
    http://php.net/manual/fr/pdo.prepare.php

    C'est surtout la remarque 22 qui est très claire

    Note on the SQL injection properties of prepared statements.

    Prepared statements only project you from SQL injection IF you use the bindParam or bindValue option.

    For example if you have a table called users with two fields, username and email and someone updates their username you might run

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    UPDATE `users` SET `user`='$var'
    where $var would be the user submitted text.

    Now if you did
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <?php
    $a=new PDO("mysql:host=localhost;dbname=database;","root","");
    $b=$a->prepare("UPDATE `users` SET user='$var'");
    $b->execute();
    ?>
    and the user had entered User', email='test for a test the injection would occur and the email would be updated to test as well as the user being updated to User.

    Using bindParam as follows
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    <?php
    $var="User', email='test";
    $a=new PDO("mysql:host=localhost;dbname=database;","root","");
    $b=$a->prepare("UPDATE `users` SET user=:var");
    $b->bindParam(":var",$var);
    $b->execute();
    ?>
    The sql would be escaped and update the username to User', email='test'
    PDO, une soupe et au lit !
    Partir de la fin est un bon moyen de retrouver son chemin. Bibi - 2020

  5. #5
    Modératrice
    Avatar de Celira
    Femme Profil pro
    Développeuse PHP/Java
    Inscrit en
    Avril 2007
    Messages
    8 633
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Développeuse PHP/Java
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2007
    Messages : 8 633
    Points : 16 372
    Points
    16 372
    Par défaut
    En complément de la remarque citée par Dendrite, tu peux aussi les paramètres de la requête directement à la fonction execute :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $var="User', email='test";
    $a=new PDO("mysql:host=localhost;dbname=database;","root","");
    $b=$a->prepare("UPDATE `users` SET user=:var");
    $b->execute(array(':var' => $var));
    ce qui est plus simple à appréhender pour un débutant en PDO
    Modératrice PHP
    Aucun navigateur ne propose d'extension boule-de-cristal : postez votre code et vos messages d'erreurs. (Rappel : "ça ne marche pas" n'est pas un message d'erreur)
    Cherchez un peu avant poser votre question : Cours et Tutoriels PHP - FAQ PHP - PDO une soupe et au lit !.

    Affichez votre code en couleurs : [CODE=php][/CODE] (bouton # de l'éditeur) et [C=php][/C]

  6. #6
    Membre habitué
    Profil pro
    Étudiant
    Inscrit en
    Mars 2013
    Messages
    388
    Détails du profil
    Informations personnelles :
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2013
    Messages : 388
    Points : 172
    Points
    172
    Par défaut
    Merci pour vos remarques!
    Il y a deux lignes que je ne comprends pas en fait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    $b=$a->prepare("UPDATE `users` SET user=:var"); //D'habitude je fais user='$var'
    $b->execute(array(':var' => $var));
    A quoi correspondent les deux points ? Et quelle est la différence entre := et <- ?

  7. #7
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Et quelle est la différence entre := et <-
    Le point commun en tout cas c'est qu'aucun des deux n'existent en PHP.

    :xxxxxx est une paramètre nommé PDO.
    http://php.net/manual/fr/pdo.prepare.php
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  8. #8
    Membre habitué
    Profil pro
    Étudiant
    Inscrit en
    Mars 2013
    Messages
    388
    Détails du profil
    Informations personnelles :
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2013
    Messages : 388
    Points : 172
    Points
    172
    Par défaut
    @Sabotage
    Merci pour les explications. J'ai tout inversé, je voulais plutôt écrire =: et ->

  9. #9
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Ce n'est pas un symbole =: c'est un symbole égal suivi de :parametre.
    -> c'est le symbole pour les propriétés les méthodes de classe : $class->methode() et $class->propriete
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  10. #10
    Membre habitué
    Profil pro
    Étudiant
    Inscrit en
    Mars 2013
    Messages
    388
    Détails du profil
    Informations personnelles :
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2013
    Messages : 388
    Points : 172
    Points
    172
    Par défaut
    Ah d'accord, merci bcp pour les explications.

Discussions similaires

  1. [MySQL] Requête update ne fonctionnant pas tout le temps
    Par feldi dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 30/03/2011, 15h44
  2. [AC-2007] Requête Update ne fonctionne pas
    Par franckimmo dans le forum Requêtes et SQL.
    Réponses: 9
    Dernier message: 24/02/2010, 14h58
  3. Requête Update ne fonctionnant pas
    Par Arthorius dans le forum Langage SQL
    Réponses: 4
    Dernier message: 06/01/2009, 09h50
  4. [MySQL] Requête UPDATE ne fonctionne pas
    Par JackBeauregard dans le forum PHP & Base de données
    Réponses: 25
    Dernier message: 29/01/2007, 23h32
  5. requête update qui marche pas
    Par MrsFrizz dans le forum Langage SQL
    Réponses: 4
    Dernier message: 01/12/2004, 08h16

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