Beate.: PHP Code im String - Was jetzt?

Hallo,

ich mache Vaterschaftsvertretung für meinen Kollegen und soll "mal eben" seine Arbeit weiterführen. Aufgabe ist aus einer SQL Datenbank, Inhalte auslesen und anzeigen.

Soweit so gut, Connect funktioniert, Datensatz kommt, anzeigen fertig. Doch so einfach ist das nicht in der Datenbank sind "WENN-DANN" Bedingungen im Datensatz vorhanden (Ich habe so etwas noch nicht gesehen).

Beispiel: Heute #IF-OPEN##wetter##GLEICH#rain#IF-CLOSE#die Regenjacke nicht vergessen.#ELSEIF-OPEN##wetter##GLEICH#sun#IF-CLOSE#den Sonnenhut aufsetzten.#IF-END#

Ich kenne soetwas garnicht. Mein Kollege ist auch nicht erreichbar, daher habe ich mich versucht dort hinein zu denken. Die Syntax ist klar ersichtlich Befehle werden von # Eingeklammert. Hier im Forum gab es auch schon einen Thread dazu (https://forum.selfhtml.org/self/2015/sep/11/schuelern-php-und-wenn-dann-erklaeren/1649793#m1649793).

Ich habe auch gefunden woher er #wetter# bekommt. Aber wie soll ich aus diesem "String" einen PHP Code zaubern?

