Datenbank auslesen und auf Seiten aufteilen

Hallo.

Ich versuche eine kleine Newsseite zu programmieren. Die Index.php habe ich so programmiert, dass alle Artikel ausgegeben werden (von neu nach alt). Jetzt möchte ich zur besseren Übersicht alle Artikel auf mehrere Seiten aufteilen (wie bei einem Blog üblich) und dann die Seiten mit index.php?p=1 etc. aufrufen.

Die Artikel rufe ich so auf: SELECT * FROM articles 10 ORDER BY article_datetime DESC

Dann benutze ich eine While-Schleife: while ($row = mysqli_fetch_array($data)) { … }

Ich bekomme einfach keine Idee, wie ich das anstelle.
Danke für alle Antworten

Hi sartOrial,
Leider kann ich dir hierzu nicht weiterhelfen und muss dich bitten, deine Anfrage an jemand anderen zu stellen.

Sorry.
Lg, Thomas

Ich geb dir mal nen Tipp … Zuerst berechnest du^^ die Summe der Datensätze und teilst diese durch die anzahl der Einträge auf deiner Seite … Nun hast du die Anzahl der seiten… Die aktuelle Seite wird per get ausgelesen und du berechnest aus der Seitenzahl dieaktuellen Datensätze… Zb auf seite 2 die Einträge 5 - 10…

Hallo,

select * from tabelle limit 5,10

Die erste Zahl (5) gibt an, wie viele Datensätze am Anfang übersprungen werden sollen. D.h. die Ausgabe beginnt bei diesem Beispiel mit dem 6. Datensatz. Die zweite Zahl (10) gibt an, wie viele Datensätze selectiert werden. D.h. es werden hier die Datensätze 6 bis 15 selectiert.

Für deine News Seite brachst zu zuerst mal eine Variable für die aktuelle Seiten.

z.B. url.page = 2

Dann brauchst du eine weitere Variable mit der Anzahl der Datensätze pro Seite. (Damit kannst du später die Anzahl der Artikel pro Seite leicht ändern)

z.B. number_of_records_per_page = 10

Diese Variable für die Anzahl der Datensätze kannst du dann direkt bei Limit in deinem Query einbauen.

select * from tabelle limit 5,$number_of_records_per_page

Jetzt fehlt noch die Anzahl der Datensätze die Übersprungen werden sollen, also die Datensätze auf den vorherigen Seiten die gerade nicht angezeigt werden.

Aktuell sind wir auf Seite 2, d.h. wir brauchen die Datensätze 11 bis 20. 10 Datensätze auf Seite 1 müssen im Query übersprungen werden.

skip_records = (url.page * number_of_records_per_page) - number_of_records_per_page

Am Beispiel:

skip_records = (2 * 10) - 10 = 10

Dann beide Variablen in deinen Query einbauen.

select * from tabelle limit $skip_records,$number_of_records_per_page

Hoffe ich konnte dir ein wenig weiter helfen.

Grüße, Christian

Hallo,

um eine Pagination in deine SQL Abfrage zu bekommen wird der Befehl „LIMIT“ verwendet.

Bei deinem konkreten Beispiel musst du die Seite („p“ Parameter) mit der Anzahl an Elementen die du pro Seite Darstellen willst Multiplizieren, damit du den Offset berechnen kannst. Offset ist die Anzahl an Elementen die Übersprungen werden sollen.

Hier mal das Beispiel bei 10 News auf der Seite:
$offset = ($page - 1) * 10; // bei der ersten Seite ziehe ich 1 ab, damit ich mit 0 * 10 ein
// Offset von 0 bekomme

$query = "SELECT * FROM articles ORDER BY article_datetime DESC LIMIT " . $offset . „, 10;“;

Bei Seite 2 würde in der ersten Zeile ein $offset von (2 - 1) * 10 = 10 berechnet werden… heißt als, deine SQL Query wird die ersten 10 News überspringen und dir die nächsten 10 News zurück geben.

