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 :

Fonction include par url [PHP 5.6]


Sujet :

Langage PHP

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Mars 2013
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2013
    Messages : 8
    Points : 4
    Points
    4
    Par défaut Fonction include par url
    Bonjour, j'ai une question à propos de la fonction include (ou require ou include_once, ou require_once) de php:

    J'ai un fichier script.php qui contient diverses fonctions:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    <?php
    function f1(){
       return 1;
    }
    function f2(){
       return 2;
    }
    ?>
    Depuis un fichier test.php, j'inclus script.php:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    <?php include('../include/script.php');//notez que script.php est un autre dossier?>
    <html>
    <head></head>
    <body>Test<?php echo f1();?>
    </body>
    </html>
    Tout cela fonctionne très bien.

    Je voudrai maintenant pouvoir inclure mon script.php mais depuis son url,
    j'ai donc créé et redirigé mon nom de domaine comme il faut et script.php est accessible: http://include.nomdedomaine.com/script.php
    j'ai ensuite activé les paramètres allow_url_include et allow_url_fopen sur mon serveur (version php 5.6), en étant contient des problèmes de sécurité que cela pourrait engendrer.

    Mais lorsque je modifie mon fichier test.php:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    <?php include('http://include.nomdedomaine.com/script.php');?>
    <html>
    <head></head>
    <body>Test<?php echo f1();?>
    </body>
    </html>
    j'ai le message d'erreur: Fatal error: call to undefined function f1()

    J'ai effectué quelques tests:
    en modifiant script.php ainsi:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    <?php
    echo 'script';
    function f1(){
       return 1;
    }
    function f2(){
       return 2;
    }
    ?>
    j'ai bien le mot script qui apparaît, mais ensuite, toujours le message d'erreur: Fatal error: call to undefined function f1()

    J'ai essayé de remplacer mon include() par file_get_contents() et j'ai le même comportement

    Le script.php serait exécuté et pas inséré ?

    J'avoue ne pas comprendre. Auriez-vous une idée ?
    Merci.

  2. #2
    Expert confirmé
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 470
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 470
    Points : 5 831
    Points
    5 831
    Billets dans le blog
    1
    Par défaut
    Pas de solution (sorry) mais par curiosité, pourquoi ce besoin ? Le fichier à inclure n'est pas sur le même serveur que le fichier qui le reçoit ?

  3. #3
    Membre chevronné

    Homme Profil pro
    développeur
    Inscrit en
    Octobre 2013
    Messages
    1 579
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : développeur

    Informations forums :
    Inscription : Octobre 2013
    Messages : 1 579
    Points : 1 992
    Points
    1 992
    Par défaut
    Salut,

    La fonction include n’autorise pas l'inclusion d'un fichier externe au domaine pour des raisons de sécurités, tu peux modifier ça dans les fichier de conf de php mais à oublier c'est dangereux.
    Tu dois passer par une api ou tu appelles avec une url un script il te retourne une réponse json ou autre, avec guzzle ou le httpClient de symfony https://symfony.com/doc/current/comp...tp_client.html
    Ici je ne vois pas l'intérêt d'avoir les fonctions sur l'autre serveur.

  4. #4
    Candidat au Club
    Profil pro
    Inscrit en
    Mars 2013
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2013
    Messages : 8
    Points : 4
    Points
    4
    Par défaut
    Merci de votre réponse.

    En effet, le fichier à inclure est sur le même serveur que le fichier qui le reçoit.

    Mon besoin est le suivant:
    Voici l’arborescence de mon serveur:
    /home/client/www/include/script.php
    /home/client/www/appli1/index1.php
    /home/client/www/appli2/index2.php
    /home/client/www/appli2/sous_dossier/index22.php
    /home/client/www/appli3/test.php
    en entête des trois fichiers: index1.php, index2.php et test.php
    j'ai besoin d'inclure script.php
    jusqu'à présent j'utilisait donc la ligne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <?php include('../include/script.php');?>
    en changeant le chemin à chaque fois: ../include/script.php ou ../../include/script.php ou ../../../include/script.php.

    Il faut bien entendu compter que mon serveur a bien plus de dossiers, sous-dossiers et fichiers que cela
    et donc si je dois changer de serveur, ou modifier l'arborescence de mes fichiers, je dois passer tous les scripts et modifier le chemin.

    Donc je pensais créer et rediriger un nom de domaine: http://include.nomdedomaine.com/script.php
    qui m'aurait permis de ne pas avoir à modifier tous les fichiers "inclueurs"
    et également d'utiliser un autre serveur plus performant, ou qui ne stockerai que les bases de données, ou pour toute autre raison.

    J'ai tenté d'utiliser $_SERVEUR['DOCUMENT_ROOT'] ou dirname(__FILE__), mais j'ai le même problème en cas de changement d'arborescence.

    Auriez-vous une idée qui permettrait de faire cela ?
    Dois-je revoir ma façon d'inclure mon script.php ?

  5. #5
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    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
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    Salut,

    il existe un mécanisme qui résout ce souci c'est l'autoloading
    Enfin, je ne sais pas ce que contient ton fichier script.php

  6. #6
    Candidat au Club
    Profil pro
    Inscrit en
    Mars 2013
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2013
    Messages : 8
    Points : 4
    Points
    4
    Par défaut
    Merci, je vais explorer cette piste.

  7. #7
    Expert confirmé
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 470
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 470
    Points : 5 831
    Points
    5 831
    Billets dans le blog
    1
    Par défaut
    Pourquoi $_SERVER['DOCUMENT_ROOT'].'/include/script.php' ne convient pas ?

    L'autoloading, si j'ai bien compris, ne sert qu'à localiser des classes à inclure et script.php n'est pas une classe, non ?

  8. #8
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    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
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    parce que $_SERVER['DOCUMENT_ROOT'] n'est pas fiable et peut être manipulé par le serveur web qui se trouve en amont de php. Généralement, le développeur est au courant de la config du stack mais parfois tu peux avoir des surprises ^^

  9. #9
    Expert confirmé
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 470
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 470
    Points : 5 831
    Points
    5 831
    Billets dans le blog
    1
    Par défaut
    OK, mais ça :
    Citation Envoyé par laurentSc Voir le message
    L'autoloading, si j'ai bien compris, ne sert qu'à localiser des classes à inclure et script.php n'est pas une classe, non ?

  10. #10
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    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
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    Bah si tu maîtrise l'autoloading, je pense que transférer le contenu d'un script qu'avec des fonctions utilitaires dans une ou plusieurs classes ne devrait pas être sorcier.
    Au pire il est possible de faire un truc bien crade (en utilisant l'autoloading) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    namespace Utils;
     
    class Functions01 { /* Volontairement vide */ }
     
    function f01() { ... }
    function f02() { ... }
    Puis dans le code ça doit être utilisé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    use Utils\Functions01;
     
    $foo = new Functions01; // tu auras toutes tes fonctions à disposition à partir de ce point
    Mais c'est tellement crade, que si tu l'utilises, tu es gentil et tu ne me mentionnes nulle part.

    Voici comment cela devrait être fait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    namespace Utils;
     
    class StringFuncs
    {
        public static function f01() 
        {
            // ...
        }
    }

  11. #11
    Expert confirmé
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 470
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 470
    Points : 5 831
    Points
    5 831
    Billets dans le blog
    1
    Par défaut
    Merci rawsrc_auteur_de_code_crade

    Et pour utiliser le code propre, même si je ne prétends pas maîtriser, ça serait bien :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    use Utils\StringFuncs;
     
    StringFuncs::f01();

  12. #12
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    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
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    oui

    après il existe des techniques beaucoup plus avancées à base de fonctions anonymes pour étendre les possibilités des classes utilitaires à l'exécution avec des helpers personnalisés à souhait.
    Mais là ça fait appel aux fonctions magiques des classes. Bref, c'est quand tu as bien ingurgité le modèle objet que tu peux délirer un peu.

  13. #13
    Expert confirmé
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 470
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 470
    Points : 5 831
    Points
    5 831
    Billets dans le blog
    1
    Par défaut
    Bon, je remets ça pour une autre vie...

  14. #14
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    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
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    Carrément une autre vie !!!
    C'est que ça doit être chaud chaud l'apprentissage de la POO non ?

  15. #15
    Expert confirmé
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 470
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 470
    Points : 5 831
    Points
    5 831
    Billets dans le blog
    1
    Par défaut
    Non, pour l'instant ça va (j'ai pas encore atteint la moitié du pavé de Bersini, même si je survole les exemples dans d'autres langages que java ou PHP), mais techniques beaucoup plus avancées, ça me refroidit...

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 13/12/2007, 11h10
  2. SQL Server / Fonction définie par l'utilisateur
    Par borgfabr dans le forum Langage SQL
    Réponses: 3
    Dernier message: 08/03/2005, 15h14
  3. Parametre par URL
    Par arsgunner dans le forum ASP
    Réponses: 2
    Dernier message: 21/06/2004, 09h53
  4. Fonctions définies par l'utilisateur
    Par DiGueDao dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 25/06/2003, 11h17
  5. [VB6] fonction d' encodage URL en VB
    Par jeanseb dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 14/01/2003, 11h16

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