PHP Snippets im Content ersetzen & ausführen

  • Ich hab ein kleines Problem mit dem Backend meiner Website.
    Um Inhalte einzufügen/zu pflegen benutze ich erfolgreich den FCKeditor. Klappt alles wunderbar und bin auch sonst zufrieden. Allerdings hab ich ein kleines Problem...

    Eigentlich enthalten meine Seiteninhalte kein PHP. Doch auf manchen bräuchte ich das um kleine "Tools" or what ever darzustellen.
    Jetzt hab ich mir gedacht, ich kann ja die nötigen PHP Scripte in meiner Datenbank speichern.
    Aufrufen tu ich sie dann so:

    Mein Text im FCKeditor:
    Lorem ipsum dolor sit amet, [[PHP_Snippet_Name]] consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua.

    Das ganze kann ja dann so abgespeichert werden, muss halt dann bei Auslesen aus der Datenbank durch eine Funktion, die alle [[xxxxxx]]-Tags durch die PHP Snippets ersetzt.
    Genau hier liegt mein problem.
    Einen Regulären Ausdruck der mir das alles Ausliest hab ich schon. Allerdings hab ich keine Ahnung wie ich den PHP Code dann ausführen kann...
    Das ist mein Code bisher. Ist noch die reinste Baustelle... Und ist auch noch ohne Datenbankverbindungen...

    Hat jemand eine Idee? Muss nicht auf das aufbauen was ich hier schon programmiert habe, falls jemandem was besseres einfällt immer her damit :)

    Danke im voraus :)

    Don't follow me, I run into walls.

  • Eval wäre dein freund/feind

    Ich empfehl es nicht aber diese Funktion suchst du

  • Danke für den Tipp. Das scheint wohl wirklich das zu sein was ich brauch.
    Hab mein Script jetzt mal so umgebaut. Sieht jetzt so aus... Allerdings bekomm ich jetzt den PHP Code vor dem Text ausgegeben und nicht da wo er eigentlich sein soll...

    Don't follow me, I run into walls.

  • weil eval den code ausführt, als würde er dort stehen. Eval fängt die Ausgabe vom Code nicht auf.dazu brauchst du einen output-buffer,
    ob_start();
    ob_get_contents();
    ob_end_clean();
    PS.:
    Höchstwarscheinlich sieht eval() so aus:

    PHP
    function eval($str) {
        // eine nicht-existierende datei suchen
        file_put_contents($file, $str);
        inclue($str);
        unlink($file);
    }

    Der, der weiß dass er nichts weiß, weiß mehr als der, der nicht weiß, dass er nichts weiß.

    Wer nach etwas fragt, geht grundsätzlich das Risiko ein, es auch zu bekommen!

    Einmal editiert, zuletzt von Tobse (15. Juli 2010 um 20:52)

  • was is eigentlich das hier fürn konstrukt:

    PHP
    if ($vorkommen !== false){
    }

    is des net des gleiche wie:

    PHP
    if ($vorkommen){
    }


    ??

    ich bin ja nich ganz so firm in php... aber wenn ich frage ist etwas nicht false dann kann ich auch auf true abfragen oder sehe ich das falsch?

  • Natürlich geht das, aber $vorkommen ist ja nicht true sondern ein int oder eben false.
    if ($vorkommen) { funktioniert, ist aber ungefähr wie $array[key] anstatt $array['key'] zu schreiben, denn $vorkmmen ist ja wie gesagt nicht true.

    Der, der weiß dass er nichts weiß, weiß mehr als der, der nicht weiß, dass er nichts weiß.

    Wer nach etwas fragt, geht grundsätzlich das Risiko ein, es auch zu bekommen!


  • Ausgabe
    $vorkommen !== false
    $vorkommen hat keinen Wert
    $vorkommen !== false
    $vorkommen hat einen Wert
    $vorkommen !== false
    $vorkommen hat einen Wert
    $vorkommen !== false
    $vorkommen hat keinen Wert

    Aus der Doku:

    Zitat

    Die Sprache unterstützt weiterhin ein Set von absoluten Vergleichsoperatoren: === (inhalts- und typgleich) und !== (nicht inhalts- oder typgleich).


    Höchstwarscheinlich sieht eval() so aus:


    Das wäre eine extrem billige Lösung und wird grantiert nicht so gemacht!!!

    Einmal editiert, zuletzt von bandit600 (15. Juli 2010 um 21:45)

  • @Bandit: ja warum denn nicht? Ich finde, dann hätte php seine eigene power gut genutzt, uneffizient ist es natürlich, da haste vollkommen recht. Nichts desto trotz wirkt eval() genau wie diese funktion es auch tut. Back2Topic: versuchs damit:

    PHP
    function run($str) {
        ob_start();
        eval($str);
        $str=ob_get_contents();
        ob_end_clean();
        return $str;
    }

    Der, der weiß dass er nichts weiß, weiß mehr als der, der nicht weiß, dass er nichts weiß.

    Wer nach etwas fragt, geht grundsätzlich das Risiko ein, es auch zu bekommen!

    Einmal editiert, zuletzt von Tobse (15. Juli 2010 um 23:39)

  • Danke Tobse, das scheint zu funktionieren. Ich werd mal versuchen das Script jetzt abzuändenr, das es sich das PHP aus einer Datenbank holt...

    EDIT//

    Hab das ganze jetzt abgeändert, allerdings bekomm ich jetzt eine Notice "Notice: Undefined offset: 1 in /www/htdocs/xxxxxx/xxxxxx/includes/functions.inc.php on line 191"

    Hab schon die ganze Zeit rumprobiert aber ich bekomms nicht wirklich hin... Das ersetzen klappt allerdings wunderbar :) Der Code wird auch ausgeführt.
    ...hab gerade nochmal geschaut was passiert wenn ich mehr als ein "snippet" einbinde. Dann kommt keine Notice. Nur wenn EIN snippet im Content ist...

    Don't follow me, I run into walls.

    2 Mal editiert, zuletzt von MyXoToD (16. Juli 2010 um 09:29)

  • Zitat

    "Notice: Undefined offset: 1 in /www/htdocs/xxxxxx/xxxxxx/includes/functions.inc.php on line 191"


    Ich sehe nur 21 Zeilen Quellcode :(
    Zu vermuten ist diese Zeile:

    PHP
    $snippet_tag = $ergebnis[0][$i];


    Und da hilft
    Richtig debuggen
    1. Man bemerkt, dass ein Skript nicht das tut, was es soll.
    2. Man schreibt an den Anfang des Scriptes die Zeile: error_reporting(E_ALL); und ini_set("display_errors", true);
    3. Man versucht, die Stelle die daran Schuld sein kann, schonmal einzugrenzen. Falls dies nicht geht, wird zunächst das komplette Skript als fehlerhaft angesehen.
    4. An markanten Stellen im Skript lässt man sich wichtige Variableninhalte ausgeben und ggf. auch in bedingten Anweisungen eine kurze Ausgabe machen, um zu überprüfen, welche Bedingung ausgeführt wurde (oder auch nicht).
    5. Schritt 3 wird so lange wiederholt, bis Unstimmigkeiten im Skript auffallen
    6. Damit hat man das Problem (Unstimmigkeit) gefunden und kann versuchen diese zu beheben. Hierzu dienen dann die PHP-Dokumentation und andere Quellen als Ratgeber.
    7. Lässt sich das konkrete Problem trotzdem nicht beheben, kann man in Foren um Rat fragen.
    8. Das Programm läuft und man kann die Debug-Ausgaben wieder entfernen.

  • Die Zeile hat die Notice gemeint allerdings wars eine Zeile davor, das Script ist jetzt so und scheint vorerst richtig zu funktionieren:

    Vielen Dank für eure Hilfe :)

    Don't follow me, I run into walls.

    Einmal editiert, zuletzt von MyXoToD (16. Juli 2010 um 09:42) aus folgendem Grund: Danke sagen :D

  • Also meine Seite funktioniert so:
    Ich hab im Backend mein Formular um verschiedene Artikel anzulegen.
    Das Formular benutzt den FCKeditor. Darüber kann ich aber kein PHP benutzen.
    Alle Artikel werden bei Einzelansicht aus der Datenbank in die Datei viewpost.inc.php ausgelesen. Und wenn ich jetzt in einem Artikel ein kleines Script zeigen will brauch ich halt sowas wie snippets...
    Es handelt sich zur Zeit um meine Private Website: Link ist in der Signatur. Schaus dir an dann verstehst du wie das ganze aufgebaut ist.

    Don't follow me, I run into walls.

  • Fakt ist: eval is evil, so hab ich es zumindest gelernt^^
    Und Snippets in der Datenbank zu halten, halte ich für ein absolutes NO-GO. Falls die Snippets groß sind würde ich es so machen:

    Ansonsten kannst du diese Variante auch leicht auf ein Array mit Snippets umbauen ;)
    Im Endeffekt liegt es bei dir, wie du es machst, Snippets in der Datenbank, halte ich jedoch für nicht gut.

    Gruß crAzywuLf :D

  • Wieso hälst du das nicht für gut Snippets in Datenbanken zu speichern? Das ist doch grad ein guter Ort. Manche bzw. die meisten CMS Speichern ihr ganzes Template + das was dazu gehört in der Datenbank...
    So kann ich nämlich beliebig Snippet hinzufügen, editieren und löschen.

    Don't follow me, I run into walls.

  • Wieso hälst du das nicht für gut Snippets in Datenbanken zu speichern? Das ist doch grad ein guter Ort. Manche bzw. die meisten CMS Speichern ihr ganzes Template + das was dazu gehört in der Datenbank...

    Sicherheit und Auslastung der Datenbank. Vielleicht nicht unbedingt bei deinem kleineren Projekt, aber bei Großen gewiss.

    Zitat


    So kann ich nämlich beliebig Snippet hinzufügen, editieren und löschen.

    hmm.. was davon kann man bei Dateien/Array jetzt nicht?

    Mach es, wie du meinst. Mir war es nur wichtig auch auf die andere Variante hinzuweisen ;)

    Gruß crAzywuLf :D

  • Ist mit sicherheit auch eine Gute Lösung :) Bei größeren Projekten würde ich warscheinlich dann auch doch darauf zurückgreifen, allerdings reicht das wa sich jetzt hab für meine Seite voll und ganz aus :)

    Don't follow me, I run into walls.

  • Crazywulf hat recht, eval is evil. Ich sehe bei deinem Beispiel auch überhaupt keinen Grund dafür. Wieso bitte sollen die Scripte an der Stelle ausgeführt werden? Was spricht dagegen den Code der an der Stelle der Platzhalter ausgeführt werden soll ganz normal im Script über eine Funktion aufzurufen und dann in deinem Content den Platzhalter mit dem Ergebnis zu ersetzen? Wieso soll der Code grad an der Stelle ausgeführt werden? Leuchtet mir nicht ein, auch wenn ich mir zugegebenermaßen dein Beispiel nicht groß angeschaut habe.
    eval ist aber in 99,99% der Fälle eine Murks-Lösung (mir persönlich ist ehrlich gesagt noch nie ein sinnvoller Einsatz von eval untergekommen, der nicht auf andere Weise wesentlich sauberer zu lösen gewesen wäre).

    Und PHP-Code hat definitiv NIX in der Datenbank verloren.

    Klar mag es bei deinem kleinen privaten Projekt "egal" sein. Aber wozu unsauberen Stil angewöhnen, wenn es auch vernünftig geht? Der Mensch ist ein Gewohnheitstier.
    Wenn es jetzt läuft und dir egal ist lass es ruhig so, aber tu dir selbst einen Gefallen und gewöhn dir sowas nicht an.

    "Programming today is a race between software engineers
    striving to build bigger and better idiot-proof programs,
    and the universe trying to build bigger and better idiots.
    So far, the universe is winning."
    Rick Cook

  • Wieso versteht ihr denn alle nicht was der Sinn dahinter ist? :D
    Also ich möchte den Code ausführen, weil er sonst wegen dem FCKeditor einfach ausgegeben wird. Deswegen brauch ich halt die funktion um erstens den Code zum importieren und zweitens dann auszuführen.
    Und was PHP in der Datenbank angeht, das ist wohl eher eine eigene Meinung ob es da rein kann oder nicht. Ich finde es spricht nichts dagegen.
    Für die Datenbank ist es ja ganz normaler Text.

    Don't follow me, I run into walls.

  • Es geht nicht primär um Belastung der Datenbank, sondern zum einen darum, dass vernünftiges Debugen mit eval() nahezu unmöglich ist, zum anderen um eine vernünftige Struktur, in der Daten (Datenbank) und Programmcode (Scripte) getrennt werden.
    Desweiteren ist es eine extremes Sicherheitsrisiko PHP-Code über die Content-Verwaltung in die Datenbank schreiben zu lassen.

    Wie gesagt, mach von mir aus was du willst, mein Rat ist eben nur, dir so einen Pfusch-Stil gar nicht erst anzugewöhnen. Der schnellste Weg ist nicht immer der Beste.

    "Programming today is a race between software engineers
    striving to build bigger and better idiot-proof programs,
    and the universe trying to build bigger and better idiots.
    So far, the universe is winning."
    Rick Cook