Wie kann man die Reihenfolge innerhalb eines Arrays festmachen?

Amsel

Neuer Benutzer
Beiträge
4
Ich möchte Datensätze aus einer Datenbank in 25er-Blöcken ausgeben, sprich: Die ersten 25 auf einer Webseite, die zweiten 25 auf einer zweiten Webseite, usw.
Ich arbeite dazu mit den Variablen $start und $ende, die in Abhängigkeit von der Webseite die Nummer des ersten anzuzeigenden und des ersten schon nicht mehr anzuzeigenden Datensatzes darstellen. Auf der ersten Seite ist $start dann 0 und $ende ist 25, auf der zweiten Seite 25 und 50, usw. Das funktioniert soweit auch alles.

Mein Code sieht vereinfacht wie folgt aus:

PHP:
$query = mysql_query("SELECT * FROM xyz WHERE x='$x' ORDER BY substring(titel,1,100)");
 
for($i=0; $i<$ende; $i++){
  if ($i >= $start) {
// HTML-Tags
    $data = mysql_fetch_array($query);
// HTML-Tags
  } else {
    $data = mysql_fetch_array($query);
  }
}

Nun bin ich davon ausgegangen, dass ich - so ich den ausgelesenen Array mittels ORDER BY nach titel sortiere - immer die gleiche Reihenfolge erhalte und wie geschildert immer die entsprechenden 25er-Blöcke herauspicken kann. Geht aber irgendwie nicht: Die ersten 25 erscheinen korrekt, bei den zweiten 25 erscheinen dann aber u.a. auch wieder welche, die bereits auf der ersten Seite gestanden haben. Woran liegt das bzw. was mache ich falsch? Oder kann man das so gar nicht machen?
 
Werbung:
Ich möchte Datensätze aus einer Datenbank in 25er-Blöcken ausgeben, sprich: Die ersten 25 auf einer Webseite, die zweiten 25 auf einer zweiten Webseite, usw.
Ich arbeite dazu mit den Variablen $start und $ende, die in Abhängigkeit von der Webseite die Nummer des ersten anzuzeigenden und des ersten schon nicht mehr anzuzeigenden Datensatzes darstellen. Auf der ersten Seite ist $start dann 0 und $ende ist 25, auf der zweiten Seite 25 und 50, usw. Das funktioniert soweit auch alles.

Mein Code sieht vereinfacht wie folgt aus:

PHP:
$query = mysql_query("SELECT * FROM xyz WHERE x='$x' ORDER BY substring(titel,1,100)");
 
for($i=0; $i<$ende; $i++){
  if ($i >= $start) {
// HTML-Tags
    $data = mysql_fetch_array($query);
// HTML-Tags
  } else {
    $data = mysql_fetch_array($query);
  }
}

Nun bin ich davon ausgegangen, dass ich - so ich den ausgelesenen Array mittels ORDER BY nach titel sortiere - immer die gleiche Reihenfolge erhalte und wie geschildert immer die entsprechenden 25er-Blöcke herauspicken kann. Geht aber irgendwie nicht: Die ersten 25 erscheinen korrekt, bei den zweiten 25 erscheinen dann aber u.a. auch wieder welche, die bereits auf der ersten Seite gestanden haben. Woran liegt das bzw. was mache ich falsch? Oder kann man das so gar nicht machen?

  • Du führst die Abfrage immer wieder neu aus?
  • $start=0 bis $ende <= 25 sind 26 Datensätze
  • Du läufst immer wieder (also je Seite) immer komplett alle Datensätze in der Schleife durch und gibst nur die zwischen $start und $ende aus? Ineffizient.

Du hast insgesamt gesehen ein PHP-Problem, kein DB-Problem. Deine Problemstellung ist gefühlt 100 Millionen mal unter dem Stichwort 'pagination' und ähnlich zu finden.

Um aber noch auf DB zu kommen: verwende niemals nie 'select *' in produktivem Code.
 
Ich habe so gesehen "< 25" geschrieben - ergo 25 Datensätze :)
Ja, ich führe das mysql_fetch_array immer wieder aus - das muss ich doch aber wohl auch, wenn ich Datensatz für Datensatz nacheinander abarbeiten will!?
Ja, ich laufe immer komplett alle Datensätze durch: Wie soll ich das auch sonst machen? Die Query mit LIMIT nur das gewünschte Intervall zurückgeben zu lassen, hat irgendwie nicht funktioniert!?
Was meinst Du mit dem * und dem "produktiven Code"?
 
Ja, ich laufe immer komplett alle Datensätze durch: Wie soll ich das auch sonst machen? Die Query mit LIMIT nur das gewünschte Intervall zurückgeben zu lassen, hat irgendwie nicht funktioniert!?
Damit führst Du aber auch bei z.B. 100 Datensätzen und je 25 pro Seite die Abfrage 4 mal aus, transportierst das 16-fache (4 Abfragen mit je dem 4-fachen an Daten als benötigt) an Daten zwischen DB und Applikation, brauchst dort das 4-fache an Speicher und nutzt nur 25% des RAM's, was Du in PHP allokierst, wirklich und 75% sind fürs Klo.
Je mehr Seiten es werden, umso ineffizienter wird der ganze Spaß.

LIMIT und OFFSET sind Deine Freunde, oder sogar noch besser CURSOR, da brauchst dann aber eine persistente Verbindung zur DB. (also ein und dieselbe Verbindung, aus DB-Sicht dieselbe Session. Ich weiß nicht, ob und wie das mit PHP machbar ist)

Was meinst Du mit dem * und dem "produktiven Code"?

https://www.pg-forum.de/viewtopic.php?f=66&t=4309
(etwas ähnliches habe ich hier auch schon mal gepostet, finde es nur nicht auf die Schnelle)

Andreas
 
Mja, dass das nicht so effizient ist, ist klar. Primär ging es mir ja auch darum, dass das generell mal funktioniert. Optimieren kann man das dann im Nachhinein :)

LIMIT und OFFSET:
Die Funktionsweise habe ich vom Prinzip her verstanden: LIMIT gibt die Anzahl der Datensätze an, OFFSET die Anfangsposition. Doch wenn ich das jetzt weiter richtig verstanden habe, dann bezieht sich beides immer auf die Anordnung der Daten in der Tabelle!? Was dann aber in meinem Fall zu dem Problem führen würde, dass in der Tabelle alles unsortiert ist. Deswegen ja auch das

Code:
ORDER BY substring(titel,1,100)

Frage: Geht das denn auch, dass ich erst mittels ORDER BY sortiere und LIMIT und OFFSET dann auf das Sortierte anwende?
 
Werbung:
Zurück
Oben