Phil: Script aus Datenbank einbinden

Hallo,

ich komme beim programmieren nicht so recht weiter.
In einem CMS soll ein Teil des PHP-Scripts aus einer
MySql DB gelesen und ausgeführt werden.

Vereinfacht:
<?php
$query = "SELECT content FROM db_cont";
$result = mysql_query($query);
while($row = mysql_fetch_object($result))
{
echo $row->content;
}
?>

in der DB steht z.B:

<?php @include ('con1.php') ?>

Mit "echo" funktioniert das natürlich nicht, aber auch
alles mögliche andere funktioniert bei mir nicht.

Wie bindet man den DB-Inhalt richtig ein, wenn er PHP enthält?

Vielen Dank!

  1. Hallo,

    Mit "echo" funktioniert das natürlich nicht, aber auch
    alles mögliche andere funktioniert bei mir nicht.

    Was ist alles andere mögliche?

    Wie bindet man den DB-Inhalt richtig ein, wenn er PHP enthält?

    schon per include() probiert?

    mal davon abgesehen, sehe Ich es als keine gute Variante Skripte aus der DB zu laden, die auch noch interpretiert werden sollen, das Filesystem eignet sich besser als Ablage für Skripte.

    mfg

    1. Was ist alles andere mögliche?

      zB in Variable umwandeln.

      schon per include() probiert?

      ja, aber ohne Erfolg. Wie muss den include aussehen um aus einer
      Datenbank einzubinden? include ($row->content) ja eher nicht ;)
      Ich kenne das nur zum Dateien einbinden: include ('xyz.php')

      mal davon abgesehen, sehe Ich es als keine gute Variante Skripte aus der DB zu laden, die auch noch interpretiert werden sollen, das Filesystem eignet sich besser als Ablage für Skripte.

      ich wollte es auch mal mit PHP in Datenbanken versuchen, da das
      ja ansonsten sehr gut und schnell ist.

      1. ja, aber ohne Erfolg. Wie muss den include aussehen um aus einer
        Datenbank einzubinden? include ($row->content) ja eher nicht ;)
        Ich kenne das nur zum Dateien einbinden: include ('xyz.php')

        eben - also müsstest du den Inhalt der aus der DB kommt in eine Datei schreiben und dann includen

        ich wollte es auch mal mit PHP in Datenbanken versuchen, da das
        ja ansonsten sehr gut und schnell ist.

        Das kann doch nicht schneller sein einen Umweg durch die DB zu nehmen.

        Die zu includierenden Skripte im Filesystem lassen und nach Bedarf includen!

        mfg

      2. Hallo Phil,

        wenn Du Dir das Leben schon schwierig machen willst, ...

        schon per include() probiert?

        ja, aber ohne Erfolg. Wie muss den include aussehen um aus einer
        Datenbank einzubinden? include ($row->content) ja eher nicht ;)

        ... warum nicht? Selbstverständlich ginge das.

        Ich kenne das nur zum Dateien einbinden: include ('xyz.php')

        Wo ist der Unterschied, wenn $row->content als Inhalt xyz.php hat?

        mal davon abgesehen, sehe Ich es als keine gute Variante Skripte aus der DB zu laden, die auch noch interpretiert werden sollen, das Filesystem eignet sich besser als Ablage für Skripte.

        ich wollte es auch mal mit PHP in Datenbanken versuchen, da das
        ja ansonsten sehr gut und schnell ist.

        Was Du da machst, ist die beste Methode, einfachste Sachen kompliziert, langsam und unwartbar zu machen. Viel Spass dabei ...

        Vinzenz

  2. Hello,

    müsste eigentlich im Archiv stehen. Haben Fabian Transchel (wo ister eigentlich= udn ich schon mehrfach ausführlich drüber geschreiben.

    Die benötigte PHP-Funktion heißt eval()
    http://de.php.net/manual/de/function.eval.php

    Das Ganze ist aber nicht unkritisch, da PHP kein Overloading für Funktionen kennt, sondern mit einem Redefinition-Error antwortet, wenn Du eine Funktion mehrfach deklarierst.

    Das kann aber bei der von Dir gewählten Schleifenlösung sehr leicht geschehen.
    Funktionen, die in der DB stehen, sollten daher immer mit einem

    if (!function_exists(Funktionsname))
      {
         function Funktionsname()
         {

    }
      }

    eingebunden werden.

    http://de.php.net/manual/de/function.function-exists.php

    Da PHP bisher aber auch kein Entladen von Funktionen kennt, sollte man in der DB eigentlich gar keine Funktionen deklarieren und bei include immer include_once() nehmen.

    http://forum.de.selfhtml.org/archiv/2007/9/t158831/#m1033073

    Harzliche Grüße vom Berg
    http://bergpost.annerschbarrich.de

    Tom

    --
    Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
    Nur selber lernen macht schlau
    Ein Jammer ist auch, dass die Dummen so selbstsicher und die Klugen voller Zweifel sind. Das sollte uns häufiger zweifeln lassen :-)

    1. Vielen Dank für die ausführliche Antwort und die
      weiterführenden Hinweise.

      Das war genau die gesuchte Funktion, jetzt funktioniert es.

      Viele Grüße

      Philipp

  3. Soweit leuchten mir eure Antworten ein.

    es geht mir darum Datenbankabfragen ausführbar abzufragen.
    in einer DB sind zB. verschiedene Berechnungen für ein Preis etc.
    gespeichert welche über ein Menü per POST übermittelt werden.

    in der DB steht zB:

    ID   | Text       | operation |
    -------------------------------
    ID 1 | 10% Rabatt |   *0.9    |
    ID 2 | 5€ Rabatt  |   -5      |

    PHP:

    $id_rabat = $_POST['id_rabat'];

    $query = "SELECT operation FROM db_Rabatt WHERE ID = $id_rabat";
    $result = mysql_query($query);
    while($row = mysql_fetch_object($result))
    {

    $preis  = (50 "$row->operation" * 1.19 )
    echo 'preis incl. Mwst = '.$preis.' €';
    }

    Das funktioniert so leider nicht, wenn ich den operator (+ und *)
    mit in die Datenbank schreibe un ich muß mit if- abfragen
    rumbasteln.

    1. Hallo,

      was passiert eigentlich wenn ich an die Seite mit der Berechnung des Preises eine von mir frei gewählte/erfundene ID poste?

      mfg, roebert

      --
      Please do not confuse what we say with what we think we are saying.
      (^_^)
      Eternity is a very long time, especially towards the end.
      1. Hallo,

        was passiert eigentlich wenn ich an die Seite mit der Berechnung des Preises eine von mir frei gewählte/erfundene ID poste?

        Dann gibt es natürlich einen Supersonderpreis für Programmierer.

        mfg, roebert

    2. echo $begrüßung;

      es geht mir darum Datenbankabfragen ausführbar abzufragen.

      Dabei tritt ein Kontextwechsel auf. In der Datenbank stehen nur Werte. Du möchtest das als Code interpretieren, bzw. diesen Wert in eine Code-Umgebung einfügen. Kontextwechsel treten beim Programmieren immer wieder auf. Versuche solche Kontextwechsel bewusst wahrzunehmen.

      $id_rabat = $_POST['id_rabat'];

      Unnötiges Umkopieren. $_POST['id_rabat'] ist bereits eine Variable, noch eine andere daraus zu machen ist nicht notwendig.

      $query = "SELECT operation FROM db_Rabatt WHERE ID = $id_rabat";

      Wieder Kontext-Wechsel beachten! Du bringst hier eine Benutzereingabe in einen neuen Kontext, behandelst den Wert aber nicht so wie es der Kontext verlangt. Solange nur Zahlen übergeben werden, stellt das kein Problem dar. Doch schon bei Vertippern kannst du auf die Nase fallen, ganz zu schweigen von absichtlichen Query-Manipulationen.

      In deinem Fall kommt noch hinzu, dass es sich um einen Zahlenwert handeln soll. Du kannst das zum einen mit intval() sicherstellen,

      $query = "SELECT operation FROM db_Rabatt WHERE ID = " . intval($_POST['id_rabat']);

      oder andererseits mit der für alle Werte gültigen Art und Weise erledigen:

      $query = sprintf("SELECT operation FROM db_Rabatt WHERE ID = '%s'",
          mysql_real_escape_string($_POST['id_rabat']));

      MySQL ist es egal, ob es einen Zahlenwert als String oder als Zahl übergeben bekommt - ein SQL-Statement ist sowieso immer Text, der geparst werden muss - weswegen man auch Zahlenwerte in Stringbegrenzerzeichen setzen kann.

      $result = mysql_query($query);
      while($row = mysql_fetch_object($result))
      $preis  = (50 "$row->operation" * 1.19 )

      Überleg doch mal was passiert. Du bekommst von deiner Abfrage einen Text-Wert zurück. Nun möchtest du, dass dieser Text als Code interpretiert wird. PHP ist kein Hellseher. Es kann nicht erraten, dass der Wert in deinem Fall als auszuführender Code angesehen werden soll, in anderen (den meisten) Fällen aber beispielweise mit anderen Werten per Stringverknüpfung verarbeitet werden soll. Du musst also dem PHP beibringen, deinen Textstring als Code zu interpretieren, ihn zu evaluieren.

      Allerdings gefallen mir Lösungen mit eval() nicht. eval() hat zu viel Schadenspotenzial, wenn man es nicht gut abgesichert anwendet. Da du nicht weißt, wer deinen in der Datenbank gespeicherten Code alles ändern kann (absichtlich oder aus Versehen), musst du entweder quasi blind darauf vertrauen, oder alles vor der Ausführung prüfen. Dann kannst du auch gleich eine Lösung ohne Code(teile) in der DB implementieren, denn der Prüfungsaufwand ist sicher nicht grad ohne.

      Wieviele Möglichkeiten gibt es eigentlich, einen Rabatt einzuräumen?

      • Multiplikation (* 0.9)
      • Addition (+ (-5))
      • noch mehr?

      Wie wäre es, wenn du für beide Methoden bzw. für beide Werte jeweils eine Spalte verwendest? Dann kannst du die Formel im PHP-Code fest implementieren und hast nur die beiden Werte, die du als Variable einsetzt.

      echo "$verabschiedung $name";

    3. Mahlzeit,

      Soweit leuchten mir eure Antworten ein.

      Ich hätte da noch etwas. Einerseits würde ich dedlfix' Vorschlag bezüglich des Trennens von Operation und Wert für die Rabattberechnung unterstützen, indem du die Rabatttabelle z.B. folgendermaßen gestaltest:

      ID | Text       | relativ | absolut |
      -------------------------------------
       1 | 10% Rabatt |   0.9   |    0    |
       2 | 5€ Rabatt  |   1     |   -5    |

      (mit den Default-Werten 1 für die Spalte "relativ" und 0 für die Spalte "absolut")

      Dann würde mich weiter interessieren, ob du immer den gleichen Preis hast? Wenn nicht, und wenn dieser auch aus der Datenbank kommt - was spricht dagegen, den Preis inklusiv Rabatt gleich in der Datenbank ausrechnen zu lassen?

      Wenn du z.B. folgende Preistabelle hast

      ID | Text  | Preis | Rabatt_ID
      ------------------------------
       1 | Bla   | 47.11 | 2
       2 | Blubb |  8.15 |
       3 | Fasel | 42.00 | 1

      sollte eine Abfrage wie z.B.

      SELECT CASE WHEN P.Rabatt_ID IS NULL
                  THEN P.Preis
                  ELSE ((P.Preis * R.relativ) + R.absolut)
              END AS Preis_inkl_Rabatt
        FROM db_Preis P
        LEFT JOIN db_Rabatt R ON P.Rabatt_ID = R.ID

      dir eigentlich direkt den Preis inkl. Rabatt liefern können.

      MfG,
      EKKi