Mit dieser Methode der Paginierung kannst du aber nur vor und zurück Navigieren, aber bekommst nicht die maximal Anzahl deiner Seiten - dafür musst du über eine Vorherige Abfrage erstmal bestimmen, wie viele News überhaupt in deiner Datenbank gespeichert sind und die Anzahl durch die Anzahl pro Seite Subtrahieren.

Beispiel zur Bestimmung der maximal Seite:
$query = „SELECT count(*) FROM articles“;

Eine Frage noch: warum hast du hinter „articles“ eine 10 stehen? Die passt soweit ich das sehen kann nicht in deine SQL Abfrage hinein. Das einzig gültige nach der Tabellen angabe wär ein Alias zu setzen, z.B. „articles as a“. Hab die Angabe einfach mal in meinen Beispielen weg gelassen, falls sie doch für irgendwas gebraucht wird, was ich jetzt noch nicht erkannt habe, kannst du die 10 ja wieder dazu packen.

Genauere Erklärungen zu „limit“ findest du auch in den MySQL Dokumentation:
http://dev.mysql.com/doc/refman/5.0/en/select.html
Oder auf privaten Seiten, etwas einfacher erklärt :wink:
http://php.about.com/od/mysqlcommands/g/Limit_sql.htm

Hoffe dir helfen zu können.

Viele Grüße
Frank

Hallo!

Dafür brauchst du einen Pager. Normalwrweise würde man eine PHP-Klasse arbeiten, die diese komplette Paging-Funktionalität kapselt. Für den Anfang sollte es aber ausreichen, das mit ein wenig PHP-Code und LIMIT-Direktiven in der SQL-Query zu realisieren, also z.B.:

select * from table where 1 limit 20, 10

Gruß Daniel

Hallo,

ich ziehe normalerweise die ganze Geschichte etwas anders auf:
Du brauchst als Ergebnis einen Array, den Du später bei Deinen index-Aufrufen abarbeiten kannst.

Meine Funktion für solche Geschichten lautet:

