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 :

Tenter de faire en MVC PHP [MySQL]


Sujet :

PHP & Base de données

  1. #1
    Membre éclairé Avatar de dancom5
    Homme Profil pro
    Inscrit en
    Janvier 2010
    Messages
    808
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56

    Informations forums :
    Inscription : Janvier 2010
    Messages : 808
    Par défaut Tenter de faire en MVC PHP
    Bonjour. Un certain moment donnée, un membre d'ici me parlais de séparer
    mon code html du code php et je ne comprenais pas vraiment bien. Mais,
    depuis j'ai entendu parlé du MVC (Model, View et Contrôleur). Et voici, ce que
    j'ai tenté de faire. Un listing MVC en PDO et possiblement orienté objet (POO).

    DBH.PHP (connexion base de données):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    <?php
        $dbh = new PDO("mysql:host=localhost;dbname=latable", 'root', 'pass');
        $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        $dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
        $dbh->exec("SET CHARACTER SET utf8");
     
    // http://notes.mazenod.fr/tp-architecture-mvc.html (ce lien qui explique le MVC)
    ?>
    MODEL.PHP (les requêtes sql):
    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
     
    <?php
    function getListing()
    {
            require('dbh.php');
     
            $results = $dbh->prepare(' SELECT ladate,taux1,taux2,repas,details,comm FROM list ');
            $results->execute();
     
            $listing = array();
            while ($row = $results->fetch())
            {
               $listing[] = $row;
            }
            $results->closeCursor();
     
            return $listing;
    }
    ?>
    VIEW.PHP (la vue, l'aspect qui touche homme/machine):
    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
     
    <html>
      <head>
        <title></title>
     
      <style>
            table {width:900px}
            th {width:16%}
            td {text-align:center}
      </style>  
     
      </head>
      <body>
        <h1>Listing</h1>
        <table>
          <tr><th>Date</th><th>Taux1</th><th>Taux2</th><th>Repas</th><th>Détails</th><th>Comm</th></tr>
        <?php foreach ($listing as $laliste): ?>
          <tr>
            <td><?php echo $laliste['ladate'] ?></td>
            <td><?php echo $laliste['taux1'] ?></td>
            <td><?php echo $laliste['taux2'] ?></td>
            <td><?php echo $laliste['repas'] ?></td>
            <td><?php echo $laliste['details'] ?></td>
            <td><?php echo $laliste['comm'] ?></td>
          </tr>
        <?php endforeach; ?>
        </table>
      </body>
    </html>
    Voilà, je me demandais si j'étais dans la bonne direction pour
    une structure MVC et Orienté Objet. Quoique PDO est orienté objet.

    Aussi, si y a des choses que je devrais améliorer et pourquoi.

    Là, c'est juste une liste simple. Il va me rester à déterminer la manière
    de faire faire mes fichiers MVC si j'ai plus d'une requête et affichage a
    faire et à contrôler.

    C'est apprécié.

  2. #2
    Membre très actif Avatar de Shuty
    Homme Profil pro
    Ingénieur en développement
    Inscrit en
    Octobre 2012
    Messages
    630
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur en développement
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Octobre 2012
    Messages : 630
    Par défaut
    Tu me semble être sur la bonne voix.

    Un petit truc me chagrine...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <style>
            table {width:900px}
            th {width:16%}
            td {text-align:center}
      </style>
    Tu devrais faire un fichier style.css ou se trouverait toute ta base CSS sans custom.

    Autrement, il existe des frameworks MVC/Moteur de template (smarty/twig). Perso, pour des petits projets je n'utilise pas de modèle MVC, ça fait trop usine à gaz que pour 40 pages... Je part du principe que si tu programmes en full POO, c'est à dire que tu as un dossier class/, alors ton code est déjà très épuré pour un simple projet.

    En espérant t'avoir aidé !

  3. #3
    Membre éclairé Avatar de dancom5
    Homme Profil pro
    Inscrit en
    Janvier 2010
    Messages
    808
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56

    Informations forums :
    Inscription : Janvier 2010
    Messages : 808
    Par défaut
    Merci Shuty, pour vos commentaires.

    J'ai revu mon code et je l'ai amélioré. Sauf que lorsque j'ai voulu modifier l'affichage d'une donnée sans toucher au contenu de la base
    j'ai été bloqué. Je ne savais plus si je devais placer mon ajout dans le controleur ou bien dans le model.

    Pour commencer les améliorations du précédent:

    Mon MVC:
    Le model: model.php
    La vue: layout.php, t-listing.php, style.css
    Le controleur: controlers.php, index.php,

    MODEL.PHP:
    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
     
    <?php
     
    function getListing()
    {
            require('dbh.php');
            $results = $dbh->prepare(' SELECT ladate,taux1,taux2,repas,details,comm FROM list ORDER BY ladate ASC ');
            $results->execute();
            $listing = array();
            while ($row = $results->fetch())
            {
            $listing[] = $row;
            }
            $results->closeCursor();
            return $listing;
    }
     
    ?>
    LAYOUT.PHP: la coquille qui se répèterait en html en lien avec de contenu de v-listing.php
    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
     
    <!DOCTYPE html>
    <html>
      <head>
        <title><?php echo $title ?></title>
            <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
            <meta name="created" content="Thu, 04 Apr 2013 20: 51: 32 GMT">
     
            <link href="/projet/style.css" rel="stylesheet" type="text/css"> 
     
      </head>
      <body>
        <?php echo $content ?>
      </body>
    </html>
    T-LISTING.PHP: c'est la vue, mon affichage html.
    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
     
    <?php $title = "Liste des résultats" ?>
    <?php ob_start(); ?>
     
    <h1>Listing</h1>
    <table>
      <tr><th>Date</th><th>Taux1</th><th>Taux2</th><th>Repas</th><th>Détails</th><th>Comm</th></tr>
    <?php foreach ($listing as $laliste): ?>
      <tr>
        <td><?php echo $laliste['ladate'] ?></td>
        <td><?php echo $laliste['taux1'] ?></td>
        <td><?php echo $laliste['taux2'] ?></td>
        <td><?php echo $laliste['repas'] ?></td>
        <td class='c1'><?php echo $laliste['details'] ?></td>
        <td class='c2'><?php echo $laliste['comm'] ?></td>
      </tr>
    <?php endforeach; ?>
    </table>
     
    <?php $content = ob_get_clean(); ?>
     
    <?php include('layout.php'); ?>
    STYLE.CSS: le style pour le desing des templates v-listing.php et pour d'autres affichages éventuel.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    th { width:100px; border:1px solid black; }
    td { text-align:center; border:1px solid gray; background-color:#552; color:white; font-weight:900; }
    td.c1 { width:500px; font:10px Verdana; text-align:left; padding-left:10px; font-weight:600; vertical-align:top; }
    td.c2 { width:900px; font:10px Verdana; text-align:left; padding-left:10px; font-weight:600; vertical-align:top; }
    CONTROLERS.PHP:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    <?php
    function listing_action() 
    {
      $listing = getListing();
      require('t-listing.php');
    }
    ?>
    DBH.PHP: connexion à la base
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    <?php
     
        $dbh = new PDO("mysql:host=localhost;dbname=projet", 'root', 'pass');
        $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        $dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
        $dbh->exec("SET CHARACTER SET utf8");
     
    // http://notes.mazenod.fr/tp-architecture-mvc.html
     
    ?>
    INDEX.PHP: le contrôleur principal
    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
     
    <?php
    require_once 'model.php';
    require_once 'controlers.php';
     
    $uri = $_SERVER['REQUEST_URI'];
     
    switch ($uri) 
    {
        case '/projet/':
        case '/projet/index.php':
          listing_action();
          break;
     
        default:
                header('Status: 404 Not Found');
                echo '<html><body><h1>404 Not Found</h1></body></html>';
    }    
    ?>
    Bon. Pour commencer, pour faire un simple affichage d'une liste, ça fait uzine mais je dois prévoir qu'il va y avoir bien d'autres modules au projet.
    Et ceci me permet de m'initier au MVC et aussi à venir au POO.

    1- Mon index.php tel qu'il est construit, ça me donne des URL comme ceci: ...index.php/contact, ...index.php/produit, etc sauf pour index.php lui-même.
    Il faudrait que je fasse une réécriture de url dans .htaccess, je ne sais pas comment je vais le faire. A moins de faire mon index.php d'une autre manière.

    Ce index.php, je chicotte un peu dans la manière que ça donne mes URL.

    2- Lorsque je n'entre pas de données dans un champ, ça place des "0" en Mysql. Si je veux supprimer les "0" en utilisant du PHP, je pourrais
    faire str_replace, mais je ne sais pas si je dois le faire dans le controlers.php ou dans le model. Mais, je veux pouvoir utiliser mon model.php ailleurs.
    Avec ce que j'ai dans controlers.php, je ne sais pas comment je devrais le faire. Si je veux garder mes "0" dans la base bien sur.

    3- Dans le cas, que je souhaiterais remplacer dans la base les "0", en Mysql, je fais comment?

    4- J'ai pas de Class Objet, mais, je me demande si ici, dans mon code, s'il devait y avoir des classes (là, je commence à peine à m'initier).

    Je me suis basé sur ce site pour débuter complètement en MVC: http://notes.mazenod.fr/tp-architecture-mvc.html

  4. #4
    Membre éclairé Avatar de dancom5
    Homme Profil pro
    Inscrit en
    Janvier 2010
    Messages
    808
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56

    Informations forums :
    Inscription : Janvier 2010
    Messages : 808
    Par défaut
    Bonjour. Ici, j'ai tenter de faire un système d'affichage en utilisant l'architecture MVCsans toutefois utiliser la Programmation Orientée Objet pour l'instant.

    Voilà, mon problème, c'est que malgré la formation que je me donne pour la POO et le MVC, je ne sais pas comment réaliser un équivalent en POO.

    Et lorsque je veux ajouter un élément comme ajouter une vérification ou bien placer un filtre pour la sécurité, je ne sais pas où le mettre.

    Avant, en procédural, c'était facile puisqu'on pouvais tout mettre à la même place. Je n'arrête pas de faire des lectures, et je garde tous les liens auxquels je me réfère.

    J'aurais besoin d'un exemple pour me guider quitte à ne mettre qu'une partie si vous croyez que je fais du copie coller. Mais, je vous assure que ce n'est pas le cas.

    Je veux essentiellement utiliser la POO, PDO et le MVC. Je fais le code le plus simple possible pour m'initier.

    Je bloque, et je suis figé dans des lectures. Merci tout de même pour l'aide que j'ai reçu jusqu'à date depuis mes débuts ici.

  5. #5
    Membre éclairé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2013
    Messages
    45
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Janvier 2013
    Messages : 45
    Par défaut
    Bonjour,

    Citation Envoyé par dancom5 Voir le message
    1- Mon index.php tel qu'il est construit, ça me donne des URL comme ceci: ...index.php/contact, ...index.php/produit, etc sauf pour index.php lui-même.
    Il faudrait que je fasse une réécriture de url dans .htaccess, je ne sais pas comment je vais le faire. A moins de faire mon index.php d'une autre manière.
    Si tu souhaites aller au bout des choses, oui la réécriture d'url, en plus d'être intéressante et utile, est très appréciable dans un projet MVC. L'index, c'est bien souvent la racine qui te permet d'initialiser ton moteur.

    Citation Envoyé par dancom5 Voir le message
    2- Lorsque je n'entre pas de données dans un champ, ça place des "0" en Mysql. Si je veux supprimer les "0" en utilisant du PHP, je pourrais
    faire str_replace, mais je ne sais pas si je dois le faire dans le controlers.php ou dans le model. Mais, je veux pouvoir utiliser mon model.php ailleurs.
    Avec ce que j'ai dans controlers.php, je ne sais pas comment je devrais le faire. Si je veux garder mes "0" dans la base bien sur.
    Perso j'utilise des services, appelés avant les modèles, et injectés (ou pas, pour les static) dans ces derniers. Vérification des données, upload, db, image etc... Mes modèles eux, ne servent uniquement qu'aux données et à leur traitement. Car tu auras beau utiliser des classes de vérification de données, tu auras toujours du cas par cas à traiter de ci de là. Là aussi, je laisse le soin aux modèles de s'en charger.
    Après les avis divergent sur ce point et tu pourras approfondir cela à travers les nombreux topics qui traitent déjà du sujet.

    Citation Envoyé par dancom5 Voir le message
    3- Dans le cas, que je souhaiterais remplacer dans la base les "0", en Mysql, je fais comment?
    UPDATE !

    Citation Envoyé par dancom5 Voir le message
    4- J'ai pas de Class Objet, mais, je me demande si ici, dans mon code, s'il devait y avoir des classes (là, je commence à peine à m'initier).
    Peut-être vaudrait t'il mieux commencer petit à petit, par la compréhension de la POO puis l'application de celle-ci dans un projet orienté MVC ?

    Sinon, il y a ce tutoriel pour débuter, un peu vieillot mais sympathique.

  6. #6
    Membre Expert Avatar de callo
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Février 2004
    Messages
    887
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Togo

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Service public

    Informations forums :
    Inscription : Février 2004
    Messages : 887
    Par défaut
    S'il n' y pas de contraintes particulières, pourquoi ne pas utiliser un framework MVC comme ZendFramework ou Symfony? ça faciliterait beaucoup plus ta tâche à mon avis.

  7. #7
    Membre éclairé Avatar de dancom5
    Homme Profil pro
    Inscrit en
    Janvier 2010
    Messages
    808
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56

    Informations forums :
    Inscription : Janvier 2010
    Messages : 808
    Par défaut
    Merci no-war pour vos explications et callo pour la suggestion.

    Je veux essentiellement, à partir de mon code convertir en POO. J'ai beaucoup de liens de tutoriel qui inclus celui proposé dans le message par no-war. Je veux éviter d'utiliser un frameword, c'est en PHP que je veux faire cela.

    j'utilise des services, appelés avant les modèles, et injectés (ou pas, pour les static) dans ces derniers.
    Un exemple? cela m'aiderait.

    réécriture d'url
    ici aussi, ça m'aiderait.

    commencer petit à petit, par la compréhension de la POO
    c'est ce que je fais depuis des semaines.

  8. #8
    Membre éclairé Avatar de dancom5
    Homme Profil pro
    Inscrit en
    Janvier 2010
    Messages
    808
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56

    Informations forums :
    Inscription : Janvier 2010
    Messages : 808
    Par défaut
    Je laisse tomber.

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

Discussions similaires

  1. MVC / PHP / Jquery Comment fairE ?
    Par Anycee14 dans le forum MVC
    Réponses: 0
    Dernier message: 21/09/2010, 10h02
  2. [PHP-JS] Comment faire intéragir du php avec du javascript
    Par Alexlesilex dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 24/04/2007, 20h42
  3. [EasyPHP] Faire tourner du php sur un cd
    Par mic79 dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 2
    Dernier message: 27/10/2006, 19h22
  4. Réponses: 5
    Dernier message: 22/03/2006, 10h39
  5. [Oracle] Stocker ma requête dans un fichier poyr y faire appel en PHP
    Par alex007 dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 13/03/2006, 10h11

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