Ankündigung

Einklappen
Keine Ankündigung bisher.

[Erledigt] phpdatei auslesen

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • [Erledigt] phpdatei auslesen

    Gute abend,
    ich bin auf der suche nach einer PHP-Funktion die PHPDateien auslesen kann. Das heißt wenn z.b. eine If-Abfrage in der Datei steht soll diese übernommen werden.
    include() nützt mit leider wenig,da dies in einem String passieren soll.
    Ich dachte erst an file_get_contents() aber das liest leider nur den geparsten code aus.
    Nochmal kurz: Eine Funktion,welche in etwa wie file_get_contents funktioniert aber auch den ungeparsten code weitergibt.

    Hier mal ein kleines beispiel:
    test1.php
    PHP-Code:
    $select=mysql_query([...]);
    $show=mysql_fetch_data($select);

    echo 
    $show['id']; 
    test2.php
    PHP-Code:

    [...]
    $display fread("index.html");
    [...]
    $display str_replace("{read_test1.php}",gesuchte_funktion(test1.php), $display);
    echo 
    $display
    index.html
    Code:
    hallo user,dies ist deine id {read_test1.php}!
    Bei dem mysql_query() und dem auslesen(fread()) hatte ich keine Lust den vollen Quellcode zu schreiben,er ist ja auch für mein problem belanglos
    Ich hoffe ich konnte mein Problem einigermaßen schildern, danke für jede Hilfe!
    Gruß,
    zwerg

  • #2
    Hallo zwerg,

    ich kann nicht wirklich verstehen, wie du bei file_get_contents() bereits geparsten Code (= HTML) bekommst?! Einzige Möglichkeit ist für mich, dass du eine Datei per URL aufrufst.

    Grunsätzlich ist file_get_contents() jedoch für lokale Dateien gedacht, so dass du dort den PHP-Code bekommen solltest.

    Andere Alternative ist es die Datei per fopen() zu öffnen und den Inhalt per fread() auszulesen.

    Aber grundsätzlich wäre es hilfreich noch ein paar Worte zum Nutzen und dem Zeil das du verfolgst zu posten. Bei deinem Post stehe ich geistig irgendwie im Wald.
    Viele Grüße,
    Dr.E.

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    1. Think about software design [B]before[/B] you start to write code!
    2. Discuss and review it together with [B]experts[/B]!
    3. Choose [B]good[/B] tools (-> [URL="http://adventure-php-framework.org/Seite/088-Why-APF"]Adventure PHP Framework (APF)[/URL][URL="http://adventure-php-framework.org"][/URL])!
    4. Write [I][B]clean and reusable[/B][/I] software only!
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    Kommentar


    • #3
      Erstmal danke für deine Hilfe.
      Ich schreibe an einer kleinen Templateklasse für mein cms,welches ich im moment zur Übung schreibe.
      Diese Templateklasse soll alle Dateien die mit dem Delimitern "{F" und "}" umschlossen sind ( in der index.tpl des Templates ) eindbinden.
      Da ich in der index.php, welche die index.tpl einbindet, den conections zur MySQL und die überprüfung der User eingebaut habe brauche ich den PHPCode.

      Mein Ansatz:
      Ich lade die index.tpl und ersetze {Fcontent} durch file_get_contents(content/news.php):
      PHP-Code:
      <?
        class template {
          
          [...]

        public function replace_function() {
          $this->template = str_replace("{Fcontent}",file_get_contents('content/news.php'),$this->template);
        }

        public function load($file) {
                  $fp = @fopen($this->file, "r")
                     $this->template = fread($fp, filesize($this->file)); 
                       fclose ($fp); 

              $this->replace_function();
         }
      ?>
      Diese Klasse wird in der index.php aufgerufen, genau die die MySQL-Klasse.
      Wenn aber jetzt die news.php aufgerufen wird kommt nur der HTMLCode, der Teil der Dynamisch ist, sprich die Daten aus der Datenbank sind nicht vorhanden, ich denke mal weil es in der news.php keine direkte Verbindung zur Datenbank gibt.

      Ich hoffe ich konnte mein problem etwas genauer schildern

      Kommentar


      • #4
        Hallo zwerg,

        ich hab diesen Satz schon oft angebracht, aber "will denn hier jeder seine Template-Klasse" selbst frickeln?

        Wofür gibt es eigentlich fertige Klassen (Smarty) oder ganze Frameworks (Symphony, mein eigenes, ...)? Ich denke du solltest dir eine fertige Klasse nehmen. Diese wurden über einen längeren Zeitraum entwickelt und getestet. Ausserdem muss man das Rad nicht zig mal neu erfinden.

        Zu deinem Code:
        Mit deiner Ersetzung hast du das Problem, dass es nicht möglich ist rekursive Strukturen, sprich die Einbindung in die Einbindung zu machen. Ausserdem bist du relativ Statisch und kannst z.B. keine Platzhalter definieren. Deine load()-Funktion ist im Übrigen das selbe wie file_get_contents() und der Übergabe-Parameter $file wird darin nirgends bedacht.

        Sorry, wenn meine Kritik hart klingt, aber ich denke es ist besser, eine fertige Klasse zu verwenden als allzu viel selbst zu schreiben. Das Thema kann nämlich beliebig komplex werden. Ein Beispiel findest du unter http://christian.zierpflanzenberatung.de.
        Viele Grüße,
        Dr.E.

        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        1. Think about software design [B]before[/B] you start to write code!
        2. Discuss and review it together with [B]experts[/B]!
        3. Choose [B]good[/B] tools (-> [URL="http://adventure-php-framework.org/Seite/088-Why-APF"]Adventure PHP Framework (APF)[/URL][URL="http://adventure-php-framework.org"][/URL])!
        4. Write [I][B]clean and reusable[/B][/I] software only!
        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

        Kommentar


        • #5
          Zitat von zwerg
          ich denke mal weil es in der news.php keine direkte Verbindung zur Datenbank gibt.
          denkst du das oder weisst du es?
          PHP-Code:
          //nicht getestet
          function parserchen($dateiname){
          ob_start();
          include(
          $dateiname);//edit
          $ret ob_get_contents();
          ob_end_clean();
          return 
          $ret;
          }


          .....
          $this->template str_replace("{Fcontent}",parserchen('content/news.php'),$this->template); 
          Slava
          http://bituniverse.com

          Kommentar


          • #6
            ich hab diesen Satz schon oft angebracht, aber "will denn hier jeder seine Template-Klasse" selbst frickeln? Sad
            Weil ich es lernen will

            Wofür gibt es eigentlich fertige Klassen (Smarty) oder ganze Frameworks (Symphony, mein eigenes, ...)? Ich denke du solltest dir eine fertige Klasse nehmen. Diese wurden über einen längeren Zeitraum entwickelt und getestet. Ausserdem muss man das Rad nicht zig mal neu erfinden.
            Die Leute,die diese tollen Templatesysteme und Frameworks geschrieben haben sind ja nciht geboren worden und konnten das von Anfang an. Auch sie(ich denk mal du auch) haben klein angefangen und sich langsam hochgearbeitet.
            Ich habe mir mal dein Framework angesehn und finde die Leistung wirklich sehr beachtlich, aber ich möchte meine Seiten mit meinem eigenen Können erstellen, und dazu brauch ich nunmal Übung...

            denkst du das oder weisst du es?
            Ich weiß es
            Aber danke für die Funtkion, funktioniert einwandfrei

            Kommentar


            • #7
              Zitat von zwerg
              aber ich möchte meine Seiten mit meinem eigenen Können erstellen, und dazu brauch ich nunmal Übung...
              ...die Du nicht bekommst, indem Du Dich gleich am Meisterstück versucht. Sei einfach erstmal Geselle und benutze Bestehendes. Dadurch bekommst Du wesentlich mehr Übung und Erfahrung. Dieses "Ich will von Anfang an alles selber machen" ist meist kontraproduktiv und führt in der Regel nur zu fehlerhaften Lösungen, verpassten Lernchancen und frustrierten und/oder verbohrten Entwicklern. Und immer daran denken: Wenn Du knallhart alles selber machen willst, darfst Du eigentlich auch kein php benutzen, sondern musst Dir Deine eigene Sprache entwerfen ...wenn da mal schon das Ende der Fahnenstange erreicht sein sollte.

              Kommentar


              • #8
                Ich stehe ja nicht ganz am Anfang,ich habe ja schonmal ein kleines CMS entworfen.
                Dieses CMS war ohne Klasse, einfach nur zusammengewürfelter Code. Das ganze strukturiere ich jetzt ganz neu, mit Klassen,einem Template- und Modulsystem.
                Wenn ich ein besetehendes nehme, z.b. Joomla,dann lerne ich wie ich es installiere. Ich kann mir auch Stundenlagn den Quellcode anschauen und mir hinterher einreden ich hätte das verstanden.
                Nein,ich bin auch nicht frustriert oder verbohrt, warum auch?Es ist mein Hobby, wenn es klappt freue ich mich, wenn nicht suche ich nach einer Lösung.

                Kommentar


                • #9
                  Zitat von zwerg
                  Ich stehe ja nicht ganz am Anfang,ich habe ja schonmal ein kleines CMS entworfen.
                  Und welche Templatesysteme hast Du bereits genutzt? Welche Ansätze haben sie verfolgt? Was waren ihre Vor- und Nachteile?
                  Bitte nicht falsch verstehen. Natürlich kann es funktionieren, dass aus "einfach mal loslegen mit dem Entwickeln eines Templatesystems" ein tiefes Verständnis für die Materie entsteht. Die Erfahrung zeigt aber einfach, dass die Wahrscheinlichkeit beim schrittweisen Vorgehen (erst nutzen, dann refelektieren, dann verbessern, dann selbst entwickeln) höher ist.

                  Kommentar


                  • #10
                    Hallo zwerg. Du sollst den Code von Joomla auch nicht angucken, sondern anwenden
                    Finde es prinzipiell richtig, einfach mal drauf loszucoden. Genauso hab ich es ja auch gemacht.
                    Nur warum nicht gleich am Anfang Ratschläge von Erfahrenen annehmen? Mit dieser Technik kommst du eben nicht weit, verwende statt Template-Engines und -Platzhaltern lieber eine PHP-Datei, zB dieser Art:

                    PHP-Code:
                    <html>
                    <head>
                      <title><?php echo $this->title?></title>
                    </head>
                    <body>

                    <?php foreach ($this->products as $product): ?>
                    <?php 
                    echo $product?>
                    <?php 
                    endforeach; ?>

                    </body>
                    </html>
                    Eine kleine Template-Klasse dazu:
                    PHP-Code:
                    <?php
                    class NoNameTemplate
                    {
                      function 
                    display($templateFile)
                      {
                         require 
                    $templateFile;
                      }
                    }
                    // ..
                    $template = new NoNameTemplate();
                    $template->title 'mein Titel';
                    $template->products = array('Schere''Stein''Papier');
                    ?>
                    Die kleinste aber effektivste Template-Klasse die es gibt. Zeig mir eine unkompliziertere und schnellere (ohne Caching, läßt sich aber einfach nachimplementieren)

                    Kommentar


                    • #11
                      Hallo Zwerg,

                      da muss ich schnulli wirklich zustimmen, ohne auf deine Replies konkreter eingehen zu wollen. Um effektiv zu sein, sollte man sich erst mal viele Dinge ansehen um sich Ideen von der Komplexität und vom Umfang, den man ungefähr brauchen wird zu machen. Da du dir meinen Link angesehen hast, hast du nun eine ungefähre Vorstellung bekommen, was am Ende rauskommen kann/muss, wenn man beliebige Komplexität haben möchte.

                      Für deinen einfachen Anwendungsfall gebe ich dir ein Stück weit Recht. Es ist natürlich interessant etwas selbst zu implementieren, da man dabei viel lernt - habe ich auch gemacht. Nur habe ich mir Ideen geholt, wie etwas aussehen kann und habe mir vorher einen Plan gemacht. Mein PageController (siehe Link) wurde komplett vorher in UML designed und ich habe mir Gedanken gemacht, was er können muss und wo ich in welchem Anwendungsfall welche Methoden benötige. Ich bin meine komplette bestehende Software durchgegangen und habe das validiert. Wenn du nicht im Ansatz einen solchen Weg gehst, wirst du schnell sehen, dass die Klasse zwar für einen bestimmten Anwendungsfall oder gar auch ein Gebiet taugt, nicht aber für alles, was du noch implementieren wirst taugt. Gut, denkst du dir, dann kann ich die erweitern... Da wirst du aber an die Grenzen kommen, denn irgendwann kollidieren 2 Gebiete so, dass sie nicht mehr vereinbar sind. Deswegen mein Rat als erfahrener Programmierer und Systemdesigner: hol dir Rat, diskutiere das mit uns durch (wenn du magst) und implementiere erst dann.


                      Ich habe mir mal dein Framework angesehn und finde die Leistung wirklich sehr beachtlich, aber ich möchte meine Seiten mit meinem eigenen Können erstellen, und dazu brauch ich nunmal Übung...
                      Den letzten Teil des Satzes habe ich schon oft gehört - "zur Übung". Viele, die diesen Satz geprägt haben, implementierten wirklich nur etwas "zur Übung" und das wurde später nie eingesetzt, weil es lediglich ein Code erzeugen und kein Designen war.

                      Ich bin gerne bereit hier mal endgültig ein allgemeingültiges Design einer Template-Klasse zu besprechen, auf das wir später einfach nur referenzieren können, denn es gibt hier ein recht begrenztes Feature-Set und das ist nunmal schon recht fix. Damit du mich nicht falsch verstehst, dass ich zu negativ bin fange ich damit mal an. Schnulli meint es übrigens auch nur gut


                      Template-Klassen sollten folgende Features haben:
                      - Dediziertes DOM für XML-Tags (Platzhalter, ...)
                      - Templates können nach einem bestimmten Ordner-Schema von Platte geladen werden
                      - Templates können Platzhalter haben
                      - In Templates können weitere Templates eingebunden werden
                      - Templates sollten weitere Unter-Templates haben können
                      - Ein Template sollte eine Controller-Datei referenzieren, die die Platzhalter kennt und "behandeln" kann.
                      - Abstraktes Formular-Handling (Beschreibung eines Formulars komplett in XML-Tags)
                      - Caching von Ausgaben

                      Mehr fällt mir erst mal nicht ein, das wichtigste ist das DOM, denn damit kann man strukturiert Tags in das Template schreiben (Platzhalter, weitere Templates einbinden, ...).

                      Wer Lust hat, kann meine Stichpunkte mal konkretistieren. Ich sach nur "think because you code"
                      Viele Grüße,
                      Dr.E.

                      ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
                      1. Think about software design [B]before[/B] you start to write code!
                      2. Discuss and review it together with [B]experts[/B]!
                      3. Choose [B]good[/B] tools (-> [URL="http://adventure-php-framework.org/Seite/088-Why-APF"]Adventure PHP Framework (APF)[/URL][URL="http://adventure-php-framework.org"][/URL])!
                      4. Write [I][B]clean and reusable[/B][/I] software only!
                      ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

                      Kommentar


                      • #12
                        Das wäre mein Vorschlag für eine Cache-Klasse:
                        PHP-Code:
                        <?php
                        class Template
                        {
                            private 
                        $_settings = array('script_file'    => null,
                                                       
                        'template_path'  => null,
                                                       
                        'cache_path'     => null);

                            public function 
                        __construct($sScriptFile$sTemplatePath null$sCachePath null)
                            {
                                
                        $this->_settings['script_file'] = $sScriptFile;
                                
                        $this->setPath('template', isset($sTemplatePath) ? $sTemplatePath dirname($sScriptFile));
                                
                        $this->setPath('cache',    isset($sCachePath)    ? $sCachePath    dirname($sScriptFile));
                            }

                            public function 
                        setPath($sType$sPath)
                            {
                                
                        $this->_settings[$sType '_path'] = realpath($sPath) . DIRECTORY_SEPARATOR;
                            }

                            public function 
                        display($sTemplateFile$bCache true/* [, mixed identifier1[, mixed identifier2[, ..]]] */)
                            {
                                
                        $sTemplateFilename $this->_getTemplateFilename($sTemplateFile);
                                if (!
                        file_exists($sTemplateFilename)) {
                                    
                        trigger_error(sprintf('%s(): Argument#1 is not an existing template file (base=%s)'__METHOD__$this->_settings['template_path']),
                                                  
                        E_USER_WARNING);
                                    return;
                                }
                                if (
                        $bCache) {
                                    
                        $sCacheFilename $this->_getCacheFilename(func_get_args());
                                    
                        // enforce existance of template
                                    
                        $bTemplateChanged filemtime($sTemplateFilename) > filemtime($sCacheFilename);
                                    
                        // ignore non-existance of script (wrong filename given)
                                    
                        $bScriptChanged   = !file_exists($this->_settings['script_file']) || (filemtime($this->_settings['script_file']) > filemtime($sCacheFilename));
                                    if (
                        is_readable($sCacheFilename) && !$bTemplateChanged && !$bScriptChanged) {
                                        
                        // echo 'using cache right now';
                                        
                        return readfile($sCacheFilename);
                                    }
                                    
                        ob_start();
                                }
                                require 
                        $sTemplateFilename;
                                if (
                        $bCache) {
                                    
                        $sDisplay ob_get_contents();
                                    
                        ob_end_clean();
                                    print 
                        $sDisplay;
                                    return 
                        file_put_contents($this->_getCacheFilename(func_get_args()), $sDisplay);
                                }
                                return 
                        true;
                            }

                            private function 
                        _getCacheFilename($aParameters)
                            {
                                
                        array_push($aParameters$this->_settings['template_path']);
                                
                        $sSerialized serialize($aParameters);
                                
                        $sNormalized preg_replace('#[_]{2,}#''_'preg_replace('#[^\d\w]#Uis''_'$sSerialized));
                                
                        $sHashed     md5($sSerialized);
                                if (
                        strlen($sNormalized) > 217) {
                                    
                        // 255 - strlen('.tmp') - strlen(md5($sSerialized)) - strlen('--') = 217
                                    
                        $sNormalized substr($sNormalized0217);
                                }
                                return 
                        $this->_settings['cache_path'] . sprintf('%s--%s.tmp'$sNormalized$sHashed);
                            }

                            private function 
                        _getTemplateFilename($sTemplateFile)
                            {
                                return 
                        $this->_settings['template_path'] . $sTemplateFile;
                            }
                        }
                        ?>
                        test.php
                        PHP-Code:
                        <?php
                        error_reporting
                        (E_STRICT);
                        require_once 
                        './../private/includes/classes/Template.php';

                        $sTemplatePath dirname(__FILE__) . '/../private/templates';
                        $sCachePath    dirname(__FILE__) . '/../private/tmp';
                        $oTemplate = new Template(__FILE__$sTemplatePath$sCachePath);

                        #print_r($oTemplate); exit;

                        $oTemplate->title 'mein Titel';
                        $oTemplate->products = array('Schere''Stein''Papier''Nagelfeile');

                        $oTemplate->display('test.tpl.php');
                        ?>
                        test.tpl.php
                        PHP-Code:
                        <html>
                        <head>
                          <title><?php echo $this->title?></title>
                        </head>
                        <body>

                        <?php foreach ($this->products as $product): ?>
                        <?php 
                        echo $product?>

                        <?php endforeach; ?>

                        </body>
                        </html>
                        Die Cache-Benennung ist noch ziemlich suboptimal, aber das kann ja zentral geändert werden.

                        Komischerweise wird eine nicht existierende Template-Datei nicht angetriggert, obwohl ich in die Bedingung reinkomme.

                        Kommentar


                        • #13
                          Hallo Zergling,

                          warum machst du das? md5-Hashes werden doch höchstens 32 Zeichen?

                          Code:
                          if (strlen($sNormalized) > 217) {
                          Viele Grüße,
                          Dr.E.

                          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
                          1. Think about software design [B]before[/B] you start to write code!
                          2. Discuss and review it together with [B]experts[/B]!
                          3. Choose [B]good[/B] tools (-> [URL="http://adventure-php-framework.org/Seite/088-Why-APF"]Adventure PHP Framework (APF)[/URL][URL="http://adventure-php-framework.org"][/URL])!
                          4. Write [I][B]clean and reusable[/B][/I] software only!
                          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

                          Kommentar


                          • #14
                            Ich möchte für den Cache-Dateinamen nicht mehr als 255 Zeichen verwenden, in ihm aber nach Möglichkeit trotzdem die Parameter sehen (sonst würde ich einfach nur md5() verwenden).
                            255 - 2 Zeichen (--) - 32 Zeichen (md5) - 4 Zeichen (.tmp) = 217

                            Kommentar


                            • #15
                              $oTemplate->title = 'mein Titel';
                              $oTemplate->products = array('Schere', 'Stein', 'Papier', 'Nagelfeile');
                              darf eigentlich ohne überschriebener __set() methode nicht functionieren.
                              Slava
                              http://bituniverse.com

                              Kommentar

                              Lädt...
                              X