Script aus DB
Andy A.
- php
0 Benjamin Kühn0 Norbert0 Tom
Hi,
wie stelle ich es am besten an, dass ich ein PHP-Script aus einer Datenbank holen kann und ausführen?
Andy
Hi,
also die Beschreibung finde ich etwas sehr knapp, oder? Was genau willst du denn erreichen? Warum willst du überhaupt ein PHP-Script in eine DB schreiben?
Gruß
Ben
Hi Andy,
rein IMHO ist das zwar Unfug/Bloedsinn, aber es geht:
1. Script ganz normal auslesen und mit exec(); ausfuehren lassen, was viele boese Ueberraschungen geben kann.
2. Script ganz normal auslesen und in eine temporaere Datei schreiben.
2.1. Datei ganz normal includen
2.2. Datei via http://.../tempfile.php ausfuehren lassen.
Gruss
Norbert
Hello,
wie stelle ich es am besten an, dass ich ein PHP-Script aus einer Datenbank holen kann und ausführen?
$sql = "Select show_function from object where object_type = 'atomium'";
$res = mysql_query($sql,$con);
if (!$res)
{
echo "Keine Anzeigefunktion vorhanden";
}
else
{
$_rec = mysql_fetch_asscoc($res);
eval($_rec['show_function']); ## hier ist Verbesserungsbedarf
}
Du musst dabei bedenken, dass eval() die Statements an die Stelle im Script stellt, an der es aufgerufen wurde. Das kann im einfachen Modell von PHP < 5 zu konflikten im Namensraum kommen. Auch wenn Du in der DB "echte Funktionsdefinitionen" stehen hast und lädst die innerhalb eines Scriptes auf diese Weise ein zweites Mal, bekommst Du einen Redefine-Error.
Den namensraumkonflikt kann man abfangen, indem man das eval() grundsätzlich nicht in der obersten Ebene des Scriptes, sondern in einer eigenen Funktion aufruft, der man dann nur diejenigen Variablen durchreicht, die gelesen oder geändert werden dürfen. Andere Variablen, die man dann innerhalb der "Funktion aus der DB" definiert oder verändert, haben dann keinen Einfluss mehr auf das übrige Script.
Sollte Fabian hier mitlesen, hat er gleich die Aufgabenstellung für unser eigenes CMS.
Das größte Problem liegt also noch in der Definietion von Funktionen innerhalb des Datensatzes.
Noch ein paar Worte zu "rein IMHO ist das zwar Unfug/Bloedsinn,..."
Dieses Verfahren mit objektorientiertem Code zu arbeiten ist gerade bei größeren Projekten keinesfalls Blödsinn. Wenn man sich vorstellt, dass es mehrere hundert Objektklassen mit jeweils einer eigenen Anzeigefunktion (oder was auch immer die machen soll) gibt, und man die mehrere zehntasusend klassifizierte Objetke in einer Tabelle gespeichet hat, dann ist es ein Klacks für die DBE, über eine Relation zur Objektklasse auch die passende Anzeigefunktion zu beschaffen. Man hat dann vielleicht 10 Objekte (von mehreren 10.000) aus z.B. drei Klassen. Warum sollte ich also die anderen 497 Anzeigefunktionen auch bereitstellen, oder erst im Script wesentlich zeitaufwändiger einzelne Includes oder Reads auslösen, die nun die Funktionen dazuladen?
Problem auch hier, das noch zu lösen ist: Redundanz der zugeladenen Funktionen. Vielleicht könnte da ein SQL-DB-Künstler mal helfen, wie man die unterdrücken kann?
Liebe Grüße aus http://www.braunschweig.de
Tom