Ich kann mit Replace zwar ordentlichen Code daraus machen, der ist dann aber in einem String!? Argh was hat er sich dabei nur gedacht? Jemand von euch eine Idee wie man da weiterkommen könnte?

  1. Tach!

    Ich kann mit Replace zwar ordentlichen Code daraus machen, der ist dann aber in einem String!?

    Ja, das hat Code so an sich, dass er zunächst in Textform vorliegt. Um ihn auszuführen, muss man ihn kompilieren oder interpretieren. Wenn Code aus einer anderen Quelle als einer Datei kommt, ist da prinzipiell kein Unterschied vorhanden.

    Argh was hat er sich dabei nur gedacht? Jemand von euch eine Idee wie man da weiterkommen könnte?

    Also entweder, du schreibst einen Interpreter (wenn den dein Kollege nicht schon hat) oder du schickst ihn dann durch eval().

    Aber ist er denn mit dem Projekt zwar soweit in der Planung, dass er solchen eigenen Code zwar formulieren kann, jedoch noch nicht soweit, dass er ihn auch ausführen kann?

    dedlfix.

    1. Hallo dedlfix,

      vielen Dank für den Einblick. Einen Interpreter schreiben PUH. Da ist EVAL wohl zum testen die einfachere Variante. Wie würde Sting denn dann korrekt aussehen?

      Beispiel Quelle: Heute #IF-OPEN##wetter##GLEICH#rain#IF-CLOSE#die Regenjacke nicht vergessen.#ELSEIF-OPEN##wetter##GLEICH#sun#IF-CLOSE#den Sonnenhut aufsetzten.#IF-END#

      Beispiel nach angedachtem Filter:

      Heute if($wetter==rain){die Regenjacke nicht vergessen.}elseif($wetter==sun){den Sonnenhut aufsetzten.}
      

      Das würde ich dann dann eval übergeben? Im Beispiel auf PHP.NET http://php.net/manual/de/function.eval.php sind keine IF Anweisungen gezeigt hast du hierfür vielleicht auch ein Beispiel. So kann es eigentlich nicht funktionieren.

      1. Hallo

        vielen Dank für den Einblick. Einen Interpreter schreiben PUH. Da ist EVAL wohl zum testen die einfachere Variante.

        Nein, Die PHP-Funktion eval führt als String vorliegende PHP-Anweisungen aus. Mit deinem Code kann sie, so, wie er vorliegt, nichts anfangen.

        Wie würde Sting denn dann korrekt aussehen?

        Na so. *scnr*

        Beispiel Quelle: Heute #IF-OPEN##wetter##GLEICH#rain#IF-CLOSE#die Regenjacke nicht vergessen.#ELSEIF-OPEN##wetter##GLEICH#sun#IF-CLOSE#den Sonnenhut aufsetzten.#IF-END#

        Beispiel nach angedachtem Filter:

        Heute if($wetter==rain){die Regenjacke nicht vergessen.}elseif($wetter==sun){den Sonnenhut aufsetzten.}
        

        Ja, wenn du alle Sprachelemente des als String vorliegenden Codes kennst, kannst du ihn mit einem eigenen Interpreter z.B. zu PHP-Code umformulieren. Dann kann auch eval etwas damit anfangen. Den Interpreter für den eigenen Code brauchst du aber zwingend, da das eine eigene Sprache ist. Der Kollege sollte ihn schon da haben oder zumindest Informationen über den Entwicklungsstand hinterlassen haben.

        Ansonsten lässt er euch mMn ganz schön im Regen stehen.

        Tschö, Auge

        --
        Es schimmerte ein Licht am Ende des Tunnels und es stammte von einem Flammenwerfer.
        Terry Pratchett, „Gevatter Tod“
        1. Hallo Auge,

          im "regen stehen" trifft es. Der Rechner des Kollegen ist aus, und verschlüsselt. Eine Doku. oder Einweisung wäre toll gewesen, aber unsere Urlaube haben sich überschnitten.

          Damit ich den Interpreter schreiben kann, brauche ich den korrekten Code für den String. Folgendes habe ich probiert:

          $wetter = "rain";
          $str = 'Heute if($wetter==rain){die Regenjacke nicht vergessen.}elseif($wetter==sun){den Sonnenhut aufsetzten.}';
          echo $str . "\n";
          eval ("\$str = \"$str\";");
          echo $str . "\n";
          

          Ergebnis:

          Heute if(rain==rain){die Regenjacke nicht vergessen.}elseif(rain==sun){den Sonnenhut aufsetzten.}

          1. Nächster Versuch:

            $str = 'echo "Heute ".if($wetter==rain){die Regenjacke nicht vergessen.}elseif($wetter==sun){den Sonnenhut aufsetzten.}.".";';
            

            Ergebnis:

            echo "Heute ".if($wetter==rain){die Regenjacke nicht vergessen.}elseif($wetter==sun){den Sonnenhut aufsetzten.}.".";

            1. Nächster Versuch:

              eval(
                "if (1==1){".
                "echo ('abc');".
                "}");
              

              Ergebnis: abc

              Das funktioniert also müsste

              $wetter = "rain";
              $str = 	"if($wetter==rain){".
              		"echo ('die Regenjacke nicht vergessen.');".
              		"}";
              echo $str . "\n";
              eval ("\$str = \"$str\";");
              echo $str . "\n";
              

              Leider wird wieder der Sting ausgegeben:

              if(rain==rain){echo ('die Regenjacke nicht vergessen.');}

              1. Erster Erfolg

                <?php
                $wetter = "sun";
                
                eval(	"echo ('Heute ');".
                		"if('$wetter'=='rain'){".
                			"echo ('die Regenjacke nicht vergessen.');".
                		"}elseif('$wetter'=='sun'){".
                			"echo ('Sonnenmilch auftragen.');".
                		"}"
                	);
                ?>
                
                1. Jetzt läuft es schon wieder nicht... Wo ist denn das Problem?

                  $wetter = "sun";
                  $str = ("echo ('Heute ');".
                  		"if('$wetter'=='rain'){".
                  			"echo ('die Regenjacke nicht vergessen.');".
                  		"}elseif('$wetter'=='sun'){".
                  			"echo ('Sonnenmilch auftragen.');".
                  		"}"
                  	);
                  eval ("\$str = \"$str\";");
                  echo $str . "\n";
                  

                  Ausgabe:

                  echo ('Heute ');if('sun'=='rain'){echo ('die Regenjacke nicht vergessen.');}elseif('sun'=='sun'){echo ('Sonnenmilch auftragen.');}

                  1. Moin!

                    Was fummelst Du da herum? Auf den ersten Blick sieht das nämlich nach Murks aus.

                    Ich würde, bevor ich da herumfummle und womöglich Zeit verschwende, erst mal fest stellen wollen um was es sich bei diesen Einträgen überhaupt handelt. Es können "Merker" dafür sein, dass ein Programmteil noch nicht geschrieben ist und wie die Daten weiter zu behandeln sind. Die Tabellen-Spalte heisst nicht zufällig "ToDo"?

                    Wenn das nicht der Fall ist, dann muss fest gestellt werden, ob es sich WIRKLICH darum handelt, dass Programmteile in der Datenbank landen, wo diese normalerweise nichts zu suchen haben, denn die Trennung von Daten und Programm ist ein wichtiges Grundprinzip.

                    Sollte es sich ausnahmsweise gewollt sein, weil es sich um etwas wie ein Template handeln, dann muss da auch eine Template-Engine sein, durch welche die Rückgabe bearbeitet wird.

                    Ist das nicht der Fall, dann muss wohl Einiges neu geschrieben werden. Aufschluss gibt die Projektbeschreibung, das Pflichtenheft, der vorherige Programmierer ggf. dessen Dokumentation. Irgendwer muss zu dem den Programmablauf mal entworfen haben.

                    Sollte eine Projektbeschreibung, das Pflichtenheft und Hinweise zum geplanten Programmablauf vollständig fehlen, dann ist das Resultat der bisherigen Bemühungen sehr wahrscheinlich Murks und muss sowieso neu angefangen werden.

                    Jörg Reinholz

  2. Liebe Beate.,

    Beispiel: Heute #IF-OPEN##wetter##GLEICH#rain#IF-CLOSE#die Regenjacke nicht vergessen.#ELSEIF-OPEN##wetter##GLEICH#sun#IF-CLOSE#den Sonnenhut aufsetzten.#IF-END#

    das sieht für mich nach einem GAU in Sachen Applikationsdesign aus. Wer hat sich denn sowas ausgedacht? Und warum sollte man so etwas überhaupt benötigen?

    Liebe Grüße,

    Felix Riesterer.

    1. Moin,

      Und warum sollte man so etwas überhaupt benötigen?

      Ich schätze es handelt sich hier um den Versuch einer eigenen Templateengine oder ähnlichem... Oder so...

      Gruß Bobby

      --
      -> Für jedes Problem gibt es eine Lösung, die einfach, sauber und falsch ist! <- ### Henry L. Mencken ### -> Nicht das Problem macht die Schwierigkeiten, sondern unsere Sichtweise! <- ### Viktor Frankl ### ie:{ br:> fl:{ va:} ls:< fo:) rl:( n4:( de:> ss:) ch:? js:( mo:} sh:) zu:)
      1. Moin,

        Und warum sollte man so etwas überhaupt benötigen?

        Ich schätze es handelt sich hier um den Versuch einer eigenen Templateengine oder ähnlichem... Oder so...

        Das kanns sein: Das Template liegt in der DB. Mach ich doch genauso, dass meine Tempolates inner Datenbank liegn. Aller dings nutze ich eine andere Template-Langauge, hab ich selbst gebuat :)

        1. Moin,

          Das kanns sein: Das Template liegt in der DB. Mach ich doch genauso, dass meine Tempolates inner Datenbank liegn. Aller dings nutze ich eine andere Template-Langauge, hab ich selbst gebuat :)

          den Gedanken hatte ich auch mal, das ganze DB-gestützt zu entwickeln. Dies habe ich aber verworfen. Die Templates liegen als Datei vor und es wird von jedem Template eine aktuelle Version gecached wenn es neuer als der letzte Cache ist. Zudem habe ich ein XML-Sprachvariablen-System eingeführt und eine entsprechende Adminmaske gebaut. Die PHP Sprachkomponenten sind ähnlich der Smarty-Engine in eigene Identifier eingehüllt. Damit es leichter wird diese bei der Bearbeitung herauszufiltern. Ansonsten ist es ganz normales PHP.

          Vorteil:

          1. wenn du mal was am Template ändern willst, kannst du dies direkt im Dateisystem machen und musst nicht umständlich in der DB rumfummeln.
          2. Die Last für DB-Abfragen wird deutlich reduziert und in Verbindung mit NGINX und dem Cachesystem erzielt man eine viel bessere Performance als DB-gestützt (zumindest bei meinen Tests)

          Gruß Bobby

          --
          -> Für jedes Problem gibt es eine Lösung, die einfach, sauber und falsch ist! <- ### Henry L. Mencken ### -> Nicht das Problem macht die Schwierigkeiten, sondern unsere Sichtweise! <- ### Viktor Frankl ### ie:{ br:> fl:{ va:} ls:< fo:) rl:( n4:( de:> ss:) ch:? js:( mo:} sh:) zu:)
          1. Moin,

            1. wenn du mal was am Template ändern willst, kannst du dies direkt im Dateisystem machen und musst nicht umständlich in der DB rumfummeln.

            Mach ich sowieso, egal wo auf dem Webserver das Template bereitgestellt wird, editiert wird es bei mir im Single-User-Modus (Einmannbetrieb) stets als lokale Datei. So habe ich auch ein Backup.

            1. Die Last für DB-Abfragen wird deutlich reduziert und in Verbindung mit NGINX und dem Cachesystem erzielt man eine viel bessere Performance als DB-gestützt (zumindest bei meinen Tests)

            Wenn mein FW in mod_perl oder mod_fastcgi läuft, liegen alle Templates im Hauptspeicher nachdem der Webserver gestartet wurde. Danach gibt es bezüglich Templates gar keine DB-Abfragen mehr. Sofern weitere Templates im Dateisystem vorliegen, werden die beim ersten Request ebenfalls in den RAM befördert und bei nachfolgenden Requests direkt vom Memory gelesen. Außer dem Response-Objekt, was bei jedem Request neu erstellt wird, mache ich alles speicherresident. Das geht ab Alter ;)

  3. Moin!

    ich mache Vaterschaftsvertretung für meinen Kollegen und soll "mal eben" seine Arbeit weiterführen. Aufgabe ist aus einer SQL Datenbank, Inhalte auslesen und anzeigen.

    Eine ordentliche Übergabe wurde also gemacht?

    Soweit so gut, Connect funktioniert, Datensatz kommt, anzeigen fertig. Doch so einfach ist das nicht in der Datenbank sind "WENN-DANN" Bedingungen im Datensatz vorhanden (Ich habe so etwas noch nicht gesehen).

    Sieht komplizierter aus, als es zwingend sein muss, aber effektiv sind das Template-Anweisungen.

    Beispiel: Heute #IF-OPEN##wetter##GLEICH#rain#IF-CLOSE#die Regenjacke nicht vergessen.#ELSEIF-OPEN##wetter##GLEICH#sun#IF-CLOSE#den Sonnenhut aufsetzten.#IF-END#

    Ich kenne soetwas garnicht. Mein Kollege ist auch nicht erreichbar, daher habe ich mich versucht dort hinein zu denken. Die Syntax ist klar ersichtlich Befehle werden von # Eingeklammert. Hier im Forum gab es auch schon einen Thread dazu (https://forum.selfhtml.org/self/2015/sep/11/schuelern-php-und-wenn-dann-erklaeren/1649793#m1649793).

    Du brauchst die Template-Engine deines Kollegen. Du hast ja aufgrund der gemachten Übergabe Zugriff auf den Sourcecode und weißt, wo du nachgucken kannst.

    Ich habe auch gefunden woher er #wetter# bekommt. Aber wie soll ich aus diesem "String" einen PHP Code zaubern?

    Ich kann mit Replace zwar ordentlichen Code daraus machen, der ist dann aber in einem String!? Argh was hat er sich dabei nur gedacht? Jemand von euch eine Idee wie man da weiterkommen könnte?

    Egal was du basteln willst: Gehe davon aus, dass dein Kollege die Lösung dafür schon gecodet hat. Man schreibt nicht einfach wild irgendwelche Template-Marker in eine Datenbank, ohne dass man ein Konzept hat, wie man daraus wieder ansehnlichen Text machen kann.

    Finde den Code der Template-Engine und schau in deren Tests, wie diese Marker zu benutzen sind bzw. welche es gibt und was sie als Textergebnis bewirken.

    Grüße Sven

    PS: JA, natürlich ist mir klar, dass es keine ordentliche Übergabe gegeben hat, dass es keine Dokumentation gibt, keinen Zugriff auf den Sourcecode, und keine Tests. Wenn all das stimmt, bist/hast du ohnehin verloren und kannst dann auch gleich die DB ignorieren und eine komplett eigene Lösung aufsetzen, deren Auswirkungen du selbst verstehst, und deren Innereien keine unliebsamen Überraschungen enthalten. Muss dein Chef eben den Aufwand doppelt bezahlen, und dein Kollege kriegt dieselbe "tolle" Überraschung, wenn er wieder da ist: Oh, alles komisch, alles anders.

    Und wenn er dann sagt: "Warum hast du denn nicht einfach die Template-Funktion genommen.... die... ähm... auf meiner verschlüsselten Festplatte versteckt war, von der ich dir bei der ausgefallenen Übergabe nichts erzählt habe..." ... ist klar, worauf ich hinaus will?

    1. Hallo,

      ich mache Vaterschaftsvertretung für meinen Kollegen
      ...
      Mein Kollege ist auch nicht erreichbar,

      Warum eigentlich nicht? Er sollte doch immer noch dem Unternehmen angehören, Kontaktdaten sollten vorhanden sein. Ist es zuviel verlangt, die Übergabe nachzuholen?

      Gruß
      Kalk

      1. Moin,

        Ist es zuviel verlangt, die Übergabe nachzuholen?

        Daraus entnehme, dass du keine kinder hast oder nicht aktiv elternzeit genommen hast. Das ist alles nicht so eibfach wie es scheint...

        Gruß Bobby

        --
        -> Für jedes Problem gibt es eine Lösung, die einfach, sauber und falsch ist! <- ### Henry L. Mencken ### -> Nicht das Problem macht die Schwierigkeiten, sondern unsere Sichtweise! <- ### Viktor Frankl ### ie:{ br:> fl:{ va:} ls:< fo:) rl:( n4:( de:> ss:) ch:? js:( mo:} sh:) zu:)
        1. Hallo

          Ist es zuviel verlangt, die Übergabe nachzuholen?

          Daraus entnehme, dass du keine kinder hast oder nicht aktiv elternzeit genommen hast. Das ist alles nicht so eibfach wie es scheint...

          Mal ganz ehrlich, das wäre mir als Firma scheiß egal. Schließlich hängt der Fortgang einzelner Arbeitsaufgaben davon ab. Da muss er halt mal einen Tag ran. Andere Mütter und Väter schaffen es Tag für Tag, ihrer Arbeit nachzugehen, da sollte die verspätete Übergabe trotz Elternzeit drin sein.

          Allerdings spricht der Vorgang ganz allgemein von einer schlechten Organisation in diesem Bereich. Ein im Firmenintranet öffentliches Repository in einem Versionskontrollsystem erwarte ich heutzutage zumindest für die Aufgaben, die (voraussichtlich) nicht nur von einem Mitarbeiter bearbeitet werden.

          Tschö, Auge

          --
          Es schimmerte ein Licht am Ende des Tunnels und es stammte von einem Flammenwerfer.
          Terry Pratchett, „Gevatter Tod“
      2. Hi,

        ich mache Vaterschaftsvertretung für meinen Kollegen
        Mein Kollege ist auch nicht erreichbar, Warum eigentlich nicht?

        Abgesehen davon: so eine Schwangerschaft ist ja keine Sache von ein oder zwei Wochen. Da wäre VOR dem Urlaub doch wohl genügend Zeit gewesen für eine Übergabe. Beate hat ja wohl kaum 9 Monate Urlaub gehabt ... (Ok, 9 ist zu hoch angesetzt, direkt nach dem erfolgreichen "Schuß" weiß man's ja noch nicht, aber 6 Monate wären auch noch erstaunlich viel Urlaub)

        Und auch davon abgesehen: da stimmt doch grundsätzlich was nicht, wenn ein einzelner Kollege sozusagen Single Point of Failure ist - kaum fällt der aus, geht gar nichts mehr ...

        Die Übergabe wäre also eigentlich gar nicht nötig gewesen, weil es von vornherein einen Vertreter geben müßte. Schon für normalen Urlaub, Krankheit, ...

        cu, Andreas a/k/a MudGuard

        1. Hallo,

          Beate hat ja wohl kaum 9 Monate Urlaub gehabt ... (Ok, 9 ist zu hoch angesetzt, direkt nach dem erfolgreichen "Schuß" weiß man's ja noch nicht, aber 6 Monate wären auch noch erstaunlich viel Urlaub)

          ähm, bist du nicht eventuell auf einer falschen Fährte? Ist nicht der Vater- oder Mutterschaftsurlaub vor allem für die ersten paar Wochen und Monate nach der Geburt gedacht, anstatt davor? - Dass bei den Frauen auch die letzten Wochen der Schwangerschaft vor der Geburt eine Schonung und Auszeit rechtfertigen, ist klar. Aber wenn der Vater das Privileg in Anspruch nimmt, liegt der Fall IMO etwas anders.

          Die Übergabe wäre also eigentlich gar nicht nötig gewesen, weil es von vornherein einen Vertreter geben müßte. Schon für normalen Urlaub, Krankheit, ...

          ACK. Klares Versagen der firmeninternen Struktur und Organisation.

          So long,
           Martin

          1. Hi,

            Beate hat ja wohl kaum 9 Monate Urlaub gehabt ... (Ok, 9 ist zu hoch angesetzt, direkt nach dem erfolgreichen "Schuß" weiß man's ja noch nicht, aber 6 Monate wären auch noch erstaunlich viel Urlaub)

            ähm, bist du nicht eventuell auf einer falschen Fährte? Ist nicht der Vater- oder Mutterschaftsurlaub vor allem für die ersten paar Wochen und Monate nach der Geburt gedacht, anstatt davor?

            Ja eben. Beate macht Vaterschaftsvertretung. Der Vater kann erst nach der Geburt in Elternzeit gehen (die Mutter MUSS 6 Wochen vor dem errechneten Termin in Mutterschutz, aber das ist ja hier irrelevant, da es um den Vater geht, der vertreten wird). Der Vater sollte mind. 6 Monate vorher gewußt haben, daß da ne Schwangerschaft am Laufen ist. Und wenn sich dann die Urlaube von Beate und Vater überschnitten haben sollen, so daß keine Übergabe mehr möglich gewesen sein soll, müßte Beate eben diese 6 Monate Urlaub gehabt haben ...

            Dass bei den Frauen auch die letzten Wochen der Schwangerschaft vor der Geburt eine Schonung und Auszeit rechtfertigen, ist klar.

            Da es hier aber um eine Vaterschaftsvertretung geht, ist das irrelevant.

            cu,
            Andreas a/k/a MudGuard

        2. Hallo MudGuard,

          Und auch davon abgesehen: da stimmt doch grundsätzlich was nicht, wenn ein einzelner Kollege sozusagen Single Point of Failure ist - kaum fällt der aus, geht gar nichts mehr ...

          Natürlich läuft da was falsch. Aber das lässt sich nicht immer umgehen. Bei uns bin ich auch der einzige, der was machen kann, wenn etwas in der IT ausfällt. Wenn ich im Urlaub bin oder wenn ich ausfalle und etwas kaputt geht, dann hat die Firma ein Problem.

          Uns ist das Risiko auch durchaus bewusst und keiner von uns findet das Risiko schön, aber ändern kann man das nicht so ohne weiteres. Man müsste halt jemanden dafür einstellen, der mich ersetzen könnte. Aber genug zu tun für zwei volle Angestellte in der IT haben wir dann doch nicht. Das heisst, wir müssten jemanden entweder fürs rumsitzen bezahlen (und das ist für niemanden schön) oder wir müssten jemanden auftun, der z.B. Selbstständig ist und für den Support einspringt wenn mal Not am Mann ist oder wenn ich im Urlaub bin - und für so eine undankbare Aufgabe finde mal jemanden…

          Jaja, die Sorgen kleiner Firmen.

          LG,
          CK