function auslesenTabelle($qry)
{
$listingNews = array();
include_once („db_verbindung_herstellen.php“);
$result=MYSQL_QUERY( $qry);
$num = mysql_numrows($result);
for ($i = 0; $i

Hallo sartOrial,

mach’s doch wie bei http://www.blog.de/ und pack Deine Ausgabe in ein . Du kannst mit substr() die Länge begrenzen und in einen href packen:
Angenommen Deine Tabelle hat eine Spalte für „id“ ID’s und „text“ für den Inhalt:

echo ’ ';
while( $row = mysqli_fetch_array($data)){
$hrefText = substr( $row[‚text‘], 0, 20);
echo ‚’.$hrefText.’‘;
echo ’ ';

in einem weiteren div kannst Du dann den Datensatz mit der übergebenen id raussuchen und ausgeben.

Viel Erfolg,
Martin

Hallo,

Am besten lässt sich das über eine Erweiterung des SQL-Statements lösen. Denn dann muss PHP sich nicht mit Unmengen an Daten herumschlagen. Der Befehl den du dafür brauchst heist LIMIT.
Er kann 2 Parameter aufnehmen als erstes das Offset als ab dem wievielten die Zeilen ausgegeben werden sollen und als zweites die Anzahl der Zeilen.
z.B.

SELECT \* FROM mytable LIMIT 10,5;

Dieses Statement liefert die Zeilen 11 bis 15 also genau 5 Zeilen.Genauere Info zu LIMIT hier
Wenn du jetzt diese limits per PHP setzt z.b.

$sql = 'SELECT \* FROM mytable LIMIT '.($i\*$pagemax).','.$pagemax.';';

und $i als Seitenzähler benutzt wird bekommst du immer $pagemax Zeilen die du anzeigen kannst.
Wichtig ist dann nur noch die Anzahl der Seiten, die du mit

SELECT CEIL(COUNT(id)/$pagemax) FROM mytable

Wichtig ist nur das du die Zahl aufrundest(wird durch CEIL gemacht) damit du zum Schluss die letzten paar Beiträge anzeigen kannst.

Hoffe das hilft dir n bisschen weiter :wink:

Gruß

Arne

PS: Die Statements sind alle ungetestet kann also sein das dort kleine Korrekturen nötig sind aber das Prinzip sollte klar werden denke/hoffe ich.

Hi,

die Lösung heisst „LIMIT“ (die du auch schon in den Tags drin stehen hast oO).

z.B. :
SELECT * FROM your_table LIMIT 5, 5

Damit kannst du vom 5 Ergebnis 5 weitere anzeigen lassen. Du kannst die „Startposition“ dann einfach Übergeben und in das query bringen. Dabei sollte man aber immer absichern, dass es sich wirklich um einen gültigen Parameter (isInt) handelt. Ansonsten bekommst du SQL injects und deine DB wird Kompromittiert.

Noch besser -> http://www.cakephp.org und Pagination nutzen. Macht diese Aufgabe für dich und gibt deiner Seite eine wesentlich bessere Struktur. Das Blogtutorial liefert dir auch gleich alles was du brauchst + tausend goodies an die man vorher noch nicht gedacht hatte.

Cheers
http://esync.de

Hallo,

Du kannst in deiner Query ein Limit mit Offset angeben:
'SELECT * FROM articles 10 ORDER BY article_datetime DESC LIMIT ’ . (intval($_GET[‚p‘])-1)*$newsPerPage . ', ’ . $newsPerPage;
Der erste Parameter gibt den ersten Newseintrag an, der zurückgeliefert werden soll, der zweite Parameter die Anzahl der auszulesenden Einträge.
Siehe: http://dev.mysql.com/doc/refman/5.5/en/select.html

Viele Grüße,
Stefan

Hallo,

es wäre nette, wenn du eine Rückmeldung gibst, ob du noch weitere Fragen hast oder ob du mit der Erklärung zurecht gekommen bist.

Viele Grüße

Hallo Frank

Herzlichen Dank für deine ausführliche Antwort. Ich habe nun Zeit gefunden und konnte es genau nach deinen Erklärungen einbauen - und es funktioniert hervorragend. Die 10 stammt fälschlicherweise aus einem meiner Versuche und wird nicht benötigt.

Herzlichen Dank nochmals und freundliche Grüsse

Hallo

Danke viel Mals, du konntest mir hervorragend weiter helfen. Mit der neuen LIMIT-Variablen konnte ich es nun realisieren.

Danke nochmals und freundliche Grüsse

freut mich das ich helfen konnte :smile:

SELECT * FROM articles 10 ORDER BY article_datetime DESC LIMIT X, Y

X = Starteintrag
Y = Anzahl Einträge

Ich versuche eine kleine Newsseite zu programmieren. Die
Index.php habe ich so programmiert, dass alle Artikel
ausgegeben werden (von neu nach alt). Jetzt möchte ich zur
besseren Übersicht alle Artikel auf mehrere Seiten aufteilen
(wie bei einem Blog üblich) und dann die Seiten mit
index.php?p=1 etc. aufrufen.

Die Artikel rufe ich so auf: SELECT \* FROM articles 10 ORDER BY article\_datetime DESC

Dann benutze ich eine While-Schleife: while ($row =
mysqli_fetch_array($data)) { … }

Prinzipiell benötigst Du bei Deiner Anfrage das Attribut(?) LIMIT, das angibt, wie viele Artikel auf der anzuzeigenden Seite erscheinen sollen.
Damit auch weitere angezeigt werden, musst Du in einer Hilfsvariablen erst einmal die Gesamtanzahl der Artikel ermitteln, und dann in der „Navigationsleiste“ (die standardmäßig unter den 10 angezeigten Artikeln angezeigt wird) verlinken.
Vom Prinzip her lässt Du beispielsweise von 100 Artikeln die ersten 10 anzeigen. Danach folgen 9 weitere Links (11-20, 21-30, etc.).
Die Links zu den weiteren Artikeln rufen die gleiche Seite auf, allerdings mit einer MySQL-Abfrage, die nicht beim ersten Artikel beginnt, sondern beim 11, dem 21, usw.
Wenn Dir der Denkanstoß nicht reicht heißen die magischen Wörter bei der Suchmaschine Deines Vertrauens:
mysql, php, LIMIT, blättern.

Ich hoffe, dass Dir das hilft.

Gruß,
Dirk