Apostrophe in MySQL-Tabelle
Sacha
- php
Hallo zusammen
Ich habe vor, ein kleines Templatesystem für meine private Website zu schreiben. Dabei bin ich jedoch auf ein Problem gestossen, bei dessen Lösung mir hier hoffentlich jemand behilflich sein kann.
Ich habe folgenden Code in einer Zelle der MySQL-Tabelle:
<a href="' . basename($_SERVER['PHP_SELF']) . '?id=1">News</a><br />
<a href="' . basename($_SERVER['PHP_SELF']) . '?id=2">Newsarchiv</a>
In meiner PHP-Datei steht folgendes (in $value befindet sich der obige Text, ausgelesen in einer mysql_fetch_assoc-Schleife):
eval('$value = "$value";');
Nur leider wird der Code nicht richtig interpretiert, genauer gesagt gar nicht. Im Quelltext steht immer noch der PHP-Code:
<a href="' . basename($_SERVER['PHP_SELF']) . '?id=1">News</a><br />
<a href="' . basename($_SERVER['PHP_SELF']) . '?id=2">Newsarchiv</a>
Kann mir jemand sagen, wo der Fehler liegt? Habe ich irgendeine Denkblockade oder gibt es grundsätzlich Probleme beim Verwenden von Apostrophen in MySQL? Wäre super, wenn mir hier jemand helfen könnte! :-)
Freundliche Grüsse
Sacha
Also was ich dir raten würde!
pack alles Source ausser DB raus und bau das extern da rum.
also so würd ichs machen..
Hello,
pack alles Source ausser DB raus und bau das extern da rum.
Das ist nicht wirklich ein guter Rat.
Ein modulares System kann man sehr wohl mit einer Datenbank aufbauen.
Da kann man dann nämlich sehr schnell den Funktionssatz zusammenstellen, den man benötigt und muss seine LIBs nicht mit Funktionen überladen (im Sinne von zu voll packen), die man für das momentane Script gar nicht benötigt.
Man muss nur darauf achten, dass man keinen function-redefine-error bekommt.
Und sinnvollerweise sollte man die DB auch durchnormalisieren, dann kann es einen solchen Fehler ja gar nicht erst geben.
Außerdem könnte man auch einen Errorhandler für "unknown function" aufbauen, und erstmal versuchen, diese nachzuladen. Aber das wird jezt zu kompliziert...
Harzliche Grüße aus http://www.annerschbarrich.de
Tom
Moin!
Ich habe folgenden Code in einer Zelle der MySQL-Tabelle:
Ist das reiner Text, den du da bekommst?
<a href="' . basename($_SERVER['PHP_SELF']) . '?id=1">News</a><br />
<a href="' . basename($_SERVER['PHP_SELF']) . '?id=2">Newsarchiv</a>
Ist das PHP-Code? Wo sind die PHP-Codebegrenzer? <?php ... ?>
Nur leider wird der Code nicht richtig interpretiert, genauer gesagt gar nicht. Im Quelltext steht immer noch der PHP-Code:
Ohne Codebegrenzer kein PHP-Eval. Da wird nur HTML angenommen, und HTML kennt bekanntlich keine Funktionen.
- Sven Rautenberg
Hallo Sven
Ist das reiner Text, den du da bekommst?
Ja.
Ist das PHP-Code? Wo sind die PHP-Codebegrenzer? <?php ... ?>
Die braucht man meines Wissens nicht. Mit diesen Angaben funktioniert es nämlich auch ohne <?php/?>:
<a href="" . $_SERVER['PHP_SELF'] . "?id=1">News</a><br />
<a href="" . $_SERVER['PHP_SELF'] . "?id=2">Newsarchiv</a>
eval("$value = "$value";");
Nur wollte ich das ganze jetzt eben mit Apostrophen machen anstatt mit maskierten Gänsefüsschen.
Ohne Codebegrenzer kein PHP-Eval. Da wird nur HTML angenommen, und HTML kennt bekanntlich keine Funktionen.
Ich hab's mal ausprobiert, die Tabellenzelle um "<?php" am Anfang und "?>" am Ende ergänzt - genützt hat's leider auch nichts.
Danke schonmal für eure Hilfe! :-)
Sacha
Hello,
Ich habe folgenden Code in einer Zelle der MySQL-Tabelle:
Ist das reiner Text, den du da bekommst?
<a href="' . basename($_SERVER['PHP_SELF']) . '?id=1">News</a><br />
<a href="' . basename($_SERVER['PHP_SELF']) . '?id=2">Newsarchiv</a>Ist das PHP-Code? Wo sind die PHP-Codebegrenzer? <?php ... ?>
Nur leider wird der Code nicht richtig interpretiert, genauer gesagt gar nicht. Im Quelltext steht immer noch der PHP-Code:
Ohne Codebegrenzer kein PHP-Eval. Da wird nur HTML angenommen, und HTML kennt bekanntlich keine Funktionen.
Nicht ganz richtig aber fast falsch *gg*
Bei eval() stellet man sich am besten vor, dass man den Code, so wie er da steht, ins Script schreibt. Eval() macht nämlich nichts anderes mit Strings als include() mit Dateien.
Wenn da also was passieren soll, dann wäre ein 'echo' vor den beiden Zeilen ganz sinnvoll. Und dann sieht man auch, wo noch Häkchen und die Escapezeichen für Häkchen fehlen...
Harzliche Grüße aus http://www.annerschbarrich.de
Tom
Hallo Tom
Bei eval() stellet man sich am besten vor, dass man den Code, so wie er da steht, ins Script schreibt. Eval() macht nämlich nichts anderes mit Strings als include() mit Dateien.
Wenn da also was passieren soll, dann wäre ein 'echo' vor den beiden Zeilen ganz sinnvoll. Und dann sieht man auch, wo noch Häkchen und die Escapezeichen für Häkchen fehlen...
Folgendes hat, sowohl mit als auch ohne <?php/?> nicht funktioniert:
echo '<a href="' . basename($_SERVER['PHP_SELF']) . '?id=1">News</a><br />
<a href="' . basename($_SERVER['PHP_SELF']) . '?id=2">Newsarchiv</a>';
Allerdings wundere ich mich, warum man den echo-Befehl verwenden muss; wenn man Gänsefüsschen verwendet, braucht man ihn doch auch nicht?
(Wie gesagt, folgender Code funktioniert wunderbar:
<a href="" . $_SERVER['PHP_SELF'] . "?id=1">News</a><br />
<a href="" . $_SERVER['PHP_SELF'] . "?id=2">Newsarchiv</a>
eval("$value = "$value";");)
Tut mir leid, dass ich so oft nachfragen muss, aber irgendwie komme ich einfach auf keinen grünen Zweig.
Liebe Grüsse
Sacha
Hello,
Bei eval() stellet man sich am besten vor, dass man den Code, so wie er da steht, ins Script schreibt. Eval() macht nämlich nichts anderes mit Strings als include() mit Dateien.
$string = "echo '<a href="' . basename($_SERVER['PHP_SELF']) . '?id=1">News</a><br />";
$upd_string = mysql_escape_string($string);
...
insert into table set dyn_func = $upd_string;
...
$sql = "select from table where ID = ".lastinsertid();
$res = mysql_query($sql,$con);
if($res)
{
$_rec = mysql_fetch_assoc($res);
$string = $_rec['dyn_func'];
echo nl2br(htmlentities($string))."<br />\n";
eval ($string);
}
Harzliche Grüße aus http://www.annerschbarrich.de
Tom
Hello,
$string = "echo '<a href="' . basename($_SERVER['PHP_SELF']) . '?id=1">News</a><br />";
kann sogar sein, dass es
$string = "echo '<a href=\"' . basename($_SERVER['PHP_SELF']) . '?id=1\">News</a><br />'";
heißen muss, da ja im Echo-String nachher noch
echo '<a href="' . basename($_SERVER['PHP_SELF']) . '?id=1">News</a><br />';
drinstehen soll.
der erste Backslash (vor \ und vor ") wird bereits bei der Zuweisung entfernt.
Harzliche Grüße aus http://www.annerschbarrich.de
Tom
Hallo Tom
Vielen Dank für deine Mühe, aber irgendwie scheine ich mich unklar ausgedrückt zu haben.
Nochmal: Dieser Code funktioniert perfekt:
<a href="" . $_SERVER['PHP_SELF'] . "?id=1">News</a><br />
<a href="" . $_SERVER['PHP_SELF'] . "?id=2">Newsarchiv</a>
eval("$value = "$value";");)
Ich wollte jetzt lediglich die " nicht mehr da drin haben und stattdessen alles mit Apostrophen (') machen. Warum man da jetzt plötzlich noch zusätzlich $string = "echo '...'" in die Datenbank einfügen muss, ist mir schleierhaft. Des Weiteren habe ich Respekt vor deinem offensichtlich recht grossen Fachwissen, würde mich aber freuen, wenn deine Erklärungen etwas anfängerfreundlicher wären.
Ich habe jetzt versucht, die Dinge, die ich verstanden habe, umzusetzen. Leider alles ohne Erfolg. Geht das denn wirklich nicht so einfach, muss man wegen eines simplen Umsteigens von doppelten auf einfache Anführungszeichen solche grossen Änderungen vornehmen? Wenn dem nämlich wirklich so sein sollte und ich mich wirklich dermassen intensiv mit der Materie befassen müsste, dann verwende ich eigentlich lieber wieder normale Gänsefüssche, mit denen keinerlei Probleme auftraten.
Grüsse
Sacha
Hello,
Nochmal: Dieser Code funktioniert perfekt:
Sorry, das verstehe ich jetzt nicht.
Was passiert denn mit dem Code? Der kann ja nicht einfach irgendwie in der Luft hängen?
Steht der so in einer HTML-Datei oder in enem PHP-Abschnitt einer HTML-Datei oder wird der einer Variablen zugewiesen?
<a href="" . $_SERVER['PHP_SELF'] . "?id=1">News</a><br />
<a href="" . $_SERVER['PHP_SELF'] . "?id=2">Newsarchiv</a>eval("$value = "$value";");)
Woher kommt denn jetzt plötzlich $value?
Du hast hier allerdings eine Aufgabe gestellt, die mein MySQL auch nicht fressen will. Ich bekomme nämlich die Code-Zeile gar nicht erst in die Datenbank hinein. Irgendwas wird bemängelt, oder ich habe noch eine falsche Einstellung bezüglich der Escaperei von ' .
Ich suche noch danach, aber ich muss auch gleich weg. Kann also Abend werden, bis ich mich wieder melde.
Harzliche Grüße aus http://www.annerschbarrich.de
Tom
Hallo Tom
Sorry, das verstehe ich jetzt nicht.
Was passiert denn mit dem Code? Der kann ja nicht einfach irgendwie in der Luft hängen?
Steht der so in einer HTML-Datei oder in enem PHP-Abschnitt einer HTML-Datei oder wird der einer Variablen zugewiesen?
Diese zwei Zeilen stehen so in der Datenbank:
<a href="" . $_SERVER['PHP_SELF'] . "?id=1">News</a><br />
<a href="" . $_SERVER['PHP_SELF'] . "?id=2">Newsarchiv</a>
Und diese Zeile steht im Quelltext, $value wird (wie im ersten Posting erwähnt) über mysql_fetch_assoc ermittelt - falls du den genauen Code brauchst, kann ich ihn dir gerne geben, allerdings tut er nichts zur Sache, deshalb habe ich ihn nicht gepostet.
Du hast hier allerdings eine Aufgabe gestellt, die mein MySQL auch nicht fressen will. Ich bekomme nämlich die Code-Zeile gar nicht erst in die Datenbank hinein. Irgendwas wird bemängelt, oder ich habe noch eine falsche Einstellung bezüglich der Escaperei von ' .
Du bekommst also die beiden obigen Zeilen mit phpMyAdmin nicht in deine Datenbank hinein? Das ist seltsam. Was erscheint denn da für eine Fehlermeldung?
Ich suche noch danach, aber ich muss auch gleich weg. Kann also Abend werden, bis ich mich wieder melde.
Kein Problem, ich habe Zeit. ;-)
Grüsse
Sacha
Hello,
Diese zwei Zeilen stehen so in der Datenbank:
<a href="" . $_SERVER['PHP_SELF'] . "?id=1">News</a><br />
<a href="" . $_SERVER['PHP_SELF'] . "?id=2">Newsarchiv</a>
Wenn jetzt in der DB stehen würde:
$value = '<a href="'.$_SERVER['PHP_SELF'].'?id=1">News</a><br />';
und Du diesen String dann evaluieren würdest
eval($feldinhalt);
dann würde es wohl funktionieren.
Und wenn Du
eval('$value='.$value);
schreiben würdest, dann könnte es vielleicht auch funktionieren.
Harzliche Grüße aus http://www.annerschbarrich.de
Tom
Guten Abend, Tom
Wenn jetzt in der DB stehen würde:
$value = '<a href="'.$_SERVER['PHP_SELF'].'?id=1">News</a><br />';
und Du diesen String dann evaluieren würdest
eval($feldinhalt);
dann würde es wohl funktionieren.
Nein, tut es nicht - leider. Er erscheint genau dieser PHP-Code, so, wie er in der Datenbank steht (also "$value = ...") im Quelltext der Seite.
Und wenn Du
eval('$value='.$value);
schreiben würdest, dann könnte es vielleicht auch funktionieren.
Auch das habe ich probiert - leider ebenfalls erfolglos. Die Hoffnung schwindet...
Grüsse
Sacha
Hello,
Wenn jetzt in der DB stehen würde:
$value = '<a href="'.$_SERVER['PHP_SELF'].'?id=1">News</a><br />';
und Du diesen String dann evaluieren würdest
eval($feldinhalt);
dann würde es wohl funktionieren.
Nein, tut es nicht - leider. Er erscheint genau dieser PHP-Code, so, wie er in der Datenbank steht (also "$value = ...") im Quelltext der Seite.
Und wenn Du
eval('$value='.$value);
schreiben würdest, dann könnte es vielleicht auch funktionieren.
Auch das habe ich probiert - leider ebenfalls erfolglos. Die Hoffnung schwindet...
Dann wird Dir nicht erspart bleiben, meinen ursprünglichen Lösungsvorschlag von https://forum.selfhtml.org/?t=88855&m=530193 selbst und und ganz zu durchdenken und auf Deine Bedürfnisse anzupassen.
Harzliche Grüße aus http://www.annerschbarrich.de
Tom
Hello,
ich habe mir gerade nochmals meine verglichbaren Lösungen angesehen und bin zu dem Schluss gekommen, dass Du bei der Fehlersuche einfach nicht strukturiert genug vorgehst, sondern Schritte auslässt.
In emeiner DB steht z.B.: (war die kürzeste Funktion, die ich in der DB habe)
$CSS = unserialize($item["STYLE"]);
echo "\n<div ".make_style_str($CSS["main"]).">";
if (strlen($item["HEADLINE"])>0)
{
echo "\n<p ".make_style_str($CSS["heading"]).">".$item["HEADLINE"]."</p>\n";
}
echo textfilter(nl2br(htmlentities($item["FREITEXT"])),$pagedata["ERSETZEN"])."</div>";
Und das wird dann wie gewünscht evaluiert.
Harzliche Grüße aus http://www.annerschbarrich.de
Tom
Hallo Tom
Dann wird Dir nicht erspart bleiben, meinen ursprünglichen Lösungsvorschlag von https://forum.selfhtml.org/?t=88855&m=530193 selbst und und ganz zu durchdenken und auf Deine Bedürfnisse anzupassen.
Alles, bloss das nicht! ;-) Sei mir nicht böse, aber so ein Crack bin ich nicht, dass ich mich damit auch nur ansatzweise erfolgreich befassen könnte. Auch dein anderes Posting löst bei mir nur grosse Bewunderung, keineswegs aber Verständnis des Codes aus.
Deshalb an dieser Stelle noch einmal herzlichen Dank für deine Mühe, aber ich denke, ich bin noch nicht weit genug, um mich mit derart komplexer Materie zu befassen.
Schönen Abend noch
Sacha
Hello,
Deshalb an dieser Stelle noch einmal herzlichen Dank für deine Mühe, aber ich denke, ich bin noch nicht weit genug, um mich mit derart komplexer Materie zu befassen.
Wer aufgibt, ist ein Feigling...
Harzliche Grüße aus http://www.annerschbarrich.de
Tom
Wer aufgibt, ist ein Feigling...
Nanana, du musst ja nicht gleich beleidigend werden. Es sind einfach noch zu viele Fragen offen, die du scheinbar entweder nicht fähig oder nicht willig bist, mir zu beantworten. Und da du der einzige zu sein scheinst, der sich mit der Materie genügend gut auskennt, habe ich eben Pech gehabt. (Übrigens habe ich auch schon bei Tutorials.de nachgefragt, dort konnte mir auch niemand helfen - das Problem scheint also doch nicht so simpel zu sein.)
Grüsse
Feigling ;-)
Hello,
Wer aufgibt, ist ein Feigling...
Nanana, du musst ja nicht gleich beleidigend werden.
Nun reiß Dich mal zusammen!
Du bist doch hier derjenige, der Forderungen stellt. Und wenn Du willst, dass man Dir hilft, dann musst Du Dich auch etwas bemühen, andere Meinungen auszuprobieren. Das habe ich bisher nicht so wirklich erkennen können. Du hast bisher nur stur Deine eigene Meinung vertreten.
Harzliche Grüße aus http://www.annerschbarrich.de
Tom
Du bist doch hier derjenige, der Forderungen stellt. Und wenn Du willst, dass man Dir hilft, dann musst Du Dich auch etwas bemühen, andere Meinungen auszuprobieren. Das habe ich bisher nicht so wirklich erkennen können. Du hast bisher nur stur Deine eigene Meinung vertreten.
Meinungen? Wer redet denn von Meinungen? Es ging meines Wissens lediglich um einen Informationsaustausch. Und nachdem ich dir mehrfach gesagt habe, dass ich deinen Ausführungen nicht folgen kann, ist es mir nun ganz einfach zu anstrengend, so weiterzumachen. Du kannst mich von mir aus faul nennen, aber ich bin kein Feigling. Damit hat sich die Diskussion für mich erleidgt.
Hello Sacha,
wahrscheinlich reden wir gerade aneinander vorbei, aber ich habe das jetzt bei mir so hingebastelt, dass es geht. Erläuterung kommt dann heute Abend.
Wenn Du testen willst:
Leg Dir eine Tabelle mit dem Namen DYNFUNC an mit den Feldern:
ID unsigned int primary autoincrement
FUNC text
Und hier der Code:
<?php ### dyn_func.php ###
error_reporting(E_ALL);
$con = mysql_connect('localhost','thomas','thomas') or die('keine Serververbindung möglich');
$db = mysql_select_db('thomass',$con) or die('kann Datenbank nicht öffnen');
$string = "echo '<a href=\"'.basename($_SERVER['PHP_SELF']).'?id=1\">News</a><br />';";
echo "String: ".nl2br(htmlentities($string))."<br />\n";
$upd_string = mysql_escape_string($string);
echo "escaped String: ".nl2br(htmlentities($upd_string))."<br />\n";
$sql = "insert into DYNFUNC set FUNC = '$upd_string'";
mysql_query($sql,$con) or die('kann insert nicht durchführen: '.htmlentities(mysql_error()));
$sql = "select FUNC from DYNFUNC where ID = ".mysql_insert_id();
$res = mysql_query($sql,$con) or die('kann Abfrage nicht durchführen: '.htmlentities(mysql_error()));
if($res)
{
$_rec = mysql_fetch_assoc($res);
$string = $_rec['FUNC'];
echo "String aus DB: ".nl2br(htmlentities($string))."<br />\n";
eval ($string);
echo nl2br(htmlentities($php_errormsg));
}
?>
Viel Spass noch
Harzliche Grüße aus http://www.annerschbarrich.de
Tom
Hello,
kleine Korrektur:
Bei eval() stellet man sich am besten vor, dass man den Code, so wie er da steht, direkt ins Script schreibt. Eval() macht nämlich im Prinzip nichts anderes mit Strings als include() mit Dateien.
Bei Include wird aber im Unterschied zu eval() der PHP-CODE vorher beendet ( ?> ) und nach dem Include wieder gestartet ( <?PHP )
Harzliche Grüße aus http://www.annerschbarrich.de
Tom