Manu3l: Mit foreach-Schleife in Tabelle ein Bild anzeigen

Hallo,

ich mache gerade für ein PC-Spiel eine kleine Datenbank. In dieser Liste ich auf, welcher Händler, welche Ware verkauft. Da gerade bei Kleidungsstücken ein Bild in meiner Ausgabe erscheinen soll, habe ich in meiner MySQL-Datenbank einen Link, mit einem Foto hinterlegt. Leider bzw. natürlich wird mir nur der Link in meiner Tabelle angezeigt, aber nicht das Foto selbst.

			<?php 
			$sql = "SELECT * FROM stores";

			foreach ($db->query($sql) as $row) 
			{
			?> 	<td> <?php  
				echo $row['bild'];
			?> 	</td> <?php
			?> 	<td> <?php  
				echo $row['verkaeufer'];
			?> 	</td> <?php
			?> 	<td> <?php
				echo $row['name'];
			?> 	</td> <?php
			?> 	<td> <?php
				echo $row['kosten'];
			?> 	</td> <?php
			?> 	<td> <?php
				echo $row['kleidungsstueck'];
			?> 	</td> <?php
			?> 	<td> <?php
				echo $row['size'];
			?> 	</td> <?php
			?> 	<td> <?php
				echo $row['grade'];
			?> 	</td> <?php
			?> 	<td> <?php
				echo $row['firma'];
			?> 	</td> <?php
			?> 	<td> <?php
				echo $row['ort'];
			?> 	</td> <?php
			?> 	<td> <?php
				echo $row['erstellt_am'];
			?> 	</td> <?php

	?> </tr> <?php
			} 

Hier gibt er mir alles schön übersichtlich aus:

Tabelle

Aber natürlich möchte ich nicht den Link, sondern das Foto. Wie könnte ich das bewerkstelligen, oder gibt es eine bessere Lösung?

Vielen Dank schonmal!

