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 :

Récupération + modification d'un article (MVC)


Sujet :

PHP & Base de données

  1. #1
    Membre confirmé Avatar de Elztx
    Femme Profil pro
    Étudiant
    Inscrit en
    Mars 2019
    Messages
    72
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2019
    Messages : 72
    Par défaut Récupération + modification d'un article (MVC)
    Bonjour,

    Je souhaiterai ajouter une fonction d'édition d'article à mon blog sur le backoffice.

    Côté édition sans récupération, j'ai ajouté mon code qui ne me renvoie pas d'erreur mais par contre, la requête ne semble pas fonctionner (mais je vais creuser encore)...

    Mon plus gros souci est que je souhaite récupérer le titre et le contenu de l'article sans y parvenir...
    Je vous joins mon code, si quelqu'un peut jeter un oeil !

    La div d'édition de l'article dans la vue "editarticleview" :
    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
    <div class="row" id="newarticle">
        <div class="col-md-12">
          <h3>Editer l'article article :</h3>
     
          <form action="index.php?action=editArticle" method="post">
            <div class="form-group">
              <input class="form-control" type="text" name="title" value="<?php echo $post['title']; ?>" placeholder="Titre">
            </div>
     
            <div class="form-group">
              <textarea rows="2" class="form-control" name="content" id="tinyarea" value="<?php echo $post['content']; ?>" placeholder="Contenu"></textarea>
            </div>
     
            <div class="modal-footer ">
              <button type="submit" class="btn btn-warning btn-lg" style="width: 100%;"><span class="glyphicon glyphicon-ok-sign"></span>Enregistrer l'article</button>
            </div>
          </form>
        </div>
      </div>
    La partie du contrôleur associée à l'édition de l'article :
    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
    function editArticle($title, $content, $id)
    {
        $postManager = new PostManager();
     
        $post = $postManager->editArticle($title, $content, $id);
        $affectedLines = $postManager->editArticle($title, $content, $id);
     
        if ($affectedLines === false) {
            // Erreur gérée. Elle sera remontée jusqu'au bloc try du routeur !
            throw new Exception('Impossible d\'éditer le billet !');
        }    
        else {
            header('Location: /index.php?action=listPostsAdmin');
            exit;
        }
    }
    La fonction du PostManager (modèle) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    public function editArticle($title, $content, $id)
        {
            $db = $this->dbConnect();
            $edit = $db->prepare('UPDATE article SET title =?, content =? WHERE id =?');
            $edit->execute(array($title, $content, $id ));
     
            return $edit;
     
            $req = $db->prepare('SELECT id, title, content FROM article WHERE id = ?');
            $req->execute(array($id));
            $post = $req->fetch();
     
            return $post;
        }
    Et enfin, la partie du bloc try-catch du code du routeur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    elseif ($_GET['action'] == 'editArticle') {
                    if (!empty($_POST['title']) && !empty($_POST['content'])) {
                        $id = (!empty($_GET['id']))? intval($_GET['id']) : 0;
                        editArticle($_POST['title'], $_POST['content'], $id);
                    }
                    else {
                        // Autre exception
                        throw new Exception('Tous les champs ne sont pas remplis !');
                    }
            }
    L'erreur renvoyée étant que la variable $post de ma vue n'est pas définie.
    J'ai conscience d'avoir fait une boulette, mais je n'arrive vraiment pas à voir mon erreur, elle me parait définie..

    Il y a encore plein de choses qui m'échappent avec PHP, soyez indulgents s'il vous plait

    Merci d'avance !

  2. #2
    Expert confirmé
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 647
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 647
    Par défaut
    quand vous avez un soucis de ce genre, vous pouvez le réglez en affichant le contenu de la variable et en vérifiant qu'elle contient la valeur prévue.
    et quand ce n'est pas le case, remontez dans le code pour voir d'où vient cette valeur et recommencez l'affichage de la variable jusqu'à arriver à la source du soucis.

  3. #3
    Membre très actif
    Homme Profil pro
    Déveleoppeur Web/Mobile
    Inscrit en
    Avril 2013
    Messages
    330
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Déveleoppeur Web/Mobile
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2013
    Messages : 330
    Par défaut
    Bonjour,

    Dans la vue tu utilises la variable $post mais à quel moment la récupères tu ?

  4. #4
    Membre confirmé Avatar de Elztx
    Femme Profil pro
    Étudiant
    Inscrit en
    Mars 2019
    Messages
    72
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2019
    Messages : 72
    Par défaut
    Bonjour,

    Mmmh, il faut que je fasse un foreach dans la vue ?

    En fait je me suis appuyé sur mon mvc affichant un article du blog, je crois que je m'induis en erreur toute seule du coup, j'ai la tête qui chauffe ...
    Dans ma vue d'article j'ai ceci pour récupérer l'article :
    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    <h2><?= htmlspecialchars($post['title']) ?></h2>
                    <p>
                        <div id="testarticle">
                            <p><?= nl2br($post['content']) ?></p></div>

    Côté contrôleur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    function post()
    {
        $postManager = new PostManager();
        $commentManager = new CommentManager();
     
        $post = $postManager->getPost($_GET['id']);
        $comments = $commentManager->getComments($_GET['id']);
     
        require('./vues/articleview.php');
    }
    côté modèle :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    public function getPost($postId)
        {
            $db = $this->dbConnect();
            $req = $db->prepare('SELECT id, title, content, DATE_FORMAT(date, \'%d/%m/%Y\') AS date FROM article WHERE id = ?');
            $req->execute(array($postId));
            $post = $req->fetch();
     
            return $post;
        }
    et dans le routeur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    elseif ($_GET['action'] == 'post') {
                if (isset($_GET['id']) && $_GET['id'] > 0) {
                    post();
                }
                else {
                    // Erreur ! On arrête tout, on envoie une exception, donc au saute directement au catch
                    throw new Exception('Aucun identifiant de billet envoyé');
                }
            }
    Je suis vraiment perdue...

  5. #5
    Expert confirmé Avatar de Toufik83
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2012
    Messages
    2 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2012
    Messages : 2 499
    Par défaut
    Salut,

    Regarde ce que tu as écris ici dans la fonction editArticle
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    public function editArticle($title, $content, $id)
        {
            ...
            return $edit;
            ....
            return $post;
        }
    Tu as mis 2 return donc la fonction renvoi la variable $edit puis elle quitte le contexte immédiatement, les autres lignes du code ne seront pas prises en compte...

    Ce qui explique pourquoi la variable $post est indéfinie.

    Citation Envoyé par Elztx Voir le message
    Mon plus gros souci est que je souhaite récupérer le titre et le contenu de l'article sans y parvenir...
    Si tu veux être sûre que la modification s'est correctement terminée, il suffit de vérifier avec rowCount()
    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
     
    public function editArticle($title, $content, $id)
        {
            $db = $this->dbConnect();
            $edit = $db->prepare('UPDATE article SET title =?, content =? WHERE id =?');
            $edit->execute(array($title, $content, $id ));
     
            if($edit->rowCount()>0){//s'ils y'a des lignes affectées
                 $req = $db->prepare('SELECT id, title, content FROM article WHERE id = ?');
                 $req->execute(array($id));
                 $post = $req->fetch();
                 return $post;
            }
         return false;//quand $post est indéfinie (donc aucune ligne n'a été affectée par la modification), on renvoi false
    }

  6. #6
    Membre Expert Avatar de darkstar123456
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2008
    Messages
    1 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mars 2008
    Messages : 1 895
    Par défaut
    Bonjour,

    Comme l'ont dit mathieu & -Rpass-, tu n'instancie pas ta valeur de $post d'après tout ce que tu as montré.

    La fonction suivante devrait être en réalité 2 fonctions différentes : une pour éditer (UPDATE), et une pour récupérer les infos à afficher dans le formulaire (SELECT)

    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    public function editArticle($title, $content, $id)
        {
            $db = $this->dbConnect();
            $edit = $db->prepare('UPDATE article SET title =?, content =? WHERE id =?');
            $edit->execute(array($title, $content, $id ));
     
            return $edit;
     
            $req = $db->prepare('SELECT id, title, content FROM article WHERE id = ?');
            $req->execute(array($id));
            $post = $req->fetch();
     
            return $post;
        }

    Ca devrait donc être :

    Code php : 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 editArticle($title, $content, $id)
        {
            $db = $this->dbConnect();
            $edit = $db->prepare('UPDATE article SET title =?, content =? WHERE id =?');
            $edit->execute(array($title, $content, $id ));
     
            return $edit;
        }
     
    public function getArticle($id)  
        {
            $req = $db->prepare('SELECT id, title, content FROM article WHERE id = ?');
            $req->execute(array($id));
            $post = $req->fetch();
     
            return $post;
        }

    Donc avant de pouvoir éditer ton article, il te faut le récupérer afin de pouvoir afficher les valeurs dans le formulaire ;-)

    Donc pour l'affichage du formulaire, on récupère les infos : $post = $taClass->getArticle($_GET['post_id']); par exemple

  7. #7
    Membre confirmé Avatar de Elztx
    Femme Profil pro
    Étudiant
    Inscrit en
    Mars 2019
    Messages
    72
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2019
    Messages : 72
    Par défaut
    Bonjour à tous

    Merci pour vos réponses !
    J'avais déjà une fonction GetPost qui me sert pour récupérer l'article dans la vue de ce dernier.
    Du coup je l'ai reprise, ce qui me donne :

    Côté Manager
    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
    public function getPost($postId)
        {
            $db = $this->dbConnect();
            $req = $db->prepare('SELECT id, title, content, DATE_FORMAT(date, \'%d/%m/%Y\') AS date FROM article WHERE id = ?');
            $req->execute(array($postId));
            $post = $req->fetch();
     
            return $post;
        }
     
        public function editArticle($title, $content, $id)
        {
            $db = $this->dbConnect();
            $edit = $db->prepare('UPDATE article SET title =?, content =? WHERE id =?');
            $edit->execute(array($title, $content, $id ));
     
            return $edit;
        }
    Côté contrôleur :
    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
    function editArticle($title, $content, $id)
    {
        $postManager = new PostManager();
     
        $post = $postManager->getPost($_GET['id']);
        $affectedLines = $postManager->editArticle($title, $content, $id);
     
        if ($affectedLines === false) {
            // Erreur gérée. Elle sera remontée jusqu'au bloc try du routeur !
            throw new Exception('Impossible d\'éditer le billet !');
        }    
        else {
            header('Location: /index.php?action=listPostsAdmin');
            exit;
        }
    }
    Et côté routeur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    elseif ($_GET['action'] == 'editArticle') {
                    if (!empty($_POST['title']) && !empty($_POST['content'])) {
                        $id = (!empty($_GET['id']))? intval($_GET['id']) : 0;
                        editArticle($_POST['title'], $_POST['content'], $id);
                    }
                    else {
                        // Autre exception
                        throw new Exception('Tous les champs ne sont pas remplis !');
                    }
            }
    Je suis sur la bonne voie ?

  8. #8
    Membre Expert Avatar de darkstar123456
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2008
    Messages
    1 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mars 2008
    Messages : 1 895
    Par défaut
    Bonjour,

    Désolé mais je vois pas mal d'erreurs.
    D'une part il faut comprendre les différentes actions possibles.

    1] Affichage du formulaire d'édition de l'article
    2] Soumission du formulaire d'édition de l'article

    Dans le 1], il suffit d'utiliser la méthode getPost($postId), dans le 2], on va utiliser la méthode editArticle($title, $content, $id)Je pense qu'il y a déjà un gros problème de compréhension à ce niveau-là.
    Théoriquement, l'affichage d'un formulaire et son édition peuvent se faire via la même URL.
    Or d'après ton code, si j'accède via l'URL à ?action=editArticle c'est que je soumet un formulaire (c'est écrit dans ton routeur même si ça ne devrait pas être écrit là). C'est peut-être vrai mais pas forcément.
    Perso, je n'ai jamais aimé ce système car c'est la multiplication des URLs.
    Mes URLs ressemblent souvent à ?action=edit&id=X et ce, peu importe que ça soit à l'affichage ou à la soumission du formulaire.
    Pour vérifier qu'un formulaire est soumis, le plus simple est de créer un input type hidden et de vérifier s'il est défini :
    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
    <input type="hidden" name="action" value="submit" />
    Ensuite on vérifie en PHP si le formulaire est soumis (tout ça est dans le contrôleur !) :
    Code php : 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
    $postManager = new PostManager();
     
    if(!empty($_GET['action'])) {
        switch($_GET['action']) {
            case 'editArticle':
                // Par défaut, on charge $post pour pouvoir afficher les valeurs dans notre formulaire
                $post = $postManager->getPost($_GET['id']);
                // Si le formulaire a été soumis, on va mettre à jour l'article
                // En réalité, il faudrait faire des vérifications pour s'assurer par exemple que le titre n'est pas vide
                if(!empty($_POST['action']) && $_POST['action'] === 'submit') {
                    $postManager->editArticle($_POST['title'], $_POST['content'], $_GET['id']);
                }
                // Ici, et grâce au fait qu'on charge $post par défaut, on pourrait imaginer qu'on repopulate $post avec les valeurs de $_POST
                // Ca permettrait par exemple de retourner un titre vide s'il l'était bel et bien à la soumission du formulaire
                break;
        }
    }


    Parmi les erreurs que je vois :

    Côté controlleur :
    $post = $postManager->getPost($_GET['id']); Pourquoi fais-tu un getPost() ? On s'en fou de $post, surtout que tu peux le voir toi-même, tu ne fais rien du tout de ta variable.

    Coté routeur :
    Bon déjà, je trouve qu'il y a une énorme erreur à cet endroit.
    Un routeur ça route, et un contrôleur ça contrôle.
    Alors pourquoi y a-t-il tant de code dans ton routeur ? Il n'est sensé qu'indiquer la route du contrôleur et de la méthode de ce dernier à exécuter.
    Tout devrait être dans ton contrôleur !

    De plus, on a jamais parlé d'une FONCTION editArticle() mais bien d'une METHODE (méthode = fonction propre à une classe) à chaque fois. Alors d'où sort-elle ici : editArticle($_POST['title'], $_POST['content'], $id);Ca c'est l'erreur fatale "Undefined function editArticle" à l'horizon !

  9. #9
    Membre très actif
    Homme Profil pro
    Déveleoppeur Web/Mobile
    Inscrit en
    Avril 2013
    Messages
    330
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Déveleoppeur Web/Mobile
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2013
    Messages : 330
    Par défaut
    Tu es sur la bonne voie, cependant attention :

    - Il serait judicieux de récupérer ton artcile
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $post = $postManager->getPost($_GET['id']);
    après l'édition, pour récupérer celui-ci avec les dernières modifications effectuées.

    - Dans ton routeur tu utilises header, ce qui aura pour effet de rediriger vers la nouvelle page, et donc tu n'auras plus accès aux variables récupérées dans ton contrôleur. Il faudra bien penser à les récupérer dans ta nouvelle page.
    Sinon tu as le require ou l'include , qui te permettent d'inclure le fichier php dans un autre, et ainsi conserver les fonctions, variables, etc.

  10. #10
    Membre confirmé Avatar de Elztx
    Femme Profil pro
    Étudiant
    Inscrit en
    Mars 2019
    Messages
    72
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2019
    Messages : 72
    Par défaut
    Bonjour,

    Merci à tous pour votre aide.
    J'ai donc corrigé mes multiples erreurs.

    Je reviendrai mettre mon code ici ce soir ou demain, au cas où certains aient le même souci un jour (je n'ai pas mon code avec moi et j'ai traité ça cette nuit, suis allée dormir après avoir crié victoire )

Discussions similaires

  1. [Joomla!] redirection après modification d'un article
    Par janclod dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 2
    Dernier message: 16/02/2009, 15h12
  2. [CKEditor] erreur de modification d'un article via FCKeditor
    Par wperle dans le forum Bibliothèques & Frameworks
    Réponses: 1
    Dernier message: 10/07/2008, 10h45
  3. Récupération / Modification d'un Appender
    Par in dans le forum Logging
    Réponses: 3
    Dernier message: 30/08/2007, 15h10
  4. Recherche classe pour ajout/modif/suppression d'articles dans une base de donnée
    Par will89 dans le forum Bibliothèques et frameworks
    Réponses: 1
    Dernier message: 02/02/2007, 11h59

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