Zum Inhalt springen
ThreadPHP & MySQL

Blätterfunktion

Kategorie
PHP & MySQL
Gelesen
1676
Antworten
5
Erstellt von: gelöschter BenutzerDatum: 26.09.2010, 21:18 Uhr

Startbeitrag

Originaler Foreninhalt in modernisierter Darstellung.

Zur Kategorie
gelöschter Benutzer
Threadstart · PHP & MySQL 1676 mal gelesen · 26.09.2010, 21:18 Uhr

Hallo zusammen!

Ich habe im Web ein Script zum Blättern gefunden und in meine Buch-Archiv-Geschichte per include eingebaut und angepasst.

mysql_select_db('140_archiv', $db);
$sql = "select id from Tabelle1";

if (!isset($_REQUEST['Total']))
{
$result = mysql_query($sql);
$Total = mysql_num_rows($result);
unset($result);
}
else
{
$Total = $_REQUEST['Total'];
}
if (!isset($_REQUEST['Seite']))
{
$Seite = 1;
}
else
{
$Seite = $_REQUEST['Seite'];
}
if ($Seite > $Total) $Seite = $Total;

$ProSeite = 10;
$LinksZahl = 7;
$SeitenZahl = ceil($Total/$ProSeite);
if ($LinksZahl % 2 == 0) $LinksZahl++;
$NumerischeLinks = ($LinksZahl - 1) / 2;
$url = $_SERVER['PHP_SELF'];

$sql .= " limit ". ($Seite * $ProSeite - $ProSeite) .", ".$ProSeite;
$result = mysql_query($sql);
mysql_close($db);

$AuslassungszeichenVorn = '';
$AuslassungszeichenHinten = '';
$AnfangLink = '';
$EndeLink = '';
$ZurueckLink = '';
$WeiterLink = '';
$SichtbareLinks = '';

if ($SeitenZahl > 1)
{
$Nr = $Seite - $NumerischeLinks;
$Anzeige = 0;

while ($Nr <= $SeitenZahl)
{
if ($Nr < 1) {$Nr++; continue;}
elseif ($Nr > $Seite + $NumerischeLinks) {break;}
if ($Nr == $Seite) {$SichtbareLinks .= " $Nr";}
else {$SichtbareLinks .= ' '.$Nr.'';}
$Nr++;
$Anzeige++;
}
}

if ($Seite > 1)
{
$AnfangLink = ' Anfang';
if ($Seite - 1 > 1)
{
$ZurueckLink = ' Zurck';
}
}

if ($Seite < $SeitenZahl)
{
$EndeLink = ' Ende';
if ($Seite + 1 < $SeitenZahl)
{
$WeiterLink = ' Weiter';
}
}

if ($Seite - $NumerischeLinks > 1)
{
$AuslassungszeichenVorn = ' ...';
}
if ($Seite + $NumerischeLinks < $SeitenZahl)
{
$AuslassungszeichenHinten = ' ...';
}

$Nav = $AnfangLink;
$Nav .= $ZurueckLink;
$Nav .= $AuslassungszeichenVorn;
$Nav .= $SichtbareLinks;
$Nav .= $AuslassungszeichenHinten;
$Nav .= $WeiterLink;
$Nav .= $EndeLink;
print $Nav;

if ($SeitenZahl > $Anzeige)
{
print "
Seiten: $SeitenZahl
Gehe zu Seite
";

echo '
<form action="'.$url.'" method="post">
<input type="text" size="3" name="Seite"></input>
<input type="submit" value="Los"></input>
<input type="hidden" name="Total" value="'.$Total.'"></input>
</form>
';
}


Das funktioniert ja auch soweit, wie man am Ende der verlinkten Seite sehen kann.

Nur leider werden nicht die gesetzten 10 Datensätze angezeigt, sondern wie man sieht alle.

Nun ist das nicht so, das ich die Logik im Script nicht verstehe. Was mir bezüglich php fehlt, ist das Wissen über die Syntax.

Ich schätze mal, das die leeren Teile einiger DS hier das Problem sind

Für evtl. aufs Problem aufmerksam machen bedanke ich mich schon mal im voraus.

Gruß

Marcus

Antworten

5 Beiträge
gelöschter Benutzer
am 26.09.2010, 21:40 Uhr schrieb
Antwort

Sali,

ich hatte selbst mal eine solche Paginator-Funktion für 3 verschiedene Datentypen geschrieben:

floern.com/webscripting/paginator



Vielleicht nützt dir das was.
gelöschter Benutzer
am 26.09.2010, 22:02 Uhr schrieb
Antwort

Beide Code Beispiele sind ziemlich schlecht, allein schon wegen diesen stellen:

[sql]select id from Tabelle1;
SELECT * FROM tabelle WHERE spalte=\'iwas\' ORDER BY iwas[/sql]

Stellt euch da mal eine richtige Tabelle vor mit mehr als 1.000 Einträgen.
Ihr würdet immer alles abfragen obwohl ihr nur 10 DS braucht, sowas geht gar nicht.

Dadurch würde eine Datenmenge Transferiert die die Seite extrem verlangsamt und sogar zum Absturz des Server führen kann, das hab ich sogar schon mal erlebt.
Die Schuld wurde einen DDos Angiff gegeben, dabei war es der Betreiber selbst.

Foren Moderator Evil Genius Content Halbgott (973 Beiträge)
am 26.09.2010, 23:07 Uhr schrieb matthes
Antwort

Ultimas Einwand ist berechtigt, ich nutze folgendes und denke, das ist wesentlich besser:

$seite = (!empty($_GET[\'seite\'])) ? (int) $_GET[\'seite\'] : 1)-1; //Seitenzahl, erste Seite = 0
$anzeige = 10; //anzuzeigende Einträge pro Seite;
$erg=$db->query(\'SELECT SQL_CALC_FOUND_ROWS spalte
FROM tabelle
ORDER BY spalte LIMIT \'.$seite*$anzeige.\',\'.$anzeige); //gibt nur $anzeige Zeilen zurück
$gesamtzahlEintraege=$db->query(\'SELECT FOUND_ROWS();\'); //enthält die Gesamtzahl der Zeilen der Abfrage

//Einträge ausgeben
mach dies, tu jenes
//Seitenausgeben
$anzahlSeiten=ceil($gesamtzahlEintraege/$anzeige);
//Links zu den Seiten ausgeben


Make Seitenreport great again!
gelöschter Benutzer
am 26.09.2010, 23:44 Uhr schrieb
Antwort

Es ist wesentlich besser. Es wird genau das abgefragt was benötigt wird.
Und eine noch bessere Lösung als SQL_CALC_FOUND_ROWS hab ich bisher noch nie gesehen.