while Schleife und 2 foreach (Smarty)

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • while Schleife und 2 foreach (Smarty)

    Grüß euch,

    hoffentlich heute mein letztes Problem.

    Ich habe eine Datenbank mit einigen Infos! Darunter auch die Spalte "preview" für Vorschaubilder. Ist mehr wie ein Bild vorhanden, trenne ich die durch ein ;

    In der while Schleife der Datenabankabfrage führe ich die Prüfung durch ob ein Bild vorhanden ist. Jetzt ist das Problem, hat auch nur ein Eintrag ein oder mehrere Bilder, so werden diese bei der Ausgabe in jedem Eintrag angezeigt.Dazu auch mal ein paar Screens die das ganze verdeutlichen

    PHP-Quellcode

    1. /*
    2. * Downloads auslesen
    3. */
    4. $sql = 'SELECT * FROM ' . DOWNLOAD . ' WHERE cat_id = :cat_id ';
    5. $stmt = MyDB::getInstance()->prepare($sql);
    6. $stmt->execute($pdoparams);
    7. while ($row = $stmt->fetch()) {
    8. $row['created_time'] = $Core->userdate($row['created_time']);
    9. $row['description'] = nl2br($row['description']);
    10. /*
    11. * Anhänge?
    12. */
    13. if ( $row['preview'] ) {
    14. $attChunks = explode(";", $row['preview']);
    15. for($i = 0; $i < count($attChunks); $i++){
    16. $attachment_out = '<a href="file/'.$attChunks[$i].'" target="_blank">'.$attChunks[$i].'</a>';
    17. }
    18. $attChunks = explode(";", $row['preview']);
    19. foreach ($attChunks as $attChunk) {
    20. $row['att'] = $attChunk;
    21. $attachment[] = $row ;
    22. }
    23. }
    24. $download[] = $row;
    25. }
    26. // Ausgabe Header
    27. $Core->page_header($cat_row->cat_name);
    28. $Smarty->assign(array(
    29. 'DOWNLOAD' => $download,
    30. 'ATTACHMENT' => $attachment,
    31. 'CAT_NAME' => $cat_row->cat_name,
    32. 'CAT_DESC' => $cat_row->cat_desc,
    33. ));
    Alles anzeigen


    HTML-Quellcode

    1. {foreach from=$DOWNLOAD item=list}
    2. <div class="row show-grid dl_box">
    3. <div class="col-md-8 col-md-8_dl_box">
    4. <h3>{$list.name}</h3>
    5. <p>{$list.description}</p>
    6. </div>
    7. <div class="col-md-4">.
    8. <ul>
    9. <li>Hochgeladen am {$list.created_time}</li>
    10. <li>Version: {$list.version}</li>
    11. <li>Download: <a href="{$list.filename}" title="Download">Download</a> </li>
    12. {foreach from=$ATTACHMENT item=listr}
    13. <a href="file/{$listr.att}" target="_BLANK">{$listr.att}</a>
    14. {/foreach}
    15. </ul>
    16. </div>
    17. </div>
    18. {/foreach}
    Alles anzeigen
    Bilder
    • sql.png

      40,67 kB, 1.111×284, 348 mal angesehen
    • sql2.png

      55,59 kB, 1.182×331, 358 mal angesehen
  • Moin,

    konnte das Problem nach ein paar Stunden Schlaf alleine lösen.
    Die while abgeändert und die foreach entfernt.


    PHP-Quellcode

    1. $sql = 'SELECT * FROM ' . DOWNLOAD . ' WHERE cat_id = :cat_id ';
    2. $stmt = MyDB::getInstance()->prepare($sql);
    3. $stmt->execute($pdoparams);
    4. while ($row = $stmt->fetch()) {
    5. $row['created_time'] = $Core->userdate($row['created_time']);
    6. $row['description'] = nl2br($row['description']);
    7. /*
    8. * Anhänge?
    9. */
    10. if ( $row['preview'] ) {
    11. $attChunks = explode(";", $row['preview']);
    12. for($i = 0; $i < count($attChunks); $i++){
    13. $row['att'] .= '<a href="file/'.$attChunks[$i].'">'.$attChunks[$i].'</a>';
    14. }
    15. }
    16. $download[] = $row;
    17. }
    Alles anzeigen


    HTML-Quellcode

    1. {foreach from=$DOWNLOAD item=list}
    2. <div class="row show-grid dl_box">
    3. <div class="col-md-8 col-md-8_dl_box">
    4. <h3>{$list.name}</h3>
    5. <p>{$list.description}</p>
    6. {if $list.preview}
    7. {$list.att}
    8. {/if}
    9. </div>
    10. <div class="col-md-4">.
    11. <ul>
    12. <li>Hochgeladen am {$list.created_time}</li>
    13. <li>Version: {$list.version}</li>
    14. <li>Download: <a href="{$list.filename}" title="Download">Download</a> </li>
    15. </ul>
    16. </div>
    17. </div>
    18. {/foreach}
    Alles anzeigen
  • Hey Grommel,
    super, dass du dein Problem selber lösen konntest! Hut ab! :)

    Kleine Anmerkung zu deiner Datenbankstruktur: Ich bin ja momentan selber in einer Ausbildung zum Softwareentwickler und da behandeln wir eben auch regelmäßig Datenbanken. Bei der Datenbanknormalisierung (erste Normalform) heißt es, dass die einzelnen Felder bzw. einzelne Eigenschaften auch ein eigenes Feld für sich haben sollten. Dazu mal ein kleiner Auszug aus Wikipedia:

    Wikipedia schrieb:

    Jedes Attribut der Relation muss einen atomaren Wertebereich haben, und die Relation muss frei von Wiederholungsgruppen sein. (Anm.: statt „atomar“ wird auch die Bezeichnung „atomisch“ verwendet.)

    Das heißt, zusammengesetzte, mengenwertige oder geschachtelte Wertebereiche (relationenwertige Attributwertebereiche) sind nicht erlaubt. Damit sind auch Wiederholungsgruppen nicht zugelassen. Kurz: Kein Attributwertebereich einer Relation in 1NF kann in weitere (sinnvolle) Teilbereiche aufgespaltet werden (Beispiel: Die Adresse darfnicht als Attribut verwendet werden, sondern muss – sofern es der zugrunde liegende Prozess erfordert – in PLZ, Ort, Straße und Hausnummer aufgeteilt werden).

    Hier geht es zur Quelle: Wikipedia

    Ich mag, bitte nicht falsch verstehen, nicht besserwisserisch sein, aber dir dennoch den Hinweis geben (da ich auch immer um Ratschläge bitte und mir das bei dir eben aufgefallen ist), dass das Feld "preview" bei dir nicht dieser Norm entspricht. Ich denke da wäre eine OneToMany-Datenbanktabelle, wie z.B.: "preview_to_file" sauberer und auch sinnvoll.

    Wie gesagt, nur ein kleiner Tipp - bitte nicht falsch verstehen, ich mag dich nicht kritisieren - aber das hatten wir eben letztens erst in der Berufsschule, deshalb fiel mir das auf! :)

    Liebe Grüße,
    Vincent
    "Das müsste jetzt funktionieren..."

    ---
    Mit freundlichen Grüßen,
    Vincent Petritz
  • Vincent Petritz schrieb:

    Ich denke da wäre eine OneToMany-Datenbanktabelle, wie z.B.: "preview_to_file" sauberer und auch sinnvoll.


    Das ist wahrscheinlich die Grundsatzdiskussion der Datenbanklehre. Eigentlich bin ich auch der Meinung, da es einfach übersichtlicher und leichter wartbar ist, aber wenn die Einträge nicht zu lang werden und mehrere unterteilte Einträge die Ausnahme bilden, kann ich den Schritt durchaus verstehen. Da würde das Skript insgesamt durch den "unnötigen" SQL-JOIN vermutlich länger brauchen, als das einzelne Feld per PHP auseinanderzunehmen.
  • Vincent Petritz schrieb:


    Ich mag, bitte nicht falsch verstehen, nicht besserwisserisch sein


    Versteh ich nicht falsch, ich weiss das du besserwisserisch bist *g*
    Nein, spaß bei Seite, so sollte es normal auch sein. In meiner Hostingscript sind die Spalten ja auch alle eindeutig bzw. für sowas eine eigene Tabelle.
    Die frage ist nur ob sich der Aufwand auch lohnt da es diesmal nur eine kleine Seite mit 10-15 Artikeln wird.

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von Grommel ()