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 :

Problème au niveau du chemin d'Include [PHP 5.0]


Sujet :

Langage PHP

  1. #1
    Membre à l'essai
    Inscrit en
    Novembre 2009
    Messages
    38
    Détails du profil
    Informations forums :
    Inscription : Novembre 2009
    Messages : 38
    Points : 22
    Points
    22
    Par défaut Problème au niveau du chemin d'Include
    Bonsoir chers membres !

    Je voudrais savoir comment régler ce problème:

    Situation :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Site Web
       |index.php
       |System/
       |admin/
            |admin_const.php
            | styles.php
            | index.php
            | actions/
                  |add.php
                  |edit.php
    -------

    Le code cité sous appartient à la page Add.php ( un formulaire de validation)

    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
    if (!isset($_SESSION['admin']))
    	{
    //------------------
             }
    else
     
            {
    if (!isset($_POST['go']))
    		{
    		include ("../system/config.php");
    		include ('./styles.php');
     
                     //Afficher formulaire récupéré depuis une page tpl (Smarty).
     
                    }
    else
     
                    {
     
    if (isset($_POST['reciter_name']) and isset($_POST['pic']))
    			 {
     
    				include("../../system/config.php");
                                    include("../../admin/styles.php");
    				include("../../admin/functions.php");
                                    add_reciter($_POST['reciter_name'],$_POST['pic']);
    				echo 'ok';
     
                               }
     
                     }
    Je trouve le probleme précisement dans le include de Styles.php
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    include("../../admin/styles.php");
    Ce fichier contient lui aussi un include dedans

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    include_once("./admin_const.php");
    define("STYLE_SELECTED_ADMIN","default");
    require('../system/libs/Smarty.class.php');

    donc, lorsque je fais appel à styles.php cela entraîne aussi l'appel de admin_const.php qui ne se trouve absolument pas au même chemin.

    Comment puis-je remédier ce problème .

    merci d'avance

  2. #2
    Membre expert Avatar de RunCodePhp
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    2 962
    Détails du profil
    Informations personnelles :
    Localisation : Réunion

    Informations forums :
    Inscription : Janvier 2010
    Messages : 2 962
    Points : 3 947
    Points
    3 947
    Par défaut
    Salut

    Une solution ici serait d'exploiter le set_include_path() (et get_include_path) afin de définir un chemin que je qualifierais de "chemin clé", ce qui permettra de mettre des chemins relatifs simple au niveau des include/require.
    La doc pour : set_include_path()


    Faut cependant indiquer un chemin physique, genre : home/user/ProjetsWeb/www/admin/
    Ou en local sur Crosoft du genre : C:/wamp/www/admin/

    Ensuite, pour inclure par exemple add.php dans index.php ce trouvant dans admin :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    include('actions/add.php');

    Pour la partie cliente, les Css, JS, etc ..., dans le même esprit une solution serait de rajouter un <base href="..." /> pour définir la base des chemins relatifs.
    Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    <!DOCTYPE ... etc ... >
    <html>
    <head>
        <title></title>
        <base href="http://www.domaine.com/admin/" />
        <link rel="stylesheet" type="text/css" href="styles.css" media="screen" />
    </head>
     
    <body>
        ... etc ...
        <img src="images/logo.jpg" />
    </body>
    </html>
    Tous les chemins relatifs se baseront selon le chemin (l'URL) indiquée dans le <base>.
    Le Css styles.css (l'URL) sera recherchée dans www/admin/styles.css.
    L'image logo.jpg sera recherchée dans www/admin/images/logo.jpg


    Une toute autre façon de procéder, c'est de créer (coté hébergeur) un sous domaine "admin", donc de dissocier la partie publique, (le site Web ouvert à tous) de la partie administration.
    Comme tout, entre autre l'index.php sera à la racine, les chemins devraient être plus simple à gérer.
    Faut voir si l'applicatif s'y prête, c'est pas dit.

  3. #3
    Membre à l'essai
    Inscrit en
    Novembre 2009
    Messages
    38
    Détails du profil
    Informations forums :
    Inscription : Novembre 2009
    Messages : 38
    Points : 22
    Points
    22
    Par défaut
    merci pour la réponse, c'est ce que je cherchais exactement !
    J'espere que son utilisation et comme ceci:

    Exemple de mon code

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    set_include_path('../../'. PATH_SEPARATOR .'../');
    include ('admin/admin_const.php');
    		include ('system/config.php');
    		include ('admin/styles.php');
    Ça marche impeccable mais, il y a petit souci ! cette fonction n'affecte pas Smarty.
    parce que j'ai des $smarty->display du genre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $smarty->display("./admin_styles/".STYLE_SELECTED_ADMIN."/error2.tpl");
    Ya t'il pas une fonction du genre set_include_path() pour Smarty?

  4. #4
    Membre à l'essai
    Inscrit en
    Novembre 2009
    Messages
    38
    Détails du profil
    Informations forums :
    Inscription : Novembre 2009
    Messages : 38
    Points : 22
    Points
    22
    Par défaut
    Citation Envoyé par Medyo4zy Voir le message
    Ya t'il pas une fonction du genre set_include_path() pour Smarty?
    Je viens de réparer le problème !
    j'ai créé une variable $base_path qui reprend le lien actuel du fichier style comme ceci :

    Fichier Styles.php
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $base_path = dirname(__FILE__);
    ....
    $smarty->template_dir=$base_path."/admin_styles";
    $smarty->compile_dir=$base_path."/admin_compil";
    Une autre petite question si c'est possible !

    Ce code: Signifie quoi exactement !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    set_include_path('../../'. PATH_SEPARATOR .'../../admin/'. PATH_SEPARATOR .'../');
    Est que lorsqu'on fait un include, la recherche s'effectue sur ../../ , s'il l'on trouve pas, sur ../../admin sinon....

  5. #5
    Membre expert Avatar de RunCodePhp
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    2 962
    Détails du profil
    Informations personnelles :
    Localisation : Réunion

    Informations forums :
    Inscription : Janvier 2010
    Messages : 2 962
    Points : 3 947
    Points
    3 947
    Par défaut
    Utilise des chemins physiques complets dans le set_include_path, comme dans les exemples précédant.
    Exploite ce que renvoie $base_path par exemple, ou alors quitte à le mettre "en dur".
    Dans certains cas (c'est le mien d'ailleurs), un chemin ne pourra pas être obtenu dynamiquement.
    Mais de ton coté, ça à l'air possible, faut donc en profiter.

    La plus simple cependant, c'est de commencer de mettre ce chemin "en dur" dans le set_include_path() pour d'abord savoir qu'est ce qu'il faut mettre, et comment réagit ton application, comment après exploiter les include.
    A savoir qu'il faudrait le faire au plus tôt possible, dans le index.php par exemple.

    Après tu sauras comment l'obtenir, soit par dirname(__FILE__), ou dirname(dirname(__FILE__)), ça dépend où ce situe le fichier.

    Mais il faudrait aussi reprendre les chemins définis à l'origine dans le include_path avec get_include_path(), sinon tu risque d'avoir des problèmes.
    Regarde au niveau de la doc.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    $path = '/home/user/repweb/www/';
    set_include_path(get_include_path() . PATH_SEPARATOR . $path);
    Fait d'abord comme ci-dessus, fait simple d'abord.
    Dis toi que tu as aussi tout le loisir de stocker ce même chemin complet dans une variable ou constante, etc ... pour l'exploiter dans des cas particuliers.

    A savoir qu'il y a aussi une constante (dans Php) DIRECTORY_SEPARATOR qui sur Windows renvoi \ et sur Linux /.
    Mais bon, Windows accepte les 2 si je ne dis pas de bêtises.



    Petite parenthèse au passage.
    Réfléchi bien sur la manière donc tu structure ton site, car théoriquement (je dis bien théoriquement), le répertoire "actions" et tout ce qui s'y trouve n'a pas vraiment besoin d'être dans le virtualHost.
    Ces fichiers (add.php, etc ...) ne devraient pas pouvoir être atteints via une URLs, donc le fait qu'ils soient dans le virtualHost, c'est déjà un manque de sécurité (même s'il y a un deny all).
    Théoriquement toujours, rajouter un répertoire genre "application" au même niveau que "systeme" serait tout aussi bien (voir mieux) pour mettre tout ce qui concerne l'application en-dehors d'un répertoire qui ce veut publique.

    On peu même pousser le bouchon à l'extrême, c'est à dire n'avoir que l'index.php dans le virtualHost, et tout le reste en-dehors.
    M'enfin, c'est quand même l'extrême, car conserver ne serait-ce que les images, les feuilles de style Css, Javascript par exemple dans le virtualHost est peut être préférable.
    Mais pour ce qui est des tous les fichiers Php (ou autres) inclus, ils sont justement inclus, on ne les atteins pas via une URLs, ce qui fait toute la différence.
    Vois tu ?
    Bon, j'ai bien dis que c'était une parenthèse.

  6. #6
    Membre à l'essai
    Inscrit en
    Novembre 2009
    Messages
    38
    Détails du profil
    Informations forums :
    Inscription : Novembre 2009
    Messages : 38
    Points : 22
    Points
    22
    Par défaut
    J'ai du mal à utiliser cette fonction !
    dois-je utiliser cette fonction dans actions.php parce que c'est lui qui gère toutes les inclusions des fichiers (add.php , edit.php ) présents dans le dossier actions/ , ou bien dans autre ?

    si j'ai bien compris, je declare la fonction comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    //easyphp
    $path = 'C:/Program Files/EasyPHP-5.3.2i/www/Site1/';
    set_include_path(get_include_path() . PATH_SEPARATOR . $path);
    //pour inclure
    include("admin/actions/add.php");
    lorsque je fais un echo de get_include_path(), ça renvoie
    .;C:\php5\pear;C:/Program Files/EasyPHP-5.3.2i/www/Site1/


    edit:ca sert à quoi ce get_include_path() et ce PATH_SEPARATOR ?

  7. #7
    Membre expert Avatar de RunCodePhp
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    2 962
    Détails du profil
    Informations personnelles :
    Localisation : Réunion

    Informations forums :
    Inscription : Janvier 2010
    Messages : 2 962
    Points : 3 947
    Points
    3 947
    Par défaut
    si j'ai bien compris, je declare la fonction comme ceci
    Théoriquement c'est ainsi, oui.
    Par contre, il serait à mon sens mieux de rajouter le répertoire "admin", car quelque part, la racine de cet espace administration démarre à partir de là.
    En tout cas, c'est le comportement que l'on recherche en procédant ainsi.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    //easyphp
    $path = 'C:/Program Files/EasyPHP-5.3.2i/www/Site1/admin/';
    set_include_path(get_include_path() . PATH_SEPARATOR . $path);
    //pour inclure
    include("actions/add.php");
    Par contre, redéfinir le include_path le plus tôt possible me semble de loin préférable, donc au début du index.php par exemple (pas au niveau du répertoire actions, c'est trop tard et trop spécifique à mon sens).

    Cependant, tu as un autre chemin qui ce trouve juste avant, le répertoire "System".
    Je ne sais pas ce qu'il y a dedans finalement, mais admettons qu'il y ait un répertoire "fonctions" voir même "classes" (pure hypothèse donc), et que de l'admin il faudrait pouvoir atteindre (inclure) ces fichier.
    Et bien rajouter ce chemin peu être utile.
    Ca donnerait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    //easyphp
    $path_system = 'C:/Program Files/EasyPHP-5.3.2i/www/Site1/System/';
    $path_admin = 'C:/Program Files/EasyPHP-5.3.2i/www/Site1/admin/';
     
    set_include_path(get_include_path() . PATH_SEPARATOR . $path_system . PATH_SEPARATOR . $path_admin);
     
    //pour inclure
    include('classes/UneClasse.php'); // De : C:/blablabala/www/Site1/System/
     
    include('actions/add.php'); // De : C:/blablabala/www/Site1/admin/
    lorsque je fais un echo de get_include_path(), ça renvoie
    .;C:\php5\pear;C:/Program Files/EasyPHP-5.3.2i/www/Site1/
    Le PATH_SEPARATOR est une constante faisant partie de Php, et sa valeur (un echo) renvoie ; (un point virgule).
    C'est le séparateur permettant de séparer les différents chemins qu'on définie au include_path (qui est une directive du php.ini).
    Dans cet exemple il y a 3 chemins de définis :
    1/ . (un point), qui signifie que Php tentera de trouver le fichier au niveau où est exécuté le code.
    S'il est exécuté dans le index.php par exemple, ça sera à ce niveau là.
    2/ C:\php5\pear Cette fois Php tentera de le rechercher selon ce chemin complet qui est donc C:\php5\pear.
    Si ce chemin n'existe pas, alors je te conseillerais de modifier ton php.ini et le supprimer (ou mettre celui ci en commentaire, et juste conserver le précédant, le . (le point).

    Donc le get_include_path() sert à récupérer ce qu'il y a de défini dans le php.ini, soit ceci : .;C:\php5\pear

    /!\ Attention, il faut bien comprendre que Php tentera de rechercher un fichier selon les différents chemins qu'on aura défini dans le include_path (y compris à l'aide d'un set_include_path) dans l'ordre, c'est à dire ici en 1er le ., puis ensuite dans C:/php5/pear, etc, etc ...

    Il faudra aussi faire attention au noms des fichiers, il peu avoir des conflits.
    D'ailleurs, il faut éviter le plus possible de définir trop de chemins clés dans le include_path à cause de ça.
    En mettre 2 ou 3 c'est déjà pas mal, au-delà ???

    Si par exemple on tente d'inclure un fichier genre toto.php avec un include('toto.php') au niveau de l'index.php, si un fichier toto.php existe à ce même niveau c'est celui-ci qui sera inclus.
    Si un toto.php existe aussi dans "C:/php5/pear" par exemple, et qu'on tente de l'inclure toujours de la même manière, ce ne sera pas celui ci, mais toujours celui qui se trouve au même niveau que l'index.php.
    On peu considérer ça comme un conflit, un bug qu'on aura soit même provoqué.
    Je ne sais pas si tu vois le truc.


    En tout cas, et je ne sais pas si tu connais, mais ce mécanisme est assez proche de ce qu'on retrouve dans Windows au niveau des variables d'environnement que l'on peu voir et définir dans le :
    "poste de travail" -> "propriété" -> "avancé" -> "Variables d'environnement".


    J'espère qu'avec ces explications tu comprendra mieux comment tout ceci fonctionne.
    En tout cas, fait des essai simples, quitte à créer un pseudo site Web dans EasyPhp.

  8. #8
    Membre à l'essai
    Inscrit en
    Novembre 2009
    Messages
    38
    Détails du profil
    Informations forums :
    Inscription : Novembre 2009
    Messages : 38
    Points : 22
    Points
    22
    Par défaut
    merci infiniment RunCodePhp pour ton aide !
    ton explication est claire.

    j'ai une petite remarque à ajouter.

    Ces fichiers (add.php, etc ...) ne devraient pas pouvoir être atteints via une URLs, donc le fait qu'ils soient dans le virtualHost, c'est déjà un manque de sécurité (même s'il y a un deny all).
    sans un DenyAll, Je peux exploiter ton code pour faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    define('SITEPATH','C:/Program Files/EasyPHP-5.3.2i/www/Site1/admin/');
    set_include_path(get_include_path() . PATH_SEPARATOR . SITEPATH);
    et lorsque je ferais un include, j'essayerais de rajouter ce code pour vérifier si un curieux essaye d’accéder directement à ma page.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    if (!defined('SITEPATH')) exit("Vous n'êtes pas autorisé"); 
    //...mon code
    Je pense que c'est possible ?

  9. #9
    Membre expert Avatar de RunCodePhp
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    2 962
    Détails du profil
    Informations personnelles :
    Localisation : Réunion

    Informations forums :
    Inscription : Janvier 2010
    Messages : 2 962
    Points : 3 947
    Points
    3 947
    Par défaut
    Je pense que c'est possible ?
    Oui, je pense que ça peut être un bon anti-hack, j'ai déjà vu ça dans un FameWork d'ailleurs (je ne sais plus lequel par contre).
    Rajouté à ça un deny all devrait être assez rassurant, j'en conviens.

    Mais je t'assure que placer ces fichier Php en-dehors du Host c'est par définition plus sécurisé, de plus il y a vraiment aucune difficulté supplémentaire, faut juste le percevoir que ce n'est qu'une histoire de chemin, car de toute manière ce sera un include() au bout.

    Si tu défini tes 2 ou 3 chemins clés, ça devient un jeu d'enfant de les déplacer ailleurs.

    Mais bon, tu fais comme tu le sens, la dessus on est d'accord.

  10. #10
    Membre à l'essai
    Inscrit en
    Novembre 2009
    Messages
    38
    Détails du profil
    Informations forums :
    Inscription : Novembre 2009
    Messages : 38
    Points : 22
    Points
    22
    Par défaut
    Conseil, reçu Chef ! Merci encore pour ton aide !

    Sujet Résolu

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

Discussions similaires

  1. Problème chemin avec include
    Par Zanarkand dans le forum Langage
    Réponses: 11
    Dernier message: 04/10/2012, 09h17
  2. Problème au niveau du chemin de fichier
    Par kobe24 dans le forum C#
    Réponses: 2
    Dernier message: 15/07/2009, 13h49
  3. [Eclipse CDT]problème au niveau des include
    Par snoop dans le forum Eclipse C & C++
    Réponses: 6
    Dernier message: 05/04/2009, 14h57
  4. [JTree] Problème d'ouverture de chemin dans un JTree
    Par antares24 dans le forum Composants
    Réponses: 2
    Dernier message: 11/03/2005, 08h18
  5. [DNS MX]Avec DynDNS.org, problème au niveau du MX
    Par Swoög dans le forum Développement
    Réponses: 9
    Dernier message: 24/08/2004, 22h00

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