Sacha: Apostrophe in MySQL-Tabelle

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

  1. 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..

    1. 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

      --
      Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
      Nur selber lernen macht schlau
  2. 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

    1. 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

    2. 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

      --
      Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
      Nur selber lernen macht schlau
      1. 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

        1. 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 />";

          Die Variable ($_) muss maskiert werden, da sie ja erst zur Ausführungszeit mit eval() ersetzt werden soll durch den dann geltenden Wert.

          $upd_string = mysql_escape_string($string);

          An die MySQL-Schnittstelle muss ein escaped String übergeben werden

          ...

          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'];

          in $string sollte jetzt ++echo '<a href="' . basename($_SERVER['PHP_SELF']) . '?id=1">News</a><br />++ drinstehen. (++ sind meine Hilfshäkchen für die Darstellung)

          das lassen wir uns jetzt mal ausgeben zur Kontrolle:

          echo nl2br(htmlentities($string))."<br />\n";

          und dann mit eval ins Script holen und ausführen:

          eval ($string);
          }

          Harzliche Grüße aus http://www.annerschbarrich.de

          Tom

          --
          Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
          Nur selber lernen macht schlau
          1. 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

            --
            Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
            Nur selber lernen macht schlau
            1. 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

              1. 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

                --
                Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
                Nur selber lernen macht schlau
                1. 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

                  1. 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

                    --
                    Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
                    Nur selber lernen macht schlau
                    1. 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

                      1. 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

                        --
                        Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
                        Nur selber lernen macht schlau
                        1. 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

                          --
                          Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
                          Nur selber lernen macht schlau
                        2. 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

                          1. 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

                            --
                            Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
                            Nur selber lernen macht schlau
                            1. 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 ;-)

                              1. 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

                                --
                                Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
                                Nur selber lernen macht schlau
                                1. 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.

              2. 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);

                bitte username und Passwort anpassen:

                $con = mysql_connect('localhost','thomas','thomas') or die('keine Serververbindung möglich');

                bitte Datenbankname anpassen:

                $db =  mysql_select_db('thomass',$con) or die('kann Datenbank nicht öffnen');

                hier werden die Funktionen definiert

                $string = "echo '<a href=\"'.basename($_SERVER['PHP_SELF']).'?id=1\">News</a><br />';";

                echo "String: ".nl2br(htmlentities($string))."<br />\n";

                Die Variable ($_) muss maskiert werden, da sie ja erst zur Ausführungszeit mit eval() ersetzt werden soll durch den dann geltenden Wert.

                Die " müssen doppelt maskiert werden, da ja der Backslash auch in die Datenbank soll

                $upd_string = mysql_escape_string($string);

                echo "escaped String: ".nl2br(htmlentities($upd_string))."<br />\n";

                An die MySQL-Schnittstelle muss ein escaped String übergeben werden

                $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'];

                in $string sollte jetzt ++echo '<a href="' . basename($_SERVER['PHP_SELF']) . '?id=1">News</a><br />++ drinstehen. (++ sind meine Hilfshäkchen für die Darstellung)

                das lassen wir uns jetzt mal ausgeben zur Kontrolle:

                echo "String aus DB: ".nl2br(htmlentities($string))."<br />\n";

                und dann mit eval ins Script holen und ausführen:

                eval ($string);
                  echo nl2br(htmlentities($php_errormsg));
                }

                ?>

                Viel Spass noch

                Harzliche Grüße aus http://www.annerschbarrich.de

                Tom

                --
                Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
                Nur selber lernen macht schlau
      2. 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

        --
        Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
        Nur selber lernen macht schlau