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 :

Modification de la base de données


Sujet :

PHP & Base de données

  1. #1
    Membre régulier Avatar de Markos22
    Homme Profil pro
    Développeur Java
    Inscrit en
    Juillet 2016
    Messages
    198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Juillet 2016
    Messages : 198
    Points : 84
    Points
    84
    Par défaut Modification de la base de données
    Bonjour,

    Je ne comprends pas comment modifier les enregistrement d'une base de données à partir d'un formulaire php. Voici ce que j'ai essayé :

    J’ai une base de données comprenant une liste de biens immobiliers.
    Lorsque je clique sur un élément de ma liste de biens, j’envoie une requête GET à mon url. $_GET[‘bien’] contient l’id de mon bien (sa clé primaire auto-incrémentée). Un formulaire de saisie s'affiche alors qui me permet de saisir de nouvelles valeurs pour les champs de mon bien.

    Lorsque je soumets le formulaire, je crée donc un objet BienDAO , qui va m’aider à modifier ma base de données.

    Cet objet me renvoie une connexion à ma base de données. C’est l’objet qui gère les méthodes CRUD avec ma base de données : Je crée donc un bien qui reprend les valeurs des champs de l’enregistrement correspondant à l’id en question dans ma base de données :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $bien = $dao->trouver($_GET['bien']);
    La méthode trouver() est définie ainsi :

    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
    public function trouver($id) {
     
            $id = (int) $id;
     
            $req = $this->bdd->query('SELECT * FROM biens WHERE id = '.$id);
            $donnees = $req->fetch();
     
            $bien_trouve = new Bien();
     
            foreach ($donnees as $attr => $valeur) {
                $setter = 'set'.ucfirst($attr);
     
                $bien_trouve->$setter($valeur);
            }
            return $bien_trouve;
     
        }
    Je fais donc :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    foreach ($_POST as $attr => $valeur) {
        $setter = 'set'.ucfirst($attr);
        if(method_exists($dao, $setter)) {
            $bien->$setter($valeur);
        }
    }
    $bien->setId((int) $_GET['bien']);
    $dao->modifier($bien);
    Quant à la méthode modifier() la voici :

    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
    public function modifier(Bien $bien) {
     
            $req = $this->bdd->prepare('UPDATE biens SET type = :type, date_modif = :date_modif, description = :description, code_postal = :code_postal, ville = :ville, voie = :voie, superficie = :superficie, montant = :montant WHERE id = :id');
     
            $req->bindValue(':type',$bien->getType(),PDO::PARAM_STR);
            $req->bindValue(':date_modif',date('Y-m-d'),PDO::PARAM_STR);
            $req->bindValue(':description',$bien->getDescription(),PDO::PARAM_STR);
            $req->bindValue(':code_postal',$bien->getCode_postal(),PDO::PARAM_INT);
            $req->bindValue(':ville',$bien->getVille(),PDO::PARAM_STR);
            $req->bindValue(':voie',$bien->getVoie(),PDO::PARAM_STR);
            $req->bindValue(':superficie',$bien->getSuperficie(),PDO::PARAM_INT);
            $req->bindValue(':montant',$bien->getMontant(),PDO::PARAM_INT);
            $req->bindValue(':id',$bien->getId(),PDO::PARAM_INT);
     
            $req->execute();
            $req->CloseCursor();
        }
    Je ne comprends pas pourquoi la modification n’est pas effectuée dans la base de données. Mon objet Bien a toujours les mêmes attributs.

    Merci de votre aide,

    A bientôt !

  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
    Mon objet Bien a toujours les mêmes attributs.
    Tu veux dire que les valeurs de l'objet "bien" ne sont pas modifiées au moment où tu appelles la méthode "modifier" ?

    Dans ton formulaire tu envoies l'id en $_GET dans l'action en plus des autres valeurs en $_POST ?
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  3. #3
    Membre régulier Avatar de Markos22
    Homme Profil pro
    Développeur Java
    Inscrit en
    Juillet 2016
    Messages
    198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Juillet 2016
    Messages : 198
    Points : 84
    Points
    84
    Par défaut
    Citation Envoyé par sabotage Voir le message
    Tu veux dire que les valeurs de l'objet "bien" ne sont pas modifiées au moment où tu appelles la méthode "modifier" ?

    Dans ton formulaire tu envoies l'id en $_GET dans l'action en plus des autres valeurs en $_POST ?
    Oui, c'est exactement ça. Les valeurs de l'objet '$bien' ne sont pas modifiées, et, par conséquent, l'enregistrement en base de données non plus. L'id du bien est GET['bien']. Il est envoyé par clic sur la liste qui est composée de balises <a> comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    echo '	<a class="list-group-item list-group-item-action" href="form_modif.php?bien='.$bien->getId().'" id="bien-item-'.($bien->getId()).'"><strong>'.($key+1).'. '.$bien->getVoie().', '.$bien->getVille().'</strong><br/>'.$bien->getDescription().'</a>
    Cette variable est bien transmise correctement. Je l'ai testée.

  4. #4
    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
    Mais dans le formulaire il passe comment cet id ?
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  5. #5
    Membre régulier Avatar de Markos22
    Homme Profil pro
    Développeur Java
    Inscrit en
    Juillet 2016
    Messages
    198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Juillet 2016
    Messages : 198
    Points : 84
    Points
    84
    Par défaut
    Citation Envoyé par sabotage Voir le message
    Mais dans le formulaire il passe comment cet id ?
    Il est transmis en get par l'url, puisque les liens se terminent par href="form_modif.php?bien=xx", il est donc stocké dans la globale $_GET['bien'] et aurait dû être récupéré par $bien = $dao->trouver($_GET['bien']);, qui récupère le contenu de GET['bien'] (donc l'id), et va chercher en base de données l'enregistrement correspondant ("SELECT...WHERE id=...)

  6. #6
    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
    Tu as contrôlé ce qui se passait dans ta boucle de setter ?
    Par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    foreach ($_POST as $attr => $valeur) {
        $setter = 'set'.ucfirst($attr);
        echo 'setter : ' . $setter;
        if(method_exists($dao, $setter)) {
            $bien->$setter($valeur);
            echo ' trouvé<br/>';
        }
        else {
           echo ' non trouvé<br/>';
        }
    }
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  7. #7
    Membre régulier Avatar de Markos22
    Homme Profil pro
    Développeur Java
    Inscrit en
    Juillet 2016
    Messages
    198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Juillet 2016
    Messages : 198
    Points : 84
    Points
    84
    Par défaut
    Citation Envoyé par sabotage Voir le message
    Tu as contrôlé ce qui se passait dans ta boucle de setter ?
    Par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    foreach ($_POST as $attr => $valeur) {
        $setter = 'set'.ucfirst($attr);
        echo 'setter : ' . $setter;
        if(method_exists($dao, $setter)) {
            $bien->$setter($valeur);
            echo ' trouvé<br/>';
        }
        else {
           echo ' non trouvé<br/>';
        }
    }
    Bonne question ! Apparemment, il n'a pas trouvé les méthodes....
    (après avoir essayé : )

    Merci, @sabotage ! C'était effectivement là : comme d'habitude, une fois qu'on a trouvé l'erreur, on se sent tout bête ! Ca fait 48 heures que je cherche et que je me désespère dessus, alors que je n'utilisais pas le bon objet. Ce n'est pas l'objet BienDAO qui possède les setters, mais l'objet métier "Bien". Donc : au lieu de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if(method_exists($dao, $setter))
    il fallait écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if(method_exists($bien, $setter))
    Ouf ! Le problème est résolu ! Merci mille fois, sabotage !

    A+

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 4
    Dernier message: 11/01/2008, 12h18
  2. Problème lors d'une modification d'une base de données
    Par 4rocky4 dans le forum Modélisation
    Réponses: 2
    Dernier message: 08/01/2008, 16h04
  3. Réponses: 17
    Dernier message: 18/07/2007, 15h46
  4. [VB.net 2003] Annuler les dernieres modifications d'une base de donnée
    Par winny107 dans le forum Accès aux données
    Réponses: 2
    Dernier message: 10/10/2006, 07h05
  5. Modification d'une base de donnée
    Par scorpion37 dans le forum C++Builder
    Réponses: 70
    Dernier message: 16/06/2006, 09h08

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