PHP + MSSQL: Seitennummerierung

msycho

Erfahrenes Mitglied
Hallo!

Ich möchte meine Datenbankabfrage bzw. die Ausgabeauf mehreren Seiten verteilen. So sollen pro Seite 10 Datensätze angezeigt werden. Für MySQL hatte ich viele Tutorials gefunden. Dort wird das unteranderem mit LIMIT umgesetzt. Diese Funktion kennt MSSQL jedoch nicht. Ich bin bis dato leider noch nicht auf ein Tutorial für MSSQL gestoßen, könnt Ihr mir weiterhelfen bitte?

Gruß
 
Hi

ich habe mir den Beitrag zufällig mal gespeichert.
http://www.tutorials.de/forum/relat...mssql-server-ergebniszeilen-beschraenken.html

In mssql gibt es den top. Man kann bei einem Paging auch die 10 Datensätze abfragen, die > bzw. < als die letzte id ausgegeben werden.

Dies ist zwar jetzt ein Artikel aus dem ASP-Bereich, aber die Abfragen könnte man auch in php so setzen. Evtl. ein Denkanstoß.
http://www.aspheute.com/artikel/20000403.htm
einfach auch mal das Listing ansehen und die entsprechende Abfrage.
 
Zuletzt bearbeitet:
Es geht auch ohne LIMIT. Dazu musst Du allerdings bei jedem Blättern der Seite die komplette Datenbanktabelle mit deiner Abrage einlesen. Das result Objekt wird dann in ein Array überführt und mit einer for Schleife liest Du die relevanten Datensätze aus.

In etwa so:

for ($i = $pagenumber * 10; $i < ($pagenumber+1) * 10 - 1; $i++)
{
Ausgabe( $result_array[$i]);
}

Achtung: die Seitennummerierung beginnt bei 0.
 
@cheops: Werden mit "Select top" automatisch die Seiten ausgerechnet und diese dann nachher auch zusätzlich mit einem Weiter- und Zurücklink ausgegeben, sodass jede Seite nur 5 Datensätze besitzt?

@Luzie: Mit dem Artikel kann ich nichts anfangen, da ich von ASP keine Ahnung habe. Trotzdem danke.

@fenriz: An Dich gilt auch die Frage wie an cheops wie das mit den Links ausschaut.
 
Hallo,

veilleicht hilft dir ja dieses Beispiel als SQL-String weiter:

PHP:
SELECT * FROM (
	SELECT TOP x * FROM (
		SELECT TOP y feld
		FROM tabelle
		ORDER BY tabelle.feld  ASC) as foo
	ORDER by feld DESC) as bar
ORDER by feld ASC

Wobei x die Anzahl der zurückgegebenen Zeilen ist, also 10, und y ist x + Stelle wo du bist.

Dabei muss die Stelle an der du bist, aus dem Link (für Weiter und Zuürck) kommen. Dies ist dann das Gleiche was auch fenriz meint:

Für die nächste Seite:
HTML:
<a href="<?=$_SERVER['PHP_SELF']?>?offest=10">Weiter</a>

Gruß.
 
Genau, mehr kann man dazu nicht sagen.
Die Variable Offset im Link muss dann bei jedem Vorblättern um 10 erhöht werden. Beim Zurückblättern entsprechend vermindert werden. Zusätzlich sollte überprüft werden, das der Offset die Anzahl der Datensätze in der Tabelle nicht überschreitet oder nicht kleiner als null wird.

Anmerkung: Get Variablen vor Verwendung immer auf Gültigkeit prüfen, um u.a. SQL Injection zu vermeiden.
 
Ich danke Euch schonmal.

Komme ich so der Sache näher?

PHP:
[ Datenbankverbindung aufbauen ]
$seite = $_GET['seite']; 
if($seite == "") {
 $seite = 1;
}
$ZeilenProSeite = 5;
$Zeilenanfang = ($seite-1)*$ZeilenProSeite + 1;
$msquery = "SELECT * FROM (
    SELECT TOP 5 * FROM (
        SELECT TOP $dsanzahl feld
        FROM tabelle
        ORDER BY tabelle.feld  ASC) as foo
    ORDER by feld DESC) as bar
ORDER by feld ASC " ;
$msresults = mssql_query($msquery);
$dsanzahl = mssql_num_rows ($msresults);
$seiteninsgesamt = ceil($dsanzahl / $ZeilenProSeite);


if($seite < $seiteninsgesamt){ 
    $weiter = ($seite + 1);    
    echo "<a href=\"".$_SERVER['PHP_SELF']."?seite=$weiter\">Weiter >></a>"; 
}

Das ist so falsch bzw. unvollständig, stimmts? Was den Wert y angeht, den müsste ich ja jedesmal neu bestimmen, sprich durch eine Variable müsste die Anzahl der Datensätze ausgelesen werden, die dann für das y stehen.
Könnt Ihr mir weiterhelfen?
 
Hallo.

Versuche es mal so:

PHP:
[ Datenbankverbindung aufbauen ]
$zeilenProSeite = 5;

$seite = $_GET['seite']; 
if($seite == "" && $seite <= 0) {
  $seite = 0;
} else {
  $seite += $zeilenProSeite;
}

$msquery = "SELECT * FROM (
    SELECT TOP $zeilenProSeite * FROM (
        SELECT TOP $seite feld
        FROM tabelle
        ORDER BY tabelle.feld  ASC) as foo
    ORDER by feld DESC) as bar
ORDER by feld ASC " ;
$msresults = mssql_query($msquery);

echo "<a href=\"".$_SERVER['PHP_SELF']."?seite=$seite\">Weiter >></a>";

Gruß.
 
Ich habe noch den zurück-Link eingefügt:

PHP:
[ Datenbankverbindung aufbauen ]
$zeilenProSeite = 5;

$seite = $_GET['seite']; 
if($seite == "" && $seite <= 0) {
  $seite = 0;
} else {
  $seite += $zeilenProSeite;
}

$msquery = "SELECT * FROM (
    SELECT TOP $zeilenProSeite * FROM (
        SELECT TOP $seite feld
        FROM tabelle
        ORDER BY tabelle.feld  ASC) as foo
    ORDER by feld DESC) as bar
ORDER by feld ASC " ;
$msresults = mssql_query($msquery);

echo "<a href=\"".$_SERVER['PHP_SELF']."?seite=$seite\"><< Zur&uuml;ck</a>"; 
echo "<a href=\"".$_SERVER['PHP_SELF']."?seite=$seite\">Weiter >></a>";

Das stimmt so, oder? Nur wie Zeige ich jetzt die einzelnen Seiten an, bitte?

Noch eine weitere Frage zur Abfrage:
Welches Feld muss ich bei "feld" (kommt drei mal vor) eintragen? Und was bei "tabelle.feld" bzw. wie krieg ich das mit dem hier zusammen, bitte?
 
Zuletzt bearbeitet:

Neue Beiträge

Zurück