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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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 670
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 670
    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 513
    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 513
    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

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