tafkat: nl2br() - str_replace() Problem

Servus.. ich hab da mal ne kleine sorge und wohl nen denkfehler wie ich glaube..

Arbeite zzt. an ner Option zum Editieren von Beiträgen die in der DB liegen..

Eingetragen wird:
$text = nl2br($text);

Soweit so gut.. .  in der DB steht der Text eben immer mit nem <br /> für den Zeilenumbruch..

Jetzt versuch ich jedoch den Text erneut in die Textarea zu laden mit:
$text = str_replace("<br />","n",$text);

jedoch hab ich nun aber statt einem gleich ZWEI Zeilenumbrüche.. .

Woran kann das liegen bzw. was müsste ich ggf. ändern ?

  1. Hallo,
    nl2br() ersetzt keine Zeilenumbrüche sondern ergänzt diese diese um <br />. Das \n (\r, \r\n) bleibt weiterhin erhalten.

    Allerdings ist es nicht schön, beim Abspeichern diese Veränderungen vorzunehmen, normalerweise macht man dieses erst bei der Ausgabe.

    Grüße
    Andavos

    1. Das würde bedeuten das ich MIT nl2br() in die Datenbank schreibe jedoch beim auslesen das str_replace() entfallen lass ?

      Hab das eben ausprobiert aber so wie ich das wollt haut das immer noch nicht hin.

      1. Hallom

        Das würde bedeuten das ich MIT nl2br() in die Datenbank schreibe jedoch beim auslesen das str_replace() entfallen lass ?

        nein, es bedeutet, dass du den String in die Datenbank schreibst, *ohne* ihn vorher zu verstümmeln (kontextspezifische Codierung, hier z.B. mit mysql_real_escape_string() natürlich ausgenommen), sondern dass du ihn erst beim Auslesen wieder für den jeweiligen Ausgabekontext aufbereitest.

        So long,
         Martin

        --
        Die neue E-Mailadresse des Papstes: urbi@orbi
        1. nein, es bedeutet, dass du den String in die Datenbank schreibst, *ohne* ihn vorher zu verstümmeln (kontextspezifische Codierung, hier z.B. mit mysql_real_escape_string() natürlich ausgenommen), sondern dass du ihn erst beim Auslesen wieder für den jeweiligen Ausgabekontext aufbereitest.

          Ähm.
          Du setzt hier eine DB voraus, die gar nicht angegeben war.
          Was, wenn es sich um Zeilen orientierte Datensätze handelt? Aus den Zeiten der langen Fussmärsche durchaus noch bekannte Praxis...

          mfg Beat

          --
          Selber klauen ist schöner!
          1. Versteh immo leider nur Bahnhof.. .
            Ist ne MySQL DB und das Feld hat den 'TEXT' Attribut.. .
            Also soweit kein Problem.

            Zusammenfassung: (Vereinfacht)

            Abspeichern des Textes in DB:
            $text = $_POST['text'];
            INSERT INTO .... (text, ...) VALUES ('$text', ...)

            Auslesen des Textes in Textarea:
            $text = $row['text'];
            $text = str_replace('<br />',' ',$text)

            Und nüx geht... . :S
            Werd nicht mal aus Tutorials schlau gerade

            1. hi,

              Zusammenfassung: (Vereinfacht)

              Abspeichern des Textes in DB:
              $text = $_POST['text'];
              INSERT INTO .... (text, ...) VALUES ('$text', ...)

              Nein, in deinem ersten Posting schriebst du

              Eingetragen wird:
              $text = nl2br($text);

              Darauf hin hatte dir Der Martin das für dich relevante Schlüsselwort genannt, mysql_real_escape_string().

              Auslesen des Textes in Textarea:
              $text = $row['text'];
              $text = str_replace('<br />',' ',$text)

              Und nüx geht... . :S
              Werd nicht mal aus Tutorials schlau gerade

              Wie schon von allen Vorpostern erwähnt, speichere die Daten von anfang an richtig ab, dann hast du auch keine folge Probleme.

              Bei der Ausgabe kannst du dann wieder mit nl2br arbeiten.

              grüße

            2. Hello,

              Versteh immo leider nur Bahnhof.. .
              Ist ne MySQL DB und das Feld hat den 'TEXT' Attribut.. .
              Also soweit kein Problem.

              Sprechweise: Die Spalte hat den Spaltentyp 'Text' :-)
              Zum Wegschreiben von Texten oder auch Bildern in den Datensatz über die SQL-Schnittstelle (= Textschnittstelle) müssen die Daten vorher "escaped" werden. Jedes DBMS hat dafür andere Vorschriften.

              Bei MySQL sind es die Zeichen   NUL, LF, CR, ", ', , SUB

              die in der Schnittstelle Sonnderbedeutung haben, und daher vor der Übergabe an diese "entschärft" werden müssen. Sonst kann die Schnittstelle die Daten nicht sauber an die DB übergeben.

              http://dev.mysql.com/doc/refman/5.0/en/mysql-real-escape-string.html
              http://de2.php.net/manual/en/function.mysql-real-escape-string.php
              http://de.wikipedia.org/wiki/Steuerzeichen

              Wenn man mit einem Blockpuffer arbeitet (Prepared Statements), ist diese Behandluhng nicht notwendig, da das System dann ja weiß, welches der Speicherbereich der Daten-Variable ist.

              In der Datenbank stehen dann in beiden Fällen nur die reinen Daten. Das Escaping wird von der Schnittstelle beim Eintragen in den Buffer wieder entfernt.

              Ein harzliches Glückauf

              Tom vom Berg

              --
              Nur selber lernen macht schlau
              http://bergpost.annerschbarrich.de
          2. echo $begrüßung;

            Du setzt hier eine DB voraus, die gar nicht angegeben war.

            "DB" stand im Ausgangsposting. Das steht im Allgemeinen für eine Datenbank.

            Was, wenn es sich um Zeilen orientierte Datensätze handelt?

            Auch dann wäre eine Behandlung der Daten für einen ganz anderen Kontext unangebracht. Bei zeilenorientierter Datenhaltung wäre eher ein \n empfehlenswert.

            echo "$verabschiedung $name";

          3. Hallo,

            Du setzt hier eine DB voraus, die gar nicht angegeben war.
            Was, wenn es sich um Zeilen orientierte Datensätze handelt? Aus den Zeiten der langen Fussmärsche durchaus noch bekannte Praxis...

            Ergänzent zum Post von deflfix noch zu sagen, dass dann nl2br() nichts bringen würde, da Zeilenumbrüche _nicht_ ersetzt sondern um <br /> ergänzt werden. Zumindest ist die Funktion absolut nutzlos, wenn man z.B. eine Text-Datei hat und pro Zeile 1 Eintrag stehen sollte.

            MFG
            Andavos

  2. Hi,

    Arbeite zzt. an ner Option zum Editieren von Beiträgen die in der DB liegen..

    Eingetragen wird:
    $text = nl2br($text);

    Soweit so gut.. .  in der DB steht der Text eben immer mit nem <br /> für den Zeilenumbruch..

    was eben nicht so gut ist - Du solltest den Text unverfälscht speichern, was solche Folgeprobleme  vermeidet.

    Jetzt versuch ich jedoch den Text erneut in die Textarea zu laden mit:
    $text = str_replace("<br />","n",$text);

    jedoch hab ich nun aber statt einem gleich ZWEI Zeilenumbrüche.. .

    logisch. Die Funktion nl2br() fügt lediglich ein <br /> *hinzu* - mache diesen Unsinn ungeschehen und gut ist. Für's erste also: str_replace('<br />','',$text);

    freundliche Grüße
    Ingo