Script aus Datenbank einbinden
Phil
- php
1 Roebert Stump0 Phil
0 Tom0 Phil
0 Phil0 Roebert Stump1 Phil
1 dedlfix0 EKKi
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!
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
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.
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
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
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
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
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.
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
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
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?
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";
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