Manuel

  1. Hallo

    ich mache gerade für ein PC-Spiel eine kleine Datenbank. In dieser Liste ich auf, welcher Händler, welche Ware verkauft. Da gerade bei Kleidungsstücken ein Bild in meiner Ausgabe erscheinen soll, habe ich in meiner MySQL-Datenbank einen Link, mit einem Foto hinterlegt. Leider bzw. natürlich wird mir nur der Link in meiner Tabelle angezeigt, aber nicht das Foto selbst.

    			<?php 
    			$sql = "SELECT * FROM stores";
    
    			foreach ($db->query($sql) as $row) 
    			{
    			?> 	<td> <?php  
    				echo $row['bild'];
    			?> 	</td> <?php
    
    	?> </tr> <?php
    			} 
    

    Aber natürlich möchte ich nicht den Link, sondern das Foto. Wie könnte ich das bewerkstelligen, oder gibt es eine bessere Lösung?

    Wenn du ein Bild in ein HTML-Dokument einbinden willst, dass solltest du auch genau das tun. Füge also den nötigen HTML-Code für img in die Tabellenzelle ein.

    Tschö, Auge

    --
    Ein echtes Alchimistenlabor musste voll mit Glasgefäßen sein, die so aussahen, als wären sie beim öffentlichen Schluckaufwettbewerb der Glasbläsergilde entstanden.
    Hohle Köpfe von Terry Pratchett
    1. Manchmal ist die Antwort doch zu leicht😅 Hat funktioniert...😂

      Vielen Dank!

      Manuel

      1. @@Manu3l

        Manchmal ist die Antwort doch zu leicht😅

        Ja, Auges Antwort war zu leicht; sie war unvollständig.

        Insbesondere Punkt 4 von Rolfs Antwort solltest du dir hinter die Ohren schreiben.

        Hat funktioniert...😂

        Für die, die Deine Sicherheitslücken ausnutzen …

        LLAP 🖖

        --
        „Wer durch Wissen und Erfahrung der Klügere ist, der sollte nicht nachgeben. Und nicht aufgeben.“ —Kurt Weidemann
  2. Hallo Manu3l,

    unabhängig vom Problem würde ich Dir diese Vorschläge machen wollen:

    1. Es ist sinnvoll, bei SQL Abfragen aus Programmen heraus die gewünschten Spalten einzeln aufzulisten. Dieses Vorgehen ist robuster als ein SELECT *.

    2. Nach query() ist eine Prüfung gegen FALSE notwendig, falls die Query fehlschlägt. Man sollte dem Anwender dann zeigen, dass die Liste nicht verfügbar ist, und die Fehlerursache ins interne Log schreiben. Es ist dann entweder ein Programmierfehler, oder die DB ist nicht in Ordnung.

    3. Statt <?php echo ... ?> bietet sich die <?= ?> Kurzschreibweise an

    4. Texte aus deiner Datenbank müssen bei der Ausgabe in HTML mit htmlspecialchars() kontextgerecht codiert werden-

    5. Den Rumpf eines foreach, in den HTML eingebettet ist, sollte man nicht mit { } kennzeichnen, sondern mit der alternativen Syntax foreach (...): ... endforeach; Man findet das Schleifenende dann besser wieder. Noch besser ist es, Darstellung und Logik zu trennen und die Ausgabe einer Row in eine Funktion auszulagern.

    6. Ein Image braucht einen alt-Text, hast Du daran gedacht?

    7. Zwischen </td> und <td> brauchst Du kein <?php ?> zu setzen

    8. Du hast <tr> vergessen (bzw. in deinem Posting nicht mitkopiert)

    9. Ob es sinnvoll ist, "heute" in die DB zu schreiben, würde ich bezweifeln wollen. Dort sollte ein Datum stehen, und wenn Du für Angebote von heute "heute" ausgeben willst, sollte das auf Grund eines Vergleichs von DB-Wert mit Tagesdatum erfolgen.

    <?php 
          $sql = "SELECT bild, verkaeufer, name, kosten, kleidungsstueck, size, grade, firma, ort, erstellt_am FROM stores";
          $angebote = $db->query($sql)
          if ($angebote === FALSE)
          {
             // Errorhandling
          }
          else 
          {
             foreach ($db->query($sql) as $row) 
             {
                RenderStoreRow($row);
             }
          }
    
    // Anderswo im Script:
    // Für *** muss ein sinnvoller alternativ-Text generiert werden.
    
    function RenderStoreRow($row)
    {
    ?> <tr>
        <td><img alt='***' src='<?= $row['bild'] ?>'></td>
        <td><?= htmlspecialchars($row['verkaeufer']) ?></td>
        <td><?= htmlspecialchars($row['name']) ?></td>
        <td><?= $row['kosten'] ?></td>
        <td><?= htmlspecialchars($row['kleidungsstueck']) ?></td>
        <td><?= $row['size'] ?></td>
        <td><?= $row['grade'] ?></td>
        <td><?= htmlspecialchars($row['firma']) ?></td>
        <td><?= htmlspecialchars($row['ort']) ?></td>
        <td><?= $row['erstellt_am'] ?></td>
       </tr>
    <?php
    }
    

    Rolf

    --
    sumpsi - posui - clusi
    1. function RenderStoreRow($row)
      {
      ?> <tr>
          <td><img alt='***' src='<?= $row['bild'] ?>'></td>
          <td><?= htmlspecialchars($row['verkaeufer']) ?></td>
          <td><?= htmlspecialchars($row['name']) ?></td>
          <td><?= $row['kosten'] ?></td>
          <td><?= htmlspecialchars($row['kleidungsstueck']) ?></td>
          <td><?= $row['size'] ?></td>
          <td><?= $row['grade'] ?></td>
          <td><?= htmlspecialchars($row['firma']) ?></td>
          <td><?= htmlspecialchars($row['ort']) ?></td>
          <td><?= $row['erstellt_am'] ?></td>
         </tr>
      <?php
      }
      

      $row['bild'] muss auch mit htmlspecialchars behandelt werden. In diesem konkreten Fall muss außerdem das Flag ENT_QUOTES gesetzt werden, weil das src-Attribut single Quotes verwendet und diese nicht standardmäßig maskiert werden. Alternativ kann man double Quotes für das src-Attirbut verwenden. Bei kosten, size, grade und erstellt_am ist die Maskierung nicht unbedingt notwendig, wenn der MySQL-Datentyp keine HTML-Sonderzeichen erlaubt. Es schadet aber auch nicht und ich würde daher alles maskieren. Als positiven Nebeneffekt sind die Spalten dann auch bündig und besser zu lesen.

      function RenderStoreRow($row)
      {
      ?> <tr>
          <td><img alt="***" src="<?= htmlspecialchars($row['bild']) ?>"></td>
          <td><?= htmlspecialchars($row['verkaeufer']) ?></td>
          <td><?= htmlspecialchars($row['name']) ?></td>
          <td><?= htmlspecialchars($row['kosten']) ?></td>
          <td><?= htmlspecialchars($row['kleidungsstueck']) ?></td>
          <td><?= htmlspecialchars($row['size']) ?></td>
          <td><?= htmlspecialchars($row['grade']) ?></td>
          <td><?= htmlspecialchars($row['firma']) ?></td>
          <td><?= htmlspecialchars($row['ort']) ?></td>
          <td><?= htmlspecialchars($row['erstellt_am']) ?></td>
         </tr>
      <?php
      }
      
      1. Hallo 1unitedpower,

        function RenderStoreRow($row)
        {
        ?> <tr>
            <td><img alt='***' src='<?= $row['bild'] ?>'></td>
            <td><?= htmlspecialchars($row['verkaeufer']) ?></td>
        

        $row['bild'] muss auch mit htmlspecialchars behandelt werden.

        Das trifft auch auf das alt-Attribut zu. Vielleicht sollte man die Darstellung des Bildes an eine eigene Funktion übergeben.

        Bis demnächst
        Matthias

        --
        Pantoffeltierchen haben keine Hobbys.
        ¯\_(ツ)_/¯
      1. Texte aus deiner Datenbank müssen bei der Ausgabe in HTML mit htmlspecialchars() kontextgerecht codiert werden

      Nicht nur Texte aus der Datenbank. Alle Texte, die potenziell HTML-Sonderzeichen enthalten können, die aber nicht als solche interpretiert werden sollen.