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 :

Associer un formulaire à une entrée en BDD [PDO]


Sujet :

PHP & Base de données

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Chomeur
    Inscrit en
    Octobre 2019
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 24
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Chomeur

    Informations forums :
    Inscription : Octobre 2019
    Messages : 19
    Par défaut Associer un formulaire à une entrée en BDD
    Bonsoir à tous,

    Dans le cadre de la création d'un système de CRUD, j'ai crée un formulaire (très basique) permettant théoriquement d'ajouter un nouveau post. Il est important de préciser que je dois respecter une architecture MVC et coder en POO. Dans une view on trouve donc le formulaire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    <p>Vous souhaitez créer un nouvel article ? </p>
     
    <?php require('../../model/PostManager.php'); ?>
     
     
     
    <form method="post" action="../../index.php?nom=baki">
        <input type="text" name="title" id="title" placeholder="Titre"> <br />
        <textarea></textarea> <br />
        <input type="date" name="date" id="date"> <br />
        <input type="text" name="author" id="author"> <br />
        <button type="submit">Créer</button>
     
    </form>
    Dans ma classe PostManager, j'ai crée une méthode createPost(), qui si je n'ai pas fait d'erreur permet une insertion en BDD :
    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 createPost($title, $content, $author)
        {
            $dbh = $this->dbh;
     
            $query = 'INSERT INTO posts(title, content, author, creation_date) VALUES(:title, :content, :author, NOW())';
     
            $req = $dbh->prepare($query);
            //bindParam() binds a parameter to the specified variable name
            $req->bindParam('title', $title);
            $req->bindParam('content', $content);
            $req->bindParam('author', $author);
            $req->execute();
     
        }
    Ma question : Comment associer le formulaire à la méthode ? Les différent tutoriaux que j'ai consulté à ce sujet utilisait un fichier externe insert.php, ce qui ne m'intéresse donc pas.
    Peut être que l'appel de la méthode se fait au moment du button submit ? ou peut être créer une condition (if) faisant en sorte que si on clique sur le bouton, on appel la méthode ?

  2. #2
    Expert confirmé
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Billets dans le blog
    12
    Par défaut
    salut,

    le seul moyen en MVC que tu aies à ta disposition pour associer une vue (formulaire) à une action (fonction) c'est le routage.

    Tiens va voir sur mon blog, la problématique y est abordée

  3. #3
    Membre averti
    Homme Profil pro
    Chomeur
    Inscrit en
    Octobre 2019
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 24
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Chomeur

    Informations forums :
    Inscription : Octobre 2019
    Messages : 19
    Par défaut
    Bonsoir,

    Tout d'abord merci pour ton billet. J'ai eu beau cherché un peu partout sur le web, jamais je n'avais vu une explication aussi propre et clair sur la structure MVC (qui est un peu déroutante quand on commence à l'aborder, il faut bien l'admettre). J'avais commencé justement un prototype de router, qui pour le moment ressemble à ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    class Router
    {
     
        private $ctrl;
     
        public function routeReq()
        {
            var_dump($_GET);
            var_dump($_POST);
            require_once('controller/ControllerHome.php');
     
        }
    }
    Si j'ai bien compris la logique de ton billet, j'ai remplacé l'url de mon action comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    <form method="post" action="../../index.php?page=create_post">
        <input type="text" name="title" id="title" placeholder="Titre"> <br />
        <textarea></textarea> <br />
        <input type="date" name="date" id="date"> <br />
        <input type="text" name="author" id="author"> <br />
        <button type="submit">Créer</button>
     
    </form>
    et donc dans le routeur, je devrais mettre un truc comme "si page est égale à create_post, alors appelle la méthode createPost de PostManager" mais comment ça se présente ? Je n'arrive pas à bien visualiser

    EDIT : Après m'être un peu renseigné, j'ai vu qu'un routeur OO ressemblait à peu près à ça :
    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
    class Routeur
    {
        private $url;   
        private $routes = [
                "index"         => ["controller" => 'Home',             "method" => 'showHome',         "area" => ''],
                "home"          => ["controller" => 'Home',             "method" => 'showHome',         "area" => ''],
                "posts"         => ["controller" => 'Home',             "method" => 'showPosts',        "area" => ''],
                "post"          => ["controller" => 'Home',             "method" => 'showPost',         "area" => ''],
                "loginForm"     => ["controller" => 'Home',             "method" => 'showLogin',        "area" => ''],
                "registerForm"  => ["controller" => 'Home',             "method" => 'showRegistration', "area" => ''],
                "new"           => ["controller" => 'Home',             "method" => 'showEditForm',     "area" => ''],
                "connect"       => ["controller" => 'Home',             "method" => 'showConnect',      "area" => ''],
                "403"           => ["controller" => 'Home',             "method" => 'show403',          "area" => ''],
                "404"           => ["controller" => 'Home',             "method" => 'show404',          "area" => ''],
                "register"      => ["controller" => 'AuthController',   "method" => 'isValid',          "area" => ''],
                "connexion.php" => ["controller" => 'AuthController',   "method" => 'signin',           "area" => ''],
                "logout"        => ["controller" => 'AuthController',   "method" => 'signout',          "area" => ''],
                "comment"       => ["controller" => 'CommentController',"method" => 'createComment',    "area" => ''],
                "deleteCom"     => ["controller" => 'CommentController',"method" => 'deleteComment',    "area" => ''],
                "editCom"       => ["controller" => 'CommentController',"method" => 'editComment',      "area" => ''],
                "updateCom"     => ["controller" => 'CommentController',"method" => 'updateCom',        "area" => ''],
                "report"        => ["controller" => 'CommentController',"method" => 'reportCom',        "area" => ''],
                "create"        => ["controller" => 'PostController',   "method" => 'createArticle',    "area" => 'admin'],
                "edit"          => ["controller" => 'PostController',   "method" => 'editArticle',      "area" => 'admin'],
                "update"        => ["controller" => 'PostController',   "method" => 'updateArticle',    "area" => 'admin'],
                "delete"        => ["controller" => 'PostController',   "method" => 'deleteArticle',    "area" => 'admin']
        ];
    Mais je ne comprends pas toujours très bien comment ce système fonctionne

  4. #4
    Expert confirmé
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Billets dans le blog
    12
    Par défaut
    salut,

    oui tu as bien compris la logique.
    j'ai une préférence pour un contrôleur par action au lieu d'un contrôleur qui englobe 10 ou 15 méthodes et qui va finir par devenir obèse.
    L'autre raison c'est la facilité d'évolution du code : quand tu dois rajouter une action, tu n'as rien à modifier, juste à créer les fichiers nécessaires et hop ça tourne tout seul.

    Dans mon cas pratique (MVC 2ème partie), j'ai un contrôleur abstrait :
    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
    <?php
     
    declare(strict_types=1);
     
    namespace rawsrc;
     
    /**
     * TUTORIAL DVP SUR LE CONCEPT MVC : MODÈLE-VUE-CONTRÔLEUR
     * @link https://www.developpez.net/forums/blogs/32058-rawsrc/b7786/developpement-selon-l-approche-mvc-modele-vue-controleur-retour-theorie/
     *
     * Représentation abstraite d'un contrôleur générique
     * Classe dérivable uniquement mais non instanciable
     */
    abstract
    class Controller
    {
        /**
         * Fonction qui doit être redéfinie dans toutes les classes dérivées et qui
         * doit apporter une réponse à la tâche en cours de traitement ($task)
         */
        abstract public function invoke();
     
        /**
         * @var Task
         */
        private $task;
     
        /**
         * @param Task $p
         */
        public function setTask(Task $p)
        {
            $this->task = $p;
        }
     
        /**
         * @return Task
         */
        public function task(): Task
        {
            return $this->task;
        }
     
        /**
         * @param Response $p
         */
        public function setResponse(Response $p)
        {
            $this->task->setResponse($p);
        }
    }
    et regarde ce que font ces 4 lignes de code dans index.php :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    use rawsrc\Task;
     
    $task = new Task();
    $task->dispatch();
    $task->response()->send();
    plonge toi dans le code Task.php => dispatch() pour bien voir la liaison entre le contrôleur abstrait, le contrôleur réel et comment tout ça est utilisé.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    /** @var Controller */
    $controller = new $controller();
    $controller->setTask($this);
    $controller->invoke();

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

Discussions similaires

  1. Réponses: 5
    Dernier message: 11/03/2007, 10h19
  2. [MySQL] Suppression d'une entrée dans ma BDD
    Par Luverger dans le forum PHP & Base de données
    Réponses: 35
    Dernier message: 19/02/2007, 13h39
  3. [MySQL] problème formulaire ajouter entrées dans bdd
    Par _alex_ dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 10/12/2006, 20h08
  4. [Conception] rechercher une entrée dans une BDD
    Par papadam dans le forum PHP & Base de données
    Réponses: 8
    Dernier message: 10/10/2006, 17h16
  5. [Dates] conversion d'une entrée de formulaire en date
    Par cfloriot dans le forum Langage
    Réponses: 5
    Dernier message: 10/02/2006, 09h57

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