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

Langage PHP Discussion :

Architecture MVC - Problème require [PHP 5.4]


Sujet :

Langage PHP

  1. #1
    Candidat au Club
    Homme Profil pro
    Dessinateur en charpente métallique
    Inscrit en
    Juin 2015
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Territoire de Belfort (Franche Comté)

    Informations professionnelles :
    Activité : Dessinateur en charpente métallique
    Secteur : Bâtiment

    Informations forums :
    Inscription : Juin 2015
    Messages : 3
    Points : 3
    Points
    3
    Par défaut Architecture MVC - Problème require
    Bonjour,

    Je suis débutant en PHP, suite au tutoriel PHP, j'ai commencé mon projet d'un site web dynamique. J'ai organisé mon site suivant l'architecture MVC. J'ai un contrôleur frontal qui permet de contrôler et charger les pages demander via la fonction $_GET placé dans l'URL avec le nom de la section à charger.(exemple : index.php?section=livreOr)

    Je suis en train de coder la page d'inscription. Pour tester mon code j'ai tout codé dans un seul fichier et cela fonctionne bien.
    Mon problème arrive au moment où je sépare le code en plusieurs fichiers pour suivre l'architecture MVC. Les informations viennent d'un formulaire du type POST.

    Voici le code complet:

    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
     
    <?php
     
    $bdd = new PDO('mysql:host=localhost;dbname=sonneur_du_lion;charset=utf8','root','',array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION));
     
    function Inscription($groupe,$pseudo,$pass,$email)
    {
        global $bdd;
            $inscription=$bdd->prepare('INSERT INTO membre(id_groupe,pseudo,pass, email, date_inscription) VALUE(:id_groupe,:pseudo,:pass, :email, CURDATE())');
            $inscription->execute(array(
                    'id_groupe'=>$groupe,
                    'pseudo'=>$pseudo,
                    'pass'=>$pass,
                    'email'=>$email,
                    ));
        return $inscription;
    }
     
            $groupe=5;
            $pseudo = htmlspecialchars($_POST['pseudo']);
            $pass = htmlspecialchars($_POST['pass']);
            $email = htmlspecialchars($_POST['email']);   
     
            $inscription=Inscription($groupe,$pseudo,$pass,$email);
     
        echo 'Inscription effectué';
    Dans le code ci-dessus je sépare les différents éléments de la manière suivante.La connexion à la base de données est effectué par le controleur frontal via une fonction getBdd() placé dans le fichier modele/connexionBdd.php qui retourne la variable $bdd.

    Contrôleur frontal :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    <?php
        include_once('modele/connexionBdd.php');
        $bdd = getBdd();
     
        if (!isset($_GET['section']) OR $_GET['section']=='index')
        {
            include_once('controleur/index.php');
        }
        else
        {
            require'controleur/'.$_GET['section'].'/index.php';
        }
    connexionBdd.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
    <?php
        try
        {
            function getBdd()
            {
                $bdd = new PDO('mysql:host=localhost;dbname=sonneur_du_lion;charset=utf8','root','',array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION));
                return $bdd;
            }
        }
        catch (Exception $e)
        {
            $msgErreur = $e->getMessage();
            require 'vue/Erreur.php';
        }
    Ensuite je met la fonction Inscription($groupe,$pseudo,$pass,$email) dans le fichier modele/inscription/index.php
    Voici le code une fois séparé:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    <?php
        require'modele/inscription/index.php';
     
            $groupe=5;
            $pseudo = htmlspecialchars($_POST['pseudo']);
            $pass = htmlspecialchars($_POST['pass']);
            $email = htmlspecialchars($_POST['email']);   
     
            $inscription=Inscription($groupe,$pseudo,$pass,$email);
     
            echo 'Inscription effectué';
    J'obtient l'erreur suivant :

    Warning: require(modele/inscription/index.php): failed to open stream: No such file or directory in D:\wamp\www\Les sonneurs du lion\controleur\inscription\traitement_2.php on line 5

    Fatal error: require(): Failed opening required 'modele/inscription/index.php' (include_path='.;C:\php\pear') in D:\wamp\www\Les sonneurs du lion\controleur\inscription\traitement_2.php on line 5
    Donc d'où vient le problème ?

    Merci d'avance pour vos réponse.

  2. #2
    Membre émérite

    Profil pro
    Inscrit en
    Mai 2008
    Messages
    1 576
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 1 576
    Points : 2 440
    Points
    2 440
    Par défaut
    1- ton problème: le message d'erreur est clair, le fichier que tu indiques n'existe pas. Ça veut dire que tu t'es trompé de chemin de fichier, en indiquant le chemin relatif 'modele/inscription/index.php'.

    Pour charger ton fichier, il faut utiliser
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    __DIR__ . '/../../modele/inscription/index.php
    2- Quelques conseils sur ton code:
    - Il faut toujours désactiver l'émulation des requêtes préparées par PDO, autrement ça peut ouvrir la porte à certaines vulnérabilités.

    Après la création de $bdd, il faut donc ajouter:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $bdd->setAttribute(PDO::ATTR_EMULATE_PREPARES);
    - htmlspecialchars est une fonction qui convertit certains caractères en entités HTML. Il n'a rien à faire dans le traitement de données avant l'insertion dans une base de données.

    Si tu veux échapper les données, les requêtes préparées de PDO le font déjà pour toi.

    Si tu veux filtrer et valider les données (et tu devrais le faire), utilise filter_var.

    htmlspecialchars (ou mieux, htmlentities) doivent être utilisées lorsqu'on affiche le texte (donc dans la vue), afin de se protéger des risques de XSS (cross-site scripting). Ex: si tu récupères un nom depuis la base de données et le stocke dans la variable $username, pour l'afficher dans ta vue, tu dois faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    echo htmlentities($username, ENT_QUOTES, UTF-8);
    - Mauvais, très mauvais.
    Puisque tu débutes, prends l'habitude de ne jamais utiliser des variables globales.

  3. #3
    Candidat au Club
    Homme Profil pro
    Dessinateur en charpente métallique
    Inscrit en
    Juin 2015
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Territoire de Belfort (Franche Comté)

    Informations professionnelles :
    Activité : Dessinateur en charpente métallique
    Secteur : Bâtiment

    Informations forums :
    Inscription : Juin 2015
    Messages : 3
    Points : 3
    Points
    3
    Par défaut
    Merci pour ton aide !

    1 - Si j'ai bien compris, le chemin relatif doit remonter de deux dossiers parents pour retrouver le dossier modele, car enfait le fichier vue/inscription renvoie une page et ne l'inclut pas. Par contre pourquoi le choix du Constantes magiques ?

    2 - En fait je code mon fichier étape par étape pour bien assimiler ce que je fait, donc la validation et vérification des données est prévue par la suite.

    Par contre pour la bdd, j'utilisais la fonction global pour évité de créer d'autre connexion. Il y a t-il une autre méthode pour la connexion de la base de donnée ?

  4. #4
    Membre émérite

    Profil pro
    Inscrit en
    Mai 2008
    Messages
    1 576
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 1 576
    Points : 2 440
    Points
    2 440
    Par défaut
    Par contre pourquoi le choix du Constantes magiques ?
    __DIR__ permet d'indiquer que le chemin doit être relatif au fichier dans lequel le code qui crée le chemin se trouve. C'est une bonne habitude à prendre afin d'être sûr que de ne pas se tromper même si le fichier est intégré dans de multiple. Imagine que tu as un fichier A.php, situé dans le chemin "/un/chemin/vers", et qui inclut un fichier B situé dans /un/chemin/
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    // /un/chemin/vers/A.php
    include '../B.php';
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    // /un/chemin/B.php
    echo "OK";
    Jusqu'ici, si tu exécutes A.php, tu auras pour résultat "OK".

    Maintenant, si j'inclus B.php dans un fichier C.php situé dans le répertoire /un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    include 'chemin/vers/A.php';
    Résultat si j'exécute /un/C.php, j'ai le même message d'erreur que toi: failed to open stream: No such file or directory etc... etc... parce que PHP exécute le chemin de B en fonction de l'emplacement de C. Il part donc de "/un", puis voit le chemin "../B.php" et en conclut que B.php se trouve à un niveu au-dessus de /un/C.php, ===> il cherche un fichier /B.php, et ne le trouve pas.

    En modifiant A.php comme ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    // /un/chemin/vers/A.php
    include __DIR__ . '../B.php';
    Tu dis à PHP de ne pas partir de "/un", mais plutôt de l'emplacement du dossier parent du fichier qui contient le chemin, c'est-à-dire /un/chemin/vers. Lorsque tu exécutes A.php, tu obtient le résultat attendu: "OK".

    Par contre pour la bdd, j'utilisais la fonction global pour évité de créer d'autre connexion. Il y a t-il une autre méthode pour la connexion de la base de donnée ?
    Passe la connexion à ta fonction, et non l'appeler à travers global. Plutôt que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    function Inscription($groupe,$pseudo,$pass,$email)
    fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    function Inscription($groupe,$pseudo,$pass,$email, $bdd)
    , que tu utilises ensuite comme ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    $bdd = new PDO // etc ....
     
    $inscription=Inscription($groupe,$pseudo,$pass,$email, $bdd)
    Passer une variable en paramètres plutôt qu'utiliser global a l'air d'être une petite modification, mais quand tu auras affaire à des programmes plus importants (beaucoup de fichiers, beaucoup de classes, beaucoup de lignes de code), ça t'évitera certains bugs difficiles à trouver.

  5. #5
    Candidat au Club
    Homme Profil pro
    Dessinateur en charpente métallique
    Inscrit en
    Juin 2015
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Territoire de Belfort (Franche Comté)

    Informations professionnelles :
    Activité : Dessinateur en charpente métallique
    Secteur : Bâtiment

    Informations forums :
    Inscription : Juin 2015
    Messages : 3
    Points : 3
    Points
    3
    Par défaut
    Merci pour ton aide et tes conseils. Mes fichier fonctione bien. Il me reste plus qu'à vérifier les données reçues et mettre en place une validation par email

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

Discussions similaires

  1. Problème dans l'éxecution suivant une architecture MVC
    Par king_soft dans le forum Développement Web en Java
    Réponses: 0
    Dernier message: 06/02/2012, 15h32
  2. Problème d'affichage de page JSP suivant l'architecture MVC
    Par king_soft dans le forum Servlets/JSP
    Réponses: 5
    Dernier message: 20/01/2012, 14h18
  3. [Spring MVC] Problème d'encoding
    Par aloha dans le forum Spring Web
    Réponses: 6
    Dernier message: 22/11/2010, 14h56
  4. architecture mvc etxml/xsl
    Par kiko2005 dans le forum XSL/XSLT/XPATH
    Réponses: 6
    Dernier message: 14/08/2009, 14h52
  5. Architecture MVC
    Par Bobleponge dans le forum Servlets/JSP
    Réponses: 7
    Dernier message: 20/06/2005, 10h16

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