Thomas: Eine Funktion und ihre Eigenart bzw. Zeilenumbrüche in PHP

Hallo!

Ich habe eine Skript, das mathematische Formeln durch eine bestimmte Syntax in Bilder umwandeln, die das ganze mathematisch korrekt darstellen. Um die Darstellung jedoch dynamisch zu machen, habe ich Inhalte in einer MySQL-DB gespeichert. Das Skript setzt allerdings voraus, dass der Befehl für eine Darstellung von einer Formel zu Beginn einer Zeile beginnt.
Das heißt, so funktioniert es:

$text = "Beispiel für einen Text, der
auch fed-Formeln enthält:
\fedsum(j,j=1,n)=(n*(n+1))/2 +a_1
-Ende";

$text = mpmsgtransform($text,0,0,0);

Bei der Ausgabe des Textes ist alles ok, die 3. Zeile wird in ein Bild umgewandelt.

Das ganze verhält sich bei der Ausgabe aus MySQL nicht so. Obwohl ich auch in MySQL Zeilenumbrüche eingefügt habe (und bei der Ausgabe mit nl2br() mit Zeilenumbrüche dargestellt werden) funktioniert das Skript nicht. Denn ohne nl2br() wird der Text in einer Zeile ausgegeben. Da stellt sich für mich die Frage, woran das liegt. Warum wird bei einer Variable mit Zeilenumbruch (aber ohne <br>!!) die Formel korrekt dargestellt und bei einer Ausgabe aus MySQL nicht?? Für eure Hilfe wäre ich sehr dankbar!!

  1. Hello,

    das kommt darauf an, was wirklich in der MySQL-Datei drinsteht.
    Wie sind denn die Datensätze mit Zeilenumbruch dort hineingekommen?

    Der Fehler liegt meistens am verkehrten und /oder doppelten Escaping vor dem Eintrag, oder aber beim überflüssigen stripslashes nach dem Wiederholen der Daten.

    Es ist ein Unterschied, ob '\n' (5C 6E) oder "\n" (0A) in die Datenbank eingetragen wird.

    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 :-)

  2. Lieber Thomas,

    \fedsum(j,j=1,n)=(n*(n+1))/2 +a_1

    ^^
    Du hast hier einen Backslash. Das kann beim Abspeichern in der DB ein Riesenproblem geben, wenn Du ihm nicht mindestens einen weiteren Backslash voranstellst.

    Aus \f wird beim Speichern in der DB ein Steuerzeichen, das (weil es wahrscheinlich nicht existiert) ignoriert wird. Damit ist der Teil "\f" aus Deinem String wahrscheinlich nicht in der DB enthalten.

    "\f" wird für die DB zu "\f", da der Backslash an sich escaped wird und somit die Kombination zu etwas ähnlichem wie "\ f" wird, wenn auch ohne das Leerzeichen dazwischen.

    Ob es nun reicht, einfach einen weiteren Backslash davorzustellen, weiß ich nicht, da beim Auslesen aus der DB wiederum ein Umwandeln geschieht, welches aus "\f" ein Steuerzeichen machen könnte... Also bräuchtest Du "\\f", wenn Du Deinen String in die DB ablegst, damit beim Wiedereinlesen auch "\f" in Deiner Stringvariablen ankommt.

    LÖSUNG: Probiere einmal die Funktion addcslashes() auf Deinen String anzuwenden, bevor Du ihn in der DB ablegst!

    Liebe Grüße aus Ellwangen,

    Felix Riesterer.

    --
    ie:% br:> fl:| va:) ls:[ fo:) rl:° n4:? de:> ss:| ch:? js:) mo:} zu:)
    1. Hi,

      LÖSUNG: Probiere einmal die Funktion addcslashes() auf Deinen String anzuwenden, bevor Du ihn in der DB ablegst!

      Wäre es nicht besser mysql_real_escape_string() zu verwenden?

      mfG,
      steckl

    2. Hello,

      Du hast hier einen Backslash. Das kann beim Abspeichern in der DB ein Riesenproblem geben, wenn Du ihm nicht mindestens einen weiteren Backslash voranstellst.

      Du warst zwar auf dem richtigen Weg, aber leider in die verkehrte Richtung.

      Es muss sichergestellt werden, dass der Originalstring NICHT mit addslashes() oder addcshlases() verschandelt wurde und dann mysql_real_escape_string() verwendet werden.

      Wie man den Originalstring in PHP erzeugt, ist eine andere Baustelle.

      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. Lieber Tom,

        Du warst zwar auf dem richtigen Weg, aber leider in die verkehrte Richtung.
        [...]mysql_real_escape_string()

        ich habe noch nie mit MySQL gearbeitet, daher hatte ich nur eine ungefähre Ahnung. Aber Deine Korrektur war sicherlich hilfreich - vermute ich. Danke!

        Liebe Grüße aus Ellwangen,

        Felix Riesterer.

        --
        ie:% br:> fl:| va:) ls:[ fo:) rl:° n4:? de:> ss:| ch:? js:) mo:} zu:)
        1. Hello Felix,

          Du warst zwar auf dem richtigen Weg (Richtung), aber leider mit verkehrter Orientierung. ;-)

          [...]mysql_real_escape_string()

          ich habe noch nie mit MySQL gearbeitet, daher hatte ich nur eine ungefähre Ahnung. Aber Deine Korrektur war sicherlich hilfreich - vermute ich. Danke!

          Ich hoffe, dass es Thomas hilft und das der Fehler war.
          Deine Überlegung ist deshalb nicht überflüssig.
          Allerdings sollte die SQL-Schittstelle "Sonderzeichen", die für sie keine sind, vollkommen transparent weiterreichen.

          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 :-)