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

Bibliothèques et frameworks PHP Discussion :

[PDF] Probleme avec les include


Sujet :

Bibliothèques et frameworks PHP

  1. #1
    Membre du Club
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Janvier 2005
    Messages
    101
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique

    Informations forums :
    Inscription : Janvier 2005
    Messages : 101
    Points : 69
    Points
    69
    Par défaut [PDF] Probleme avec les include
    Bonjour

    J'ai un fichier php (A.php par exemple) qui réalise certaines opérations, et dont je récupère le résultat depuis un autre fichier (main.php) de cette manière :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    //dans le fichier main.php
    function get_data()
    {
    <div style="margin-left:40px">include("A.php");
    return (une variable provenant de A.php);</div>}
    A chaque appel de get_data() les variables de A.php ont une portée interne à la fonction et sont donc détruites au return de la fonction get_data(), cependant les fonction de A.php ont une portée globale. C'est la que vient mon problème.
    Depuis main.php j'ai besoin d'apeller get_data() plusieurs fois.
    Cela marche bien lorsque la function get_data() est appelée une première fois, mais les fois suivantes => problème de redéclaration de fonction.
    Je précise que mettre include_once() ne résout pas mon problème car dans ce cas le fichier A.php n'est executé qu'une fois et pas à chaque appel de get_data().

    Le problème est assez ciblé (j'espère l'avoir bien décrit) mais je vois pas de solution simple. Avez vous une idée ?

    Merci beaucoup de votre aide

  2. #2
    Membre expérimenté
    Avatar de Anduriel
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Février 2004
    Messages
    2 290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration

    Informations forums :
    Inscription : Février 2004
    Messages : 2 290
    Points : 1 500
    Points
    1 500
    Par défaut
    Salut,

    Je ne sais plus si les erreurs de redéclarations sont des Notice ou Warning. Si se sont des Notice, mets juste un @ devant la fonction pour masquer l'erreur.

    Sinon est ce que ce ne serait pas possible d'inclure le fichier A.php avant toute fonction (dont get_data()) dans main.php, mais de rendre global les variables s'y trouvant pour les rendre disponibles aux fonctions qui suivent (dont get_data()) ?


  3. #3
    Rédacteur
    Avatar de Yoshio
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    1 732
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 732
    Points : 2 981
    Points
    2 981
    Par défaut
    pourquoi ne pas initialiser tes variable de A à false ou '' ?!

  4. #4
    Membre du Club
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Janvier 2005
    Messages
    101
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique

    Informations forums :
    Inscription : Janvier 2005
    Messages : 101
    Points : 69
    Points
    69
    Par défaut
    Merci de vos réponses mais ce n'est pas si simple en fait. Dans le fichier A.php, il y a plusieurs opérations effectuées qui dépendent d'un paramètre de get_data().

    Plus précisément cela est réalisé de cette façon
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    //dans le fichier main.php
    function get_data($parametre)
    {
          include("A.php");
          return (une variable provenant de A.php); 
    }
    A.php utilise la variable $parametre pour creer le resultat.

    Le fichier A.php peut être executé seul (par requete http simple), il trouve son parametre dans $_GET et renvoi le resultat sur la sortie standard.
    Dans le cas ou il est executé par un autre fichier, il ne renvoi rien sur la sortie standard, la fonction get_data me permet de récupérer le résultat. Ca aurait pu marcher trés bien avec file_get_contents mais je suis en safe_mode et je ne peux pas me servir de cette fonction.

  5. #5
    Membre expérimenté
    Avatar de Anduriel
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Février 2004
    Messages
    2 290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration

    Informations forums :
    Inscription : Février 2004
    Messages : 2 290
    Points : 1 500
    Points
    1 500
    Par défaut
    J'ai tilté sur une chose que j'ai pas compris:

    Cela marche bien lorsque la function get_data() est appelée une première fois, mais les fois suivantes => problème de redéclaration de fonction.
    Pourquoi tu redéclares la fonction plusieurs fois? Elle peut être appelée X fois sans problème de rédéclaration ?

  6. #6
    Membre éprouvé
    Inscrit en
    Juillet 2004
    Messages
    1 027
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 1 027
    Points : 1 164
    Points
    1 164
    Par défaut
    dans le fichier A.php dissocie fonction et usage. Et pour appeler tes fonctions utilise un require_once dans A.php.

    Tu as un sérieux souci de conception.

  7. #7
    Membre du Club
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Janvier 2005
    Messages
    101
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique

    Informations forums :
    Inscription : Janvier 2005
    Messages : 101
    Points : 69
    Points
    69
    Par défaut
    en reposant mon probleme de facon différente :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    function f1()
    {
          function f2()
          {
                ....
          }
    }
    Dès l'appel de f1(), f2() est déclarée et a donc une portée globale, elle peut donc être appellé à volonté hors de f1(). Si f1() est apellée de nouveau, f2() est alors redéclarée => mon problème.
    Plus d'explications : http://fr.php.net/manual/fr/language.functions.php
    Une solution à mon problème : réduire la définition de f2() à l'interieur de f1() seul. Mais comment faire ?

  8. #8
    Membre expérimenté
    Avatar de Anduriel
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Février 2004
    Messages
    2 290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration

    Informations forums :
    Inscription : Février 2004
    Messages : 2 290
    Points : 1 500
    Points
    1 500
    Par défaut
    La seule façon c'est de sortir ta fonction de A.php vers un autre fichier encore.

  9. #9
    Membre du Club
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Janvier 2005
    Messages
    101
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique

    Informations forums :
    Inscription : Janvier 2005
    Messages : 101
    Points : 69
    Points
    69
    Par défaut
    L'erreur est de type "Fatal error" donc pas de @ possible.

    Sinon concernant la conception je suis plutot débutant, compte tenu de mes connaissance en programmation je suis impressionné par ce que j'ai déjà réalisé (j'ai commencé le HTML/CSS/javascript/PHP/mysql il y a 1 an et demi). Là où je viens d'améliorer considérablement mon site, je me rend compte aujourd'hui que j'aurais pu faire mieux (notament en faisant plus de classes), mais j'aimerais autant ne pas repartir à zéro. Je comprend les bases de la programmation orientée objet mais c'est pas naturel, tant pis je le saurais pour la prochaine fois...

  10. #10
    Membre actif Avatar de renaudjuif
    Inscrit en
    Avril 2006
    Messages
    325
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 325
    Points : 258
    Points
    258
    Par défaut
    Salut,
    Une question bête, pourquoi mettre f2() dans f1() ?
    Il ne serait pas plus simple d'appeler f2() depuis f1()?
    On utilise souvent un fichier du genre "common_functions.php" qui regroupe les fonctions appelées depuis différentes pages...
    Ou alors si les fonctions sont indissociables, peut-être faire un objet, avecf1() comme constructeur.
    C'est curieux chez les marins ce besoin de faire des phrases !

  11. #11
    Membre éprouvé
    Inscrit en
    Juillet 2004
    Messages
    1 027
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 1 027
    Points : 1 164
    Points
    1 164
    Par défaut
    Citation Envoyé par Delphy113
    en reposant mon probleme de facon différente :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    function f1()
    {
          function f2()
          {
                ....
          }
    }
    Dès l'appel de f1(), f2() est déclarée et a donc une portée globale, elle peut donc être appellé à volonté hors de f1(). Si f1() est apellée de nouveau, f2() est alors redéclarée => mon problème.
    Plus d'explications : http://fr.php.net/manual/fr/language.functions.php
    Une solution à mon problème : réduire la définition de f2() à l'interieur de f1() seul. Mais comment faire ?
    d'ou le require_once.

    fichier a.php
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    require_once("a.fonctions.php");
    $toto = "r";
    fichier a.fonctions.php
    fichier main.php
    De cette façon a.php sera inclut autant de fois que necessaire, et donc les variables seront ré attribuer ect.
    Mais le fichier a.fonction.php ne sera appelé qu'une et une seule fois.
    Donc tu n'auras plus de souci de fonction déja déclarés ect.

    Sinon il existe une fonction qui s'appele function_exist( string func_name ).
    Qui s'utlise ainsi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if( function_exist( "toto") == false )
    {
    function toto(){}
    }
    Dans ce cas la tu peux évincer le require_once.

    Je rajouterais que la conception n'est pa un domaine liés seulement à l'OO. L'OO n'à été inventé que pour formaliser et améliorer ce qui pouvait se faire en procédural à l'époque de jérusalem.
    Mieu vaut un pondre un code bien chiader en procédural avec une conception correct, qu'une grosse m**** en OO juste parce que c'est la mode.

    ... tant pis je le saurais pour la prochaine fois...
    Il n'y à qu'en forgeant que l'on devient forgeron courage, c'est je pense la meilleure méthode pour apprendre en auto didacte. Essayer, observer, corriger, refaire, jusqu'à parvenir à quelque chose de bô.

    Ceci dit, rien ne t'emepche aussi de te documenter, ou de demander de l'aide, avant de te lancer pour atteindre un résultat plus satisfaisant dès le premier coup xD

    Fin voila.

    bbye

  12. #12
    Membre actif Avatar de renaudjuif
    Inscrit en
    Avril 2006
    Messages
    325
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 325
    Points : 258
    Points
    258
    Par défaut
    Ta réponse est pertinente, ePoX,
    Citation Envoyé par ePoX
    Je rajouterais que la conception n'est pa un domaine liés seulement à l'OO. L'OO n'à été inventé que pour formaliser et améliorer ce qui pouvait se faire en procédural à l'époque de jérusalem.
    Mieu vaut un pondre un code bien chiader en procédural avec une conception correct, qu'une grosse m**** en OO juste parce que c'est la mode.
    Je suis d'accord, il ne faut pas se lancer dans une méthode parce que tout le monde ne jure que par ça, mais quand on arrive à des problèmes tels que des fonctions inclues dans des fonctions, ne faut-il pas prendre un peu de recul et se demander si la structure est cohérente ? Elle l'est peut-être dans ce cas de figure, mais ça vaut la peine de se poser la question, non?

    J'ai par exemple pour habitude, quand j'arrive à trop de boucles imbriquées, de m'arrêter et de me demander si c'est la bonne solution...
    Je ne compte plus le nombre de fois où je suis reparti de zéro pour attaquer le problème différemment
    C'est curieux chez les marins ce besoin de faire des phrases !

  13. #13
    Membre actif Avatar de MicroPuce
    Inscrit en
    Mai 2004
    Messages
    262
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 262
    Points : 212
    Points
    212
    Par défaut
    Salut,
    J'avoue que :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    function f1()
    {
          function f2()
          {
                ....
          }
    }
    Ca me fait dresser les cheveux sur la tête (enfin, ceux qui restent ) Je savais même pas qu'on pouvait définir une fonction dans une autre fonction
    Donc, je rejoins l'avis de quelques autres, tu as un problème de conception : essaie de sortir cette fonction et ça devrais résoudre ton problème. Je crains que les require_once ou autres ne te servent qu'à compliquer un peu plus ton code
    A priori, je vois pas pourquoi tu serais obligé de définir cette fonction "imbriquée", ch'uis sur que tu peux faire autrement... Vérifie le découpage de ton fichier inclus, sorts en ce que tu utilises plusieurs fois (tes fonctions, par exemple) et utilise un include lorsque tu dois les appeler.
    Continue à t'arracher les cheveux (si y t'en reste ), c'est comme ça qu'on avance...
    Bon courage

  14. #14
    Membre du Club
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Janvier 2005
    Messages
    101
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique

    Informations forums :
    Inscription : Janvier 2005
    Messages : 101
    Points : 69
    Points
    69
    Par défaut
    Merci de vos réponses.

    Pour préciser un petit peu plus, ca se passe comme ca :
    Dans le fichier A.php :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Un peu de code qui se sert de f2() pour créer un fichier pdf.
    function f2()
    {
          ....
    }
    Donc si on apelle A.php, il renvoi le resultat sur la sortie standard.

    Dans le fichier main.php
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    function get_data($parametre)
    {
          include("A.php");
          return (une variable provenant de A.php); 
    }
    le fichier A.php ne renvoi rien sur la sortie standard, la fonction get_data() renvoi le résultat de A.php

    Je voulais éviter de faire des milliers de fichiers, et en fait je m'en doutait un peu, il faut bien sortir la fonction f2() de A.php.
    J'ai bien un fichier 'common.php' mais il y a tellement de fonctions que je voulais pas rajouter f2() qui n'est en fait utilisé que par A.php.
    Sinon au sujet de la prog OO, je me rend compte que dans mon cas, ca aurait été justifié. Mais en commencant j'avais un peu de mal à modéliser tous les problèmes. Ca m'aurait évité de faire des include dans des fonctions.
    Mais je vous rassure tout n'est pas si tordu dans le reste du site.
    Par contre si vous avez des propositions de conception pour réaliser tout cela je suis preneur. Je me rends compte que c'est un peu foireux mais je sais pas trop quoi changer pour améliorer cela.

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

Discussions similaires

  1. probleme avec les charts(affichage du digramme en pdf)
    Par ergo_proxy dans le forum Jasper
    Réponses: 3
    Dernier message: 30/12/2011, 13h25
  2. [Api Mysql] Probleme avec les includes
    Par Arkolos dans le forum Bibliothèques
    Réponses: 2
    Dernier message: 25/11/2009, 21h25
  3. Réponses: 3
    Dernier message: 16/04/2009, 08h56
  4. problem avec les generations de fichier pdf
    Par stephv dans le forum Access
    Réponses: 7
    Dernier message: 03/03/2006, 08h15
  5. probleme avec les processus
    Par saidi dans le forum Autres éditeurs
    Réponses: 1
    Dernier message: 05/02/2003, 00h18

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