Author Topic: mysql und loops  (Read 919 times)

0 Members and 1 Guest are viewing this topic.

Uli

  • Guest
mysql und loops
on: Tue, 25. January 2005 - 14:48:52
Hallo,
ich habe Bilder und Fotoalben in einer DB in 2 Tabellen angeordnet.
album
  album_id
  album_name
...

photo
   photo_id
   photo_title
   photo_location
   thumbnail_location
   album_id

Ich möchte nun auf diese DB zugreifen und alle Daten zu den Fotos eines Albums auslesen. Dann möchte ich die Bilder einzeln auf einer Homepage ausgeben und mit prev/next durch das Album blättern.

Ich habe folgendes in index.php stehen:
...
Code: [Select]
photo_data = array;
whilerow = mysql_fetch_assocresult {
   ifrowalbum_id == albumid {   // wenn album_id des Photos aktuellem Album entspricht
        array_pushphoto_data, array
             photo_id = rowphoto_id,
             photo_title = rowphoto_title,
             photo_location = rowphoto_location,
             thumbnail_location = rowthumbnail_location
            
        ;
   }
}

tmpl-setloopphoto_data, photo_data;

Die Ausgabe im Template sieht so aus:
Code: [Select]
tmpl_loop name=photo_data
  div id=image
     img id=single src={tmpl_var name=photo_location} alt= /
  /div
/tmpl_loop

Damit werden aber leider alle Photos im Array ausgegeben. Wie kann ich immer nur auf die Daten eines Fotos zugreifen?
Dann könnte ich für "next" und "prev" einfach einen Zähler erhöhen oder erniedrigen und hätte auch dies gelöst.

Ich habe versucht, das ganze mit einem 4d-Loop zu lösen, leider bisher ohne Erfolg.
Die ganze Struktur soll als nächstes auch noch als Gundlage für einen Thumbnail-Index dienen.

Gruß
Uli
Last Edit: Tue, 25. January 2005 - 15:41:39 by ClausVB

Offline ClausVB

  • Administrator
  • Hero Member
  • *****
  • Posts: 566
    • Homepage: clausvb.de
mysql und loops
Reply #1 on: Tue, 25. January 2005 - 15:46:59
Ich würde mit den MySQL-Zusätzen "ORDER BY" und "LIMIT 0, 20" arbeiten. Damit werden dann nur jeweils 20 Datensätze in "row" gepackt. Sobald auf "NEXT" oder "PREV" gedrückt wird, wird dann der LIMIT erhöht: "LIMIT 60, 20" so wie es im phpMyAdmin auch gemacht wird.

Mit anderen Worten, ich würde die Logik in PHP und MySQL auslagern und nicht versuchen das ganze über Arrays zu lösen. Die LOOP-Arrays dienen ja nur zur Ausgabe der Bilder bzw. die LOOP-Arrays sind die Schnittstelle zum Template, das zur Ausgabe benutzt wird. Dem Template sollte es egal sein, welche oder wie viele Bilder ausgegeben werden.

Zur Info: Templates sollten wenig bis gar keine Logik enthalten.

Gruß
Claus
Last Edit: Tue, 25. January 2005 - 15:51:05 by ClausVB

Uli

  • Guest
mysql und loops
Reply #2 on: Tue, 25. January 2005 - 21:31:16
Hallo,
Quote
Ich würde mit den MySQL-Zusätzen "ORDER BY" und "LIMIT 0, 20" arbeiten. Damit werden dann nur jeweils 20 Datensätze in "row" gepackt. Sobald auf "NEXT" oder "PREV" gedrückt wird, wird dann der LIMIT erhöht: "LIMIT 60, 20" so wie es im phpMyAdmin auch gemacht wird.
Hmm. ORDER BY verwende ich schon und habe jetzt noch WHERE eingebaut, um die if-Anweisung zu umgehen.
Ich habe Fotoalben mit um die 200 Fotos und insgesamt werde ich etwa 2000 Bilder auf der Page haben. Ich müßte ja dann mit LIMIT die Bilder einzeln aufrufen und hätte somit sehr viele DB-Anfragen. Ist das nicht viel langsamer, als ein Album einmal in einem Array zu speichern und dann weiter zu verarbeiten? Zumal für die Index-Bilder und die entsprechende Dynamik ja auch noch jede Menge Abfragen nötig wären.

Wie kann ich über eine Aktion (also z.B. Mausklick auf "next") php-Code in der index.php ausführen, die ja die Seite erstellt hat?

Habe beim Lesen unter kap12.html (Aufbau und Struktur eines "LOOP-Arrays") gelesen:
Quote
Im Beispiel für den "basic_loop" könnte man ein Feld des LOOPS so ausgeben:
echo "Bobs Alter: {peoplearr_basic[1][age]}";
Das wäre ja eigentlich schon, was ich brauche. Ich schaffe es nur nicht, diese Ausgabe mit tmpl_loop bzw. tmpl_var zu erreichen.

Dankeschön.
Gruß
Uli
Last Edit: Sun, 30. January 2005 - 12:44:46 by ClausVB

Offline ClausVB

  • Administrator
  • Hero Member
  • *****
  • Posts: 566
    • Homepage: clausvb.de
mysql und loops
Reply #3 on: Sun, 30. January 2005 - 12:54:06
Quote
Wie kann ich über eine Aktion (also z.B. Mausklick auf "next") php-Code in der index.php ausführen, die ja die Seite erstellt hat?
Sorry, für mich sieht es im Moment so aus, als hättest Du nicht das erforderliche PHP-Wissen, um Dein Problem zu lösen. Dieses hier ist kein PHP-Forum.

Generell halte ich es nicht für sinnvoll Datensätze in einen Array zu speichern und dann zu sortieren. Ich arbeite an allen Stellen so viel wie möglich mit SQL, da es wenn es um Sortierung und Abfragen geht auf jeden Fall performanter ist, als Datensätze in einem Array zu speichern und dann zu sortieren.

Natürlich muss man nicht unnötig viele Abfragen an das RDBMS schicken, aber ich weiß vom phpMyAdmin, dass er mit LIMIT arbeitet und von "freenet.de" (mit ca. 16 Mio Datensätzen) weiß ich es auch.

Es wäre ja auch wahnwitzig, 16 Mio Datensätze in einem Array zu speichern und sie dann mit PREV und NEXT auszugeben.

Aber wenn Du diese Lösung nicht machen möchtest, kann ich Dir nicht mehr helfen.

Gruß
Claus

Offline ClausVB

  • Administrator
  • Hero Member
  • *****
  • Posts: 566
    • Homepage: clausvb.de
mysql und loops
Reply #4 on: Tue, 01. February 2005 - 15:35:05
Eine Lösung, die mit ORDER BY und LIMIT arbeitet gibt es übrigens schon:

Beispiel und Erklärungen von Kelvin. Es gibt 20 Beiträge pro Seite aus.

Vielleicht hilft das ja noch weiter.

Gruß
Claus
Last Edit: Tue, 01. February 2005 - 15:35:31 by ClausVB