MySQL - Seiten sinnvoll?
lima-city → Forum → Programmiersprachen → PHP, MySQL & .htaccess
abfrage
anzahl
ausgeben
beispiel
code
datenbank
datum
element
frage
funktion
limit
liste
offset
operator
page
rechnen
stelle
strich
zahl
zeile
-
Hallo
Ich würde gerne eine lange Liste ausgeben, die aus einer Datenbank ausgelesen wurde.
Was mich nun interessiert ist, ob es Sinn macht diese Liste in Seiten aufzuteilen.
Verbraucht man da weniger Ressourcen?
Sagen wir mal es sind 100 Elemente (in einer Datenbank mit 7 Spalten) und man teilt sie auf 10 Seiten auf.. um sie auf Seiten aufzuteilen muss aber doch sowieso erst einmal die Datenbank gelesen werden, oder? D.h. es werden eh alle Daten ausgelesen -> man kann auch gleich alles auf einer Seite ausgeben?
Oder gibt es eine ressourcensparende Möglichkeiten Seiten zu machen?
mfg -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
Beim MySQL Select Befehl gibt es das Argument LIMIT, dieses beschränkt die auszugebende Menge. Dadurch wird auch die Last vom MySQL Server genommen, jedesmal alle Daten auszugeben.
Mal angenommen man wollte aus der Liste die Elemente 21 bis 30 haben:
SELECT daten FROM liste LIMIT 21, 10
Einen wirklichen Performance Unterschied bemerkt man wahrscheinlich erst bei Listen mit mehr als 1000 Einträgen. Dennoch ist es programmiertechnisch angenehmer MySQL diese Aufteilung zu überlassen (spart einige Zeilen in PHP :)). -
Hallo
Das ist ja praktisch :-) Vielen Dank!
Bloß das mit dem Zeilen sparen hab ich nicht verstanden *biggrin*
Kann man irgendwie:
$seite = $_GET[seite]; $seitex = $seite-1 $abfrage = "SELECT * FROM liste LIMIT $seitex 1, 10"
machen?
Beispiel:
?seite=3
$seitex = 3-1
$abfrage = "SELECT * FROM liste LIMIT 21,10"
Das wäre praktisch :-)
Und was ist dann, wenn man zum Beispiel Seite 235346 eingibt, aber es gar nicht so viele Elemente in der Datenbank gibt. Gibts dann einen Error?
mfg
Beitrag zuletzt geändert: 12.2.2011 17:28:15 von voloya -
Hiho.
das geht schon, um eine Seite auszugeben, musst du wissen wie viele Datensätze du auf deiner Seite anzeigen möchtest.
// Wie viele Datensätze ausgeben? $duration = filter_input(INPUT_GET, 'duration', FILTER_SANITIZE_NUMBER_INT); // Seite ermitteln $page = filter_input(INPUT_GET, 'page', FILTER_SANITIZE_NUMBER_INT); $page = $page === 0 ? 1 : $page; $duration = $duration < 10 ? 10 : $duration; $offset = $page * $duration; $query = "SELECT * FROM liste LIMIT $offset, $duration";
Bei geringeren Datenmengen ist es für die Performance der Datenbank erst einmal zu vernachlässigen ob du das Ergebnis limitierst. Für die Ausgabe durch PHP spielt das aber schon eher eine Rolle, je nach dem wie viele HTML Elemente pro Datensatz erzeugt werden.
Für den Menschen ist es einfach weniger anstrengend, die Daten in kleinen Gruppen einsehen zu können.
Beitrag zuletzt geändert: 12.2.2011 17:53:40 von justarustyspoon -
Rein logisch gesehen musst du erst ausrechnen, wie viele Datensätze zum gewünschten Kriterium du überhaupt besitzt. Danach wird die Anzahl der Datensätze durch die Anzahl der Datensätze, die auf der Seite angezeigt werden sollen geteilt und je nach aufgerufener Seite der MySQL Eintrag von bis angezeigt.
Relativ einfach :)
Beitrag zuletzt geändert: 12.2.2011 17:56:37 von fabo -
Hallo
fabo:
wenn ich aber erst auslese, wie viele Elemente in der Datei sind, kann ich doch auch gleich alle auf einer Seite ausgeben?
justarustyspoon:
Oh Graus, ich bin da jetzt echt verloren
filter_input, filter_sanitize_number_int und input_get, genauso wie viele weitere Kleinigkeiten habe ich noch nie gesehn
Kannst du das vielleicht für ganz Doofe erklären?
mfg -
voloya schrieb:
Und was ist dann, wenn man zum Beispiel Seite 235346 eingibt, aber es gar nicht so viele Elemente in der Datenbank gibt. Gibts dann einen Error?
Wie justarustyspoon ja schon schrieb, kannst du für die erste Zahl bei LIMIT einfach die Seitenzahl * Anzahl der Elemente pro Seite rechnen, um die Startposition zu erhalten.
Wenn eine zu hohe Seitenzahl verwendet wird, wird dir MySQL 0 Elemente zurück geben. Dies kannst du ja prüfen. Falls dies der Fall ist, gibst du halt irgendwas aus nach dem Motto: "Auf dieser Seite gibt es nichts!".
Beispiel:
$query = mysql_query("SELECT daten FROM liste LIMIT 21, 10"); if (mysql_num_rows($query) == 0) { echo "Auf dieser Seite gibt es nichts!"; }
-
voloya schrieb:
justarustyspoon:
Oh Graus, ich bin da jetzt echt verloren
filter_input, filter_sanitize_number_int und input_get, genauso wie viele weitere Kleinigkeiten habe ich noch nie gesehn
Kannst du das vielleicht für ganz Doofe erklären?
mfg
Hiho.
An der Stelle könnte genauso gut folgendes stehen:
$page = $_GET['page']; $duration = $_GET['duration'];
Damit gelangen dann aber Daten aus der URI ungefiltert in dein Skript und in deine Datenbank, und natürlich können die von einem gelangweilten User auch mal etwas... modifziert sein oder von deinen Erwartungen abweichen.
Daher bin ich dafür, generell Werte die von Unbekannt kommen, zu überprüfen.
Das macht die Funktion filter_input(). Mit der Konstanten INPUT_GET wird der Funktion mitgeteilt, sie soll sich auf die GET Parameter stürzen, im zweiten Argument, ist der Name des Parameters definiert. Und FILTER_SANITIZE_NUMER_INT ist einfach der Filter der von filter_input() angewendet wird. In diesem Fall ein Filter, der prüft ob die Eingabe eine Ganzzahl ist und ggf. zu einer Ganzzahl korrigiert.
Diese Funktion ist seit PHP 5.2 verfügbar, man kann auf viele Arten überprüfen ob die Benutzereingaben, das sind, was man erwartet. Zum Beispiel etwas verständlicher:
$page = $_GET['page']; $duration = $_GET['duration']; if(!is_int($page) || !is_int($duration)) { // Skript beenden bei Manipulationsversuch // oder diplomatischer: // dem User mitteilen, dass die Seitenzahl oder die Anzahl der Datensätze so nicht gültig sind }
Beitrag zuletzt geändert: 12.2.2011 18:18:39 von justarustyspoon -
Hallo
Aaachso vielen Dank
Jetzt wird mir schon einiges klarer. Tut mir Leid, ich kenne nur altes und einfaches PHP von php-einfach.de
Ich verstehe aber leider immer noch nicht alles <:
Nämlich:
$page = $page === 0 ? 1 : $page; $duration = $duration < 10 ? 10 : $duration;
Das sieht aus wie eine IF-Abfrage?
Falls kleiner 10, dann 10?.. nein?
mfg .wave: -
voloya schrieb:
Ich verstehe aber leider immer noch nicht alles <:
Nämlich:
$page = $page === 0 ? 1 : $page; $duration = $duration < 10 ? 10 : $duration;
Das sieht aus wie eine IF-Abfrage?
Falls kleiner 10, dann 10?.. nein?
Das ist der Fragezeichen Operator.
BEDINGUNG (wie bei IF in der Klammer) ? Aktion bei TRUE : Aktion bei FALSE
Beitrag zuletzt geändert: 12.2.2011 18:25:49 von stefan1200 -
voloya schrieb:
Ich verstehe aber leider immer noch nicht alles <:
Nämlich:
$page = $page === 0 ? 1 : $page; $duration = $duration < 10 ? 10 : $duration;
Das sieht aus wie eine IF-Abfrage?
Falls kleiner 10, dann 10?.. nein?
mfg .wave:
Richtig.
Das ist synonym zu:
if($duration < 10) { $duration = 10; }
Das nennt sich ternärer Operator
Beitrag zuletzt geändert: 12.2.2011 18:32:55 von justarustyspoon -
Hallo
Achso okay :)
Vielen Dank für all die Hilfe und Erklärungen.
Ich hab noch ein paar Fragen ;)
$page = $page === 0 ? 1 : $page;
Wieso stehen da drei "="? Normal benutzt man doch eines, oder vielleicht mal zwei? Wenns halt einfach so gehört, dann entschuldigt meine dumme Frage
$offset = $page * 10;
Da auf Seite 1 ja Beitrag 1-10 ausgegeben wird, auf Seite 2 Beitrag 11-20,.. kann ich auch
$offset = ($page*10)+1
machen? (Meine Frage ist einfach: Kann PHP so rechnen? Mit Punkt vor Strich?)
Danke im Voraus, ich mach mich dann mal ans Schreiben und werde erst dann wieder antworten wenn ich weitere Fragen habe (Doppelposts sind hier ja nicht möglich -.-).
Ihr habt mir echt geholfen. Eigentlich wollte ich ja nur fragen, ob Seiten Sinn machen, aber ich hätte bestimmt eine Ewigkeit gebraucht um herauszufinden wie man das am besten realisiert :)
mfg und einen schönen Abend -
voloya schrieb:
Hallo
Ich hab noch ein paar Fragen ;)
$page = $page === 0 ? 1 : $page;
Wieso stehen da drei "="? Normal benutzt man doch eines, oder vielleicht mal zwei? Wenns halt einfach so gehört, dann
Ein Gleichheitszeichen wird bei Wertzuweisungen benutzt.
Zwei bei Vergleichsoperationen.
Drei bei Vergleichsoperationen die auch den internen Datentyp der Variable berücksichtigen.
An der Stelle würden auch == funktionieren. Ich bevorzuge aber === da ich damit die Typsicherheit sicherstelle.
if("foo" == 0) { echo "bar"; }
Würde bar ausgeben, da PHP intern "foo" in eine Zahl konvertiert.
$foo = 15; if($foo == true) { echo "bar"; }
Würde bar ausgeben, da für PHP die Zahl 15 auch als true gewertet wird.
Das kann unter Umständen zu langen Fehlersuchen führen, da ein Skript nicht so arbeitet, wie man es erwartet. Wenn man zum Beispiel einen boolschen Wert (true / false) erwartet aber ein String oder eine Zahl dazwischen gerät.
voloya schrieb:
$offset = $page * 10;
Da auf Seite 1 ja Beitrag 1-10 ausgegeben wird, auf Seite 2 Beitrag 11-20,.. kann ich auch
$offset = ($page*10)+1
machen? (Meine Frage ist einfach: Kann PHP so rechnen? Mit Punkt vor Strich?)
Wie die meisten Programmier- und Skriptsprachen rechnet auch PHP Punkt vor Strich. ;)
Du wirst an der Stelle sowieso noch etwas korrigieren und ausprobieren müssen, bis du raus hast, wie man den richtigen "Startpunkt" ermittelt. Momentan dürfte es relativ schwer sein Datensätze von 0 bis n auszugeben. ;)
Tut mir leid, dass diese Zeilen Code oben so viele Fragen aufgeworfen haben.
Beitrag zuletzt geändert: 12.2.2011 19:49:19 von justarustyspoon -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage