Hugo: Aus Array Tabelle aufbauen

Hi Forum,

ich steh auf dem Schlauch.

Ich möchte eine Tabelle in Form von
<tr><td>$inhalt</td><td>$inhalt</td></tr>
mittels einer while-schleife bauen.
Der Inhalt kommt dynamisch aus einer MySQL-DB.
Meine Variablen $inhalt sollen halt durch die DB-Results ersetzt werden.
Nur wie erzeugt ich innerhalb der Schleife die einzelnen TabellenRows und cols?

Vielen Dank
Hugo

  1. Nur wie erzeugt ich innerhalb der Schleife die einzelnen TabellenRows und cols?

    Hi,

    zb so (wenn schon ein result hast):

    while($row=mysql_fetch_array($result)){
    echo '<tr><td>'.$row['ColName1'].'</td><td>'.$row['ColName2'].'</td></tr>.';
    }

    1. Hi Jonny 5,

      erst mal danke für deine Antwort.
      Mein Problem ist aber, dass ich meine Felder zwischen <td>und</td> immer mit dem gleichen Namen füllen muss, also ungefähr so:

      while($row=mysql_fetch_array($result)){
      echo '<tr><td>'.$row['result aus 1. Schleifendurchlauf'].'</td><td>'.$row['result aus 2. Schleifendurchlauf'].'</td></tr>.';
      }

      und beim 3 Durchlauf wieder das ganze ausführen.

      Danke Hugo

      1. Lieber Hugo,

        while($row=mysql_fetch_array($result)){
        echo '<tr><td>'.$row['result aus 1. Schleifendurchlauf'].'</td><td>'.$row['result aus 2. Schleifendurchlauf'].'</td></tr>.';
        }

        und beim 3 Durchlauf wieder das ganze ausführen.

        da wäre es anscheinend einfacher, die mysql-results in eigene Arrays zu packen, um diese dann in der Schleife in Deine Tabelle zu schreiben.

        In etwa so (habe noch keine Erfahrung mit DB-Abfragen):

        $ergebnisse = array(  
            'spalte1' => array(),  
            'spalte2' => array(),  
            'spalte3' => array()  
        );  
          
        // ob das hier so geht, weiß ich nicht (müsste man entsprechend abändern)  
        $ergebnisse['spalte1'] = mysql_fetch_array($result1);  
        $ergebnisse['spalte2'] = mysql_fetch_array($result1);  
        $ergebnisse['spalte3'] = mysql_fetch_array($result1);  
          
        // hier die Schleife  
        $html_code = "<table>\n<tr><th>Spalte1</th><th>Spalte2</th><th>Spalte3</th></tr>\n";  
          
        $zeilen = count($$ergebnisse['spalte1']); // Problem falls Spalten ungleich viele Inhalte haben!  
          
        foreach ($zeilen as $zeile) {  
            $html_code .= '<tr>';  
            // Je nach Zeichenkodierung möchtest Du Dir die htmlentities() auch sparen  
            $html_code .= '<td>'.htmlentities($ergebnis['spalte1']).'</td>';  
            $html_code .= '<td>'.htmlentities($ergebnis['spalte2']).'</td>';  
            $html_code .= '<td>'.htmlentities($ergebnis['spalte3']).'</td>';  
            $html_code .= "</tr>\n";  
        }  
          
        $html_code .= "</table>\n";
        

        Liebe Grüße aus Ellwangen,

        Felix Riesterer.

      2. und beim 3 Durchlauf wieder das ganze ausführen.

        hmm, weiss nicht ob ich richtig verstehe, abhängig von row# ergebnis anpassen? zb. zähler mitgeben:

        $i=0;

        while($row=mysql_fetch_array($result)){ $i++;
          switch($i){
            case 1: $col1=$row['Col1']; $col2=""; break;
            case 2: $col1=""; $col2=$row['Col2']; break;
            default: $col1=$row['Col1']; $col2=$row['Col2']; break;
          }
          echo '<tr><td>'.$col1.'</td><td>'.$col2.'</td></tr>.';
        }

        lG, Jonny5

    2. echo $begrüßung;

      while($row=mysql_fetch_array($result)){
      echo '<tr><td>'.$row['ColName1'].'</td><td>'.$row['ColName2'].'</td></tr>.';

      Hier findet ein nicht beachteter Kontextwechsel statt. Daten aus der DB werden in den Kontext HTML gebracht. Wenn die Daten in der DB HTML-eigene Zeichen enthalten, gelangen diese unbehandelt in den HTML-Code. Falls das nicht gewünscht ist, kann das eine XSS-Lücke darstellen. Mit htmlspecialchars() kann man die HTML-eigenen Zeichen der DB-Daten HTML-gerecht behandeln.

      echo "$verabschiedung $name";

      1. Lieber dedlfix,

        Kontextwechsel [...] Wenn die Daten in der DB HTML-eigene Zeichen enthalten [...] kann das eine XSS-Lücke darstellen

        da würde mich Deine Antwort generell interessieren:

        Bist Du der Meinung, dass man bei Seiten, deren Inhalte nicht von Dir gepflegt werden, generell die "Natur" der Datenbankinhalte in Frage stellt, auch wenn diese Inhalte _keine_ HTML-eigenen Zeichen enthalten, da es sich um z.B. Preislisten oder ähnliches handelt, deren Eingabe nur von bestimmten Personen manuell vorgenommen werden können (mittels Login über eine entsprechend programmierte Maske usw.)? Oder würdest Du auch in einem solchen Falle sagen, dass ein solches Login in falsche Hände fallen könnte, wodurch dann die Maske auch keine ausreichende Sicherheit darstellte und XSS wieder möglich sei?

        Liebe Grüße aus Ellwangen,

        Felix Riesterer.

        1. Bist Du der Meinung, dass man bei Seiten, deren Inhalte nicht von Dir gepflegt werden, generell die "Natur" der Datenbankinhalte in Frage stellt, auch wenn diese Inhalte _keine_ HTML-eigenen Zeichen enthalten, da es sich um z.B. Preislisten oder ähnliches handelt, deren Eingabe nur von bestimmten Personen manuell vorgenommen werden können (mittels Login über eine entsprechend programmierte Maske usw.)?

          Vollkommen egal. Wenn definiert ist, dass in der Datenbank "plain text" steht, dann sind <, > und & gültige Plain-Text-Zeichen. Diese müssen in HTML immer als Entity ausgegeben werden - auch wenn sie vielleicht niemals in die Datenbank EINGEGEBEN werden. Man weiß es vorher nicht.

          Oder würdest Du auch in einem solchen Falle sagen, dass ein solches Login in falsche Hände fallen könnte, wodurch dann die Maske auch keine ausreichende Sicherheit darstellte und XSS wieder möglich sei?

          Das Login ist wirklich das kleinere Problem. Entscheidend ist: Die Inhalte der Datenbank stehen nicht für immer unter deiner eigenen Kontrolle. Und selbst wenn das so wäre, würdest du trotzdem erstmal eines der drei bösen HTML-Zeichen direkt eingeben, dann (hoffentlich zeitnah!) feststellen, dass die Browserfehlerkorrektur dann doch falsch rät, und das Zeichen dann manuell in der DB in eine Entity wandeln.

          All das kann man sich auch sparen, wenn man gleich vernünftig codiert - und zwar immer und grundsätzlich, nicht nur bedarfsweise.

          1. Lieber Kontextwechsler,

            All das kann man sich auch sparen, wenn man gleich vernünftig codiert - und zwar immer und grundsätzlich, nicht nur bedarfsweise.

            das ist die gewünschte Antwort auf meine Frage. Danke! Und Frohe Weihnachten!

            Liebe Grüße aus Ellwangen,

            Felix Riesterer.

        2. echo $begrüßung;

          Der Kontextwechsler hat ja schon geantwortet, dem ich nicht mehr allzuviel hinzufügen kann.

          Es ist das "kleinere Übel", solche Kontextwechsel zu beachten und die Daten generell dem Ausgabemedium anzupassen, als ständig im Hinterkopf behalten zu müssen, dass man bestimmte Zeichen nicht verwenden darf. Was ist, wenn eines Tages in deinem Preislistenbeispiel ein Produkt hinzukommt, das <, > & oder " in seinem Namen trägt. Du weißt vielleicht, dass das "böse" Zeichen sind. Erinnerst du dich bei der Eingabe daran? Erkennst du diese Zeichen auch, wenn du mit Copy & Paste Texte aus fremden Listen übernimmst? Denkst du daran, einem Nachfolger/einer Aushilfskraft beizubringen, dass diese Zeichen gefährlich sind? Kannst du ausschließen, dass die Datenbank nicht anderweitig kompromittiert werden kann? Kontrollierst du deine Daten ständig auf solche Kompromittierungen? Wie du sehen kannst, ist "htmlspecialchars()" deutlich kürzer als meine unvollständige Liste der zu bedenkenden Punkte. :-)

          Das Schwierige ist nur für den Einsteiger, solche Kontextwechsel zu erkennen und zu beachten. Wer weiß schon, dass Daten in einer URL URL-kodiert werden müssen, und anschließend auch noch mal HTML-gerecht behandelt werden müssen, wenn diese URL im HTML-Code erscheinen soll? Und neben diesen selbst zu beachtenden Dingen kommen dann auch noch Fehler z.B. in Brwosern hinzu, die einem zusätzliche Lücken aufreißen können.

          echo "$verabschiedung $name";