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 :

SQL et POO (update / delete) [MySQL]


Sujet :

PHP & Base de données

  1. #1
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2017
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2017
    Messages : 41
    Par défaut SQL et POO (update / delete)
    Bonjour,

    J'ai un nouveau petit problème concernant mes bases de données et mon code en POO.

    En effet, j'ai une première classe manager billetManager, tel que :

    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
     
     
    class billetManager extends bddmanager
    {
     
        public function update(Billet $billet) {
            $bdd = $this->bdd;
            $query = "UPDATE T_BILLET SET BIL_TITRE = :titre, BIL_CONTENU = :contenu where BIL_ID =" .$bilId;
            $req = $bdd->prepare($query);
            $req->bindValue(':titre', $billet->getbilTitre(), PDO::PARAM_STR);
            $req->bindValue(':contenu', $billet->getbilContenu(), PDO::PARAM_STR);
            $req->execute();
        }
     
     
        public function delete(Billet $billet)
        {
            $bdd = $this->bdd;
            $query ="DELETE FROM T_BILLET where BIL_ID = :bilId";
            $req = $bdd->prepare($query);
            $req->bindValue('bilId', $billet->getbilId(), PDO::PARAM_STR);
            $req->execute();
        }
     
     
        public function create(Billet $billet) {
            $bdd = $this->bdd;
            $query ='INSERT INTO T_BILLET (BIL_TITRE, BIL_CONTENU, BIL_DATE) VALUES (:titre, :contenu, NOW())';
            $req = $bdd->prepare($query);
            $req->bindValue(':titre', $billet->getbilTitre(), PDO::PARAM_STR);
            $req->bindValue(':contenu', $billet->getbilContenu(), PDO::PARAM_STR);
            $req->execute();
        }
    Ma bdd est bien configurée, donc jusque là ça devrait être bon.

    Ensuite, j'ai un controleur, qui gère l'appel de la fonction update / delete (la fonction create fonctionne bien !)

    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
     
     
    class modif_billet {
        public function updateBillet($params){
     
            $newbillet = new Billet();
            $newbillet->setbilTitre($params['titre']);
            $newbillet->setbilContenu($params['contenu']);
            $em = new billetManager();
            $em->update($newbillet);
     
            $view = new View;
            $view->render('Mod_Del');
     
        }
     
        public function deleteBillet($params){
            $delbillet = new Billet();
            $delbillet->setbilId($params['bilId']);
            $em = new billetManager();
            $em->delete($delbillet);
     
            $view = new View;
            $view->render('Mod_Del');
        }
    }
    Et enfin, j'ai ma vue associée, qui appelle les actions en faisant passer pour chaque champ de ma BDD un $params['nomduchamp'], qui est converti dans mon routeur par un $params = $_POST['params']; puis récupéré dans mon controleur :

    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
     
     
    <?php
     
    if(isset($_GET['id'])) {
        $billet_id = $_GET['id'];
        $manager = new billetManager();
        $billet = $manager->getBilletById($billet_id);
    }
     
    include_once(PARTIAL . '_head.php');
    include_once(PARTIAL . '_nav.php');
     
    ?>
     
    <?php if(is_array($billet))
    foreach ($billet as $billet_unique): ?>
    <form name="formulaire" id="formulaire" action="index.php?action=updateBillet" method="post">
        <label for="texte" ><br><strong>Article à modifier : </strong> <br></label><br />
        <label for="titre" ><strong>Titre de l'épisode <?php echo $billet_unique->bilId ?>: <input type = "text" rows="5" class="input" size="50" style="height:25px;"
        name = "params[titre]" id = "titre" value = "<?php echo $billet_unique->bilTitre ?>"</strong></label>
        <input id="submit_button" type="submit" value="Supprimer" name = 'params[id]' />
        <br /><br />
        <textarea id="texte" class="input" name="params[contenu]" rows="25" ><?php echo $billet_unique->bilContenu ?></textarea>
        <br />
        <input id="submit_button" type="submit" value="Modifier" />
    </form>
     
        <form name="formulaire" id="formulaire" action="index.php?action=deleteBillet" method="post">
            <input id="submit_button" type="submit" value="Supprimer" name = 'params[id]' />
        </form>
     
        <?php var_dump($billet) ?>
    <?php endforeach ?>
     
    <?php include_once(PARTIAL . '_footer.php');
     
    ?>
    L'idée donc, serait de réussir à updater en fonction de mon id du billet.

    Je mets aussi la classe Billet pour les setters et getters :

    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
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
     
    <?php
     
    // Création de la classe Billet / Définition des setters et getters
     
    class Billet
    {
        public $bilId;
        public $bilDate;
        public $bilTitre;
        public $bilContenu;
     
        public function hydrate($donnees)
        {
            foreach ($donnees as $attribut => $valeur)
            {
                $methode = 'set'.str_replace(' ', '', ucwords(str_replace('_', ' ', $attribut)));
     
                if (is_callable(array($this, $methode)))
                {
                    $this->$methode($valeur);
                }
            }
        }
     
        public function getbilId()
        {
            return $this->bilId;
        }
        public function setbilId($bilId)
        {
            $this->bilId = $bilId;
        }
     
     
        public function getbilDate()
        {
            return $this->bilDate;
        }
        public function setbilDate($bilDate)
        {
            $this->bilDate = $bilDate;
        }
     
     
        public function getbilTitre()
        {
            return $this->bilTitre;
        }
        public function setbilTitre($bilTitre)
        {
            $this->bilTitre = $bilTitre;
        }
     
        public function getbilContenu()
        {
            return $this->bilContenu;
        }
        public function setbilContenu($bilContenu)
        {
            $this->bilContenu = $bilContenu;
        }
     
        public function save()
        {
            // connect to bdd & save
            $manager = new billetManager();
            $manager->persist($this);
            return $this;
        }
    }
    J'ai tenté les var_dump de tous les côtés, c'est comme si ma valeur id n'était déjà même pas récupérée dans mon controlleur, mais je ne vois pas comment faire différemment... Pour le moment, j'ai surtout regardé du coté de l'update, je pense que ce sera la même chose après pour la fonction delete..

    Merci d'avance pour vos suggestions si vous en avez

  2. #2
    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 : 40
    Localisation : France

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 8 633
    Par défaut
    Je ne vois pas où dans ton formulaire se trouve le champ pour transmettre l'id. Du coup, c'est assez normal que ton controlleur ne l'ait pas reçu.
    Ajoute un champ hidden pour l'id, et ça devrait marcher beaucoup mieux.
    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    <form name="formulaire" id="formulaire" action="index.php?action=updateBillet" method="post">
        <label for="texte" ><br><strong>Article à modifier : </strong> <br></label><br />
        <label for="titre" ><strong>Titre de l'épisode <?php echo $billet_unique->bilId ?>: <input type = "text" rows="5" class="input" size="50" style="height:25px;"
        name = "params[titre]" id = "titre" value = "<?php echo $billet_unique->bilTitre ?>"</strong></label>
        <input type="hidden" name = 'params[id]'  value="<?php echo $billet_unique->bilId ?>"/>
        <br /><br />
        <textarea id="texte" class="input" name="params[contenu]" rows="25" ><?php echo $billet_unique->bilContenu ?></textarea>
        <br />
        <input id="submit_button" type="submit" value="Modifier" />
    </form>
    et à la récupération :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $newbillet = new Billet();
    $newbillet->setbilId($params['id']);
    $newbillet->setbilTitre($params['titre']);
    $newbillet->setbilContenu($params['contenu']);
    Au passage, normalement dans une page html, les id des balises sont uniques. C'est comme ça que tu peux associer un label et son champ. Or, là tu vas avoir autant de champs portant l'id "titre" que de tours de boucle. Du coup, si tu cliques sur ton label titre, ya de fortes chances que ça n'arrive pas dans le bon champ
    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]

  3. #3
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2017
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2017
    Messages : 41
    Par défaut
    En modifiant mon code comme ça, il me dit : Notice: Undefined variable: bilId in C:\Users\Adrien.Gautier\Desktop\P3Abiolab\P3_V9\entity\billetManager.php on line 49

    Cette ligne correspond à ma requête : $query = "UPDATE T_BILLET SET BIL_TITRE = :titre, BIL_CONTENU = :contenu where BIL_ID =" .$bilId;


    Pour ta remarque, comment ça ? le for du label correspond à l'id du input ? Enfin ils ont le même role ?

  4. #4
    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 : 40
    Localisation : France

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 8 633
    Par défaut
    Et d'où venait $bilId avant la modification ? Est-ce que ça ne devrai pas plutôt être $billet->bilId ?

    Pour le reste :
    la balise <label> permet de donner un libellé à un champ de formulaire en les associant à l'aide de l'attribut for de cette balise qui doit être identique à l'attribut id du champ auquel elle est rattachée. Le texte mis dans le label est alors cliquable.
    C'est surtout utile pour les cases à cocher et les boutons radios : tu cliques sur le libellé et ça coche la case.
    Mais si tu as plusieurs champs avec le même id (et plusieurs labels qui visent le même id), tu perds tout l'intérêt de l'association label/input, et tu n'as plus que la mise en forme.
    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]

  5. #5
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 814
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    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 814
    Billets dans le blog
    14
    Par défaut
    Mais si tu as plusieurs champs avec le même id
    Euh... un id est censé être unique, non ?
    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 !

  6. #6
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2017
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2017
    Messages : 41
    Par défaut
    Ok j'ai compris. Je vais revoir mon code en fonction de ça alors. Pour le update, du coup c'était bien ça qui bloquait ma requête. Du coup en théorie, il faudrait que je fasse la même chose pour le delete, à savoir :

    Pour la requete :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
     
      public function delete(Billet $billet)
        {
            $bdd = $this->bdd;
            $query ="DELETE FROM T_BILLET where BIL_ID =" .$billet->bilId;
            $req = $bdd->prepare($query);
            $req->execute();
        }
    pour le controlleur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
        public function deleteBillet($params){
            $delbillet = new Billet();
            $delbillet->setbilId($params['id']);
            $em = new billetManager();
            $em->delete($delbillet);
    }
    pour la vue :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
     
        <form name="formulaire" id="formulaire" action="index.php?action=deleteBillet" method="post">
            <input id="submit_button" type="submit" value="Supprimer" name = 'params[id]' />
        </form>
    Or quand je fais ça, ça ne me renvoie pas de messages d'erreurs, seulement un message quand je fais un var_dump de $delbillet :

    object(Billet)[13]
    public 'bilId' => string 'Supprimer' (length=9)
    public 'bilDate' => null
    public 'bilTitre' => null
    public 'bilContenu' => null

    Quand j'attribue à mon input la value <?php echo $billet_unique->bilId ?>, j'ai juste un 7 (mon id) qui remonte et pas le supprimer (forcément :p). Comment faire pour réussir à combiner la valeur supprimer et la récupération de ma variable ?

  7. #7
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2017
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2017
    Messages : 41
    Par défaut
    Ok j'ai trouvé, j'avais juste à rajouter un input en hidden laisser le submit tranquille tel que :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
            <input type="hidden" name = 'params[id]'  value="<?php echo $billet_unique->bilId ?>"/>
            <input id="submit_button" type="submit" value="Supprimer" />
    Super, c'est résolu de mon coté, merci du coup de main !

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

Discussions similaires

  1. LINQ to SQL] Tracer les requêtes SQL d'Insert/Update/Delete
    Par annalady dans le forum Accès aux données
    Réponses: 5
    Dernier message: 30/07/2009, 10h17
  2. [ SQL ] Faire un update avec un select imbriqué
    Par zozolh2 dans le forum Langage SQL
    Réponses: 2
    Dernier message: 11/04/2005, 12h05
  3. Réponses: 4
    Dernier message: 05/04/2005, 18h28
  4. [requete SQL] Probleme requete UPDATE
    Par Shiryu44 dans le forum JDBC
    Réponses: 12
    Dernier message: 10/03/2005, 11h41
  5. Redirect de la page après un insert/update/delete
    Par mchicoix dans le forum XMLRAD
    Réponses: 5
    Dernier message: 25/02/2005, 09h31

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