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
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…
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.
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.
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.:
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
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:
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
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.
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.
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
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.
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.