Jacob: vorformatierte Strings mit innerHtml

Hallo,

ich zerbreche mir hier den Kopf über ein Problem, was eigentlich sehr einfach seien sollte.

Kurz umrissen, ich habe eine Textarea, deren Inhalt in in meiner Datenbank speichre. Klickt man auf der Seite auf eine Liste, so wird der Text, der beim Abspeichern in der Textarea eingegeben worden ist zum jeweiligen Eintrag per innerHtml angezeigt. Hier jedoch versagt meine Formatierung und ich bekomme es nicht in den griff

			$beschreibung=$_POST["element_2"];  
			//$beschreibung= strip_tags($beschreibung);  
			//$beschreibung= htmlspecialchars($beschreibung);  
			$beschreibung= nl2br($beschreibung);  
			$beschreibung=str_replace("\r\n","",$beschreibung);

Hier wird der Inhalt der Textarea "aufbereitet und der Datenbank übergeben.

Ausgeben tue ich den Text per Javascript:

tmp2.innerHTML = "<h2>"+markdetails[i].name+"</h2><br>Datum: "+datum[2]+"."+datum[1]+"."+datum[0]+"<br><p>"+markdetails[i].beschreibung+"<br>Veranstaltungsort: "+markdetails[i].adresse+"<br>Link zum Veranstalter: "+markdetails[i].url+"</p><br>Eingetragen von "+markdetails[i].von;  
					

Sämtliche HTML-Formatierungen, die ich im JS-Teil direkt vornehme, funktionieren Problemlos, nur der Teil Beschreibung, welcher mindestens Zeilenumbrüche enthält, funktioniert nicht.

Hier ein Beispiel:
Ausgabe im Browser:

Inhalt im entsprechenden Feld in der Datenbank:
1<br />23<br />5<br />3<br />52<br />241
Textarea beim Eintragen:

  1. Hi,

    ich zerbreche mir hier den Kopf über ein Problem, was eigentlich sehr einfach seien sollte.

    es *ist* einfach, wenn man es nicht künstlich verkompliziert.

    Kurz umrissen, ich habe eine Textarea, deren Inhalt in in meiner Datenbank speichre.

    Okay, schau'mer mal.

      	$beschreibung=$\_POST["element\_2"];  
      	//$beschreibung= strip\_tags($beschreibung);  
      	//$beschreibung= htmlspecialchars($beschreibung);  
      	$beschreibung= nl2br($beschreibung);  
      	$beschreibung=str\_replace("\r\n","",$beschreibung);  
    

    Wozu hier nl2br()? Willst du <br>-Tags in die Datenbank schreiben? Nein, das willst du eigentlich nicht! Speichere die Daten möglichst neutral. Behalte die Zeilenumbrüche bei, wie du sie auch schon angeliefert bekommst. Gut dass du strip_tags() und htmlspecialchars() wenigstens wieder rausgenommen hast.
    Allerdings solltest du die Daten vor dem Eintragen unbedingt nach den Regeln deiner Datenbank maskieren. Bei mySQL wäre beispielsweise mysql_real_escape_string() dafür vorgesehen und geeignet.

    Ausgeben tue ich den Text per Javascript:
    tmp2.innerHTML = "<h2>"+markdetails[i].name+"</h2><br>Datum: "+datum[2]+"."+datum[1]+"."+datum[0]+"<br><p>"+markdetails[i].beschreibung+"<br>Veranstaltungsort: "+markdetails[i].adresse+"<br>Link zum Veranstalter: "+markdetails[i].url+"</p><br>Eingetragen von "+markdetails[i].von;

    Und wie kommen die Daten von der DB bis zum Javascript?

    Hier ein Beispiel:
    Ausgabe im Browser:

    Ja, die <br>-Tags, mit denen du den Text beim Eintragen verstümmelt hast, werden also exakt 1:1 wieder ausgegeben.

    Inhalt im entsprechenden Feld in der Datenbank:
    1<br />23<br />5<br />3<br />52<br />241

    Genau - da sind sie ja auch schon.

    Mir ist noch nicht klar, wie deine Daten von der DB wieder bis zum Browser kommen. Aber beim Eintragen machst du schon mal einen Kardinalfehler.

    So long,
     Martin

    --
    Soziologen sind nützlich, aber keiner will sie haben.
    Bei Informatikern ist es gerade umgekehrt.
    Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
    1. Hi,

      ich zerbreche mir hier den Kopf über ein Problem, was eigentlich sehr einfach seien sollte.

      es *ist* einfach, wenn man es nicht künstlich verkompliziert.

      Kurz umrissen, ich habe eine Textarea, deren Inhalt in in meiner Datenbank speichre.

      Okay, schau'mer mal.

        	$beschreibung=$\_POST["element\_2"];  
        	//$beschreibung= strip\_tags($beschreibung);  
        	//$beschreibung= htmlspecialchars($beschreibung);  
        	$beschreibung= nl2br($beschreibung);  
        	$beschreibung=str\_replace("\r\n","",$beschreibung);  
      

      Wozu hier nl2br()? Willst du <br>-Tags in die Datenbank schreiben? Nein, das willst du eigentlich nicht! Speichere die Daten möglichst neutral. Behalte die Zeilenumbrüche bei, wie du sie auch schon angeliefert bekommst. Gut dass du strip_tags() und htmlspecialchars() wenigstens wieder rausgenommen hast.
      Allerdings solltest du die Daten vor dem Eintragen unbedingt nach den Regeln deiner Datenbank maskieren. Bei mySQL wäre beispielsweise mysql_real_escape_string() dafür vorgesehen und geeignet.

      Natürlich maskiere ich, allerdings erst direkt im Statement selber:
      ...,'".mysql_real_escape_string($beschreibung)."',...

      Ausgeben tue ich den Text per Javascript:
      tmp2.innerHTML = "<h2>"+markdetails[i].name+"</h2><br>Datum: "+datum[2]+"."+datum[1]+"."+datum[0]+"<br><p>"+markdetails[i].beschreibung+"<br>Veranstaltungsort: "+markdetails[i].adresse+"<br>Link zum Veranstalter: "+markdetails[i].url+"</p><br>Eingetragen von "+markdetails[i].von;

      Und wie kommen die Daten von der DB bis zum Javascript?

      Hier ein Beispiel:
      Ausgabe im Browser:

      Ja, die <br>-Tags, mit denen du den Text beim Eintragen verstümmelt hast, werden also exakt 1:1 wieder ausgegeben.

      Inhalt im entsprechenden Feld in der Datenbank:
      1<br />23<br />5<br />3<br />52<br />241

      Genau - da sind sie ja auch schon.

      Mir ist noch nicht klar, wie deine Daten von der DB wieder bis zum Browser kommen. Aber beim Eintragen machst du schon mal einen Kardinalfehler.

      Hi Martin,
      meine Daten kommen von der DB in den Browser über 2 Stationen:

      		$sql = "SELECT * FROM wbb".WBB_N."_map WHERE `date` like \"2011%\" ORDER BY `wbb1_1_map`.`date` ASC";  
      		//print_r($sql);  
      		$result = WCF::getDB()->sendQuery($sql);  
      		while ($row = mysql_fetch_object($result)) {  
      			$this->thnigs2011[$this->count]= $row;  
      			$this->count++;  
      		}
      

      Nachdem ich also ein Array mit meiner Abfrage habe, übergebe ich dieses an das Template (das ganze geschieht im Rahmen eines Forums, welches auf diese Art der Trennung nutzt):

      WCF::getTPL()->assign (array('things2011' => $this->things2011));

      Nun kann ich das Array im JavaCode quasi benutzen:

      	{foreach from=$thnigs2011 item=id}  
      		marker =createMarker("{$id->lat}","{$id->lng}");  
      		map.addOverlay(marker);  
      		markdetails2011[i]= new singledetail("...(andere Parameter für den Konstruktor)...", "{$id->description}","...weitere Parameter..." );  
      		markers2011[i] = marker;  
      		i++;  
      	{/foreach}
      

      Die Abfrage von Markdetails hast du ja bereits im 1. Posting von mir gesehen.

      So long,
      Martin

      Meine (falsche) Idee war, die Eingaben vor dem Input in die DB zu bearbeiten, da ich bei der Abfrage und Ausgabe ja später mit größeren Mengen arbeite, und die maskierung dort aufwändiger ist?!

      Vielen Dank für deine erste Hilfestellung.

      Gruß
      Jacob

      1. Hallo Jacob,

        Allerdings solltest du die Daten vor dem Eintragen unbedingt nach den Regeln deiner Datenbank maskieren. Bei mySQL wäre beispielsweise mysql_real_escape_string() dafür vorgesehen und geeignet.
        Natürlich maskiere ich, allerdings erst direkt im Statement selber:
        ...,'".mysql_real_escape_string($beschreibung)."',...

        okay, das ging aus dem gezeigten Code nicht hervor, und die Erfahrung zeigt, dass dieser Schritt gern vernachlässigt wird - sei es aus Gleichgültigkeit oder aus Unwissenheit.

        Ausgeben tue ich den Text per Javascript:
        Und wie kommen die Daten von der DB bis zum Javascript?
        meine Daten kommen von der DB in den Browser über 2 Stationen:

        $sql = "SELECT * FROM wbb".WBB_N."_map WHERE date like "2011%" ORDER BY wbb1\_1\_map.date ASC";
        //print_r($sql);
        $result = WCF::getDB()->sendQuery($sql);
        while ($row = mysql_fetch_object($result)) {
        $this->thnigs2011[$this->count]= $row;
        $this->count++;
        }

        Das heißt, du benutzt irgendeine mir unbekannte Klassenbibliothek oder ein CMS, das einen Großteil der Datenaufbereitung übernimmt.

        WCF::getTPL()->assign (array('things2011' => $this->things2011));

        Dann vermute ich, dass dieses Framework auch irgendwo die normalerweise sinnvolle Behandlung mit htmlspecialchars() übernimmt, die hier, bei der *Ausgabe* als HTML, angebracht ist.

        Nun kann ich das Array im JavaCode quasi benutzen:

        Bitte verwechsle nicht Java mit Javascript oder Grat mit Gratin.

        {foreach from=$thnigs2011 item=id}  
        
          marker =createMarker("{$id->lat}","{$id->lng}");  
          map.addOverlay(marker);  
          markdetails2011[i]= new singledetail("...(andere Parameter für den Konstruktor)...", "{$id->description}","...weitere Parameter..." );  
          markers2011[i] = marker;  
          i++;  
        

        {/foreach}

          
        Das scheint mir eher Template-Code zu sein, der letztendlich Javascript ausgibt. Was dabei genau abgeht, bleibt für mich aber noch rätselhaft.  
          
        
        > Meine (falsche) Idee war, die Eingaben vor dem Input in die DB zu bearbeiten, da ich bei der Abfrage und Ausgabe ja später mit größeren Mengen arbeite, und die maskierung dort aufwändiger ist?!  
          
        Das sollte kein Argument sein. Kontextgerechte Behandlung von Daten sollte da erfolgen, wo die Daten in einen neuen Kontext eingebracht werden, und dann für diesen Zielkontext und nichts anderes. Sonst wirfst du dir letztendlich selbst Knüppel zwischen die Füße.  
          
        Ciao,  
         Martin  
          
          
        PS: Bitte keine [Vollzitate](http://de.wikipedia.org/wiki/TOFU)! Zitiere maßvoll, nämlich die Passagen, auf die du dich beziehst, und lass den Rest weg. Danke.
        
        -- 
        Zwei Kumpels sitzen vor dem Computer. "Welche Suchmaschine beutzt du eigentlich meistens?" - "Prima Vera." - "Hmm, kenn' ich gar nicht." Dann geht die Tür auf: "Schatz ich habe deine Sonnenbrille wiedergefunden!" - "Prima, Vera!"  
        Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
        
        1. Hallo Martin

          ...Dann vermute ich, dass dieses Framework auch irgendwo die normalerweise sinnvolle Behandlung mit htmlspecialchars() übernimmt, die hier, bei der *Ausgabe* als HTML, angebracht ist.

          Jein, bei der Threaderstellung ja, ich übergebe meinen Markern, um deren Beschreibung es hier geht allerdings den rohen Code, so wie ich ihn aufbereite (oder zerstückele).

          ...Bitte verwechsle nicht Java mit Javascript oder Grat mit Gratin.

          Sorry dafür, ich sitze heute wohl schon zu lange dadran. Wollte eigentlich längst fertig sein.

          ...Das scheint mir eher Template-Code zu sein, der letztendlich Javascript ausgibt. Was dabei genau abgeht, bleibt für mich aber noch rätselhaft.

          Im Grunde läuft hier nur eine Schleife über das Array und führt jedesmal den Code zwischen {foreach} aus. Erstellt mir also diverse Marker, pappt diese auf meine Googlemaps-Karte und füllt 2 Arrays.

          Das sollte kein Argument sein. Kontextgerechte Behandlung von Daten sollte da erfolgen, wo die Daten in einen neuen Kontext eingebracht werden, und dann für diesen Zielkontext und nichts anderes. Sonst wirfst du dir letztendlich selbst Knüppel zwischen die Füße.

          Ich laufe jetzt iterativ über das PHP-Array, bevor ich es an das Template übergebe und nutze nl2br, allerdings habe ich nun das Problem, das ich unterminierte Strings im Quelltext stehen habe, die meine Google-Karte stören, da der Quelltext an dieser Stelle Fehler hat.

          PS: Bitte keine Vollzitate! Zitiere maßvoll, nämlich die Passagen, auf die du dich beziehst, und lass den Rest weg. Danke.

          Sorry, mir ist diese Art der Forennutzung noch neu, wollte nichts falsch machen, indem ich Passagen weglasse.

          Viele Grüße,
          Jacob