PHP + MSSQL: Seitenaufteilung

Danke. Das mit dem single und double quoted habe ich jetzt verstanden.

Was ist aber nicht verstehe, sind Deine beiden Beispiele. Ich habe mich seit Deinem letzten Post ausgiebig mit den beiden Codeschnipseln beschäftigt, nur irgendwie will ich es nicht verstehen.
Lasse ich mein Script unverändert, bis auf die Ausgabe der Weiter- und Zurück-Links, werden diese zwar angezeigt, aber es geschieht bei einem Klick auf einen der Links nichts. Sprich ich werde nicht zur nächsten bzw. zur vorigen Seite gelinkt.
Was Dein zweites Beispiel betrifft, ist das eine eigene Abfrage, oder muss/soll man die mit dieser hier zusammen bringen:

PHP:
$query = 'SELECT * ' 
       . 'FROM (' 
        
       . 'SELECT TOP ' . $zeilenProSeite . ' * ' 
       . 'FROM ( ' 
       . '    SELECT TOP ' . ($zeilenProSeite * $seite) . ' * ' 
       . '    FROM testtabelle' 
       . '    ' . $where
       . '    ORDER BY testspalte ASC' 
       . '  ) AS foo ' 
       . 'ORDER BY testspalte DESC' 
        
       . ' ) AS bar ORDER BY testspalte ASC';

Weil wenn ich das wie eine neue Abfrage behandele, werden mir die beiden Links "Weiter" und "Zurück" nicht angezeigt.

Ich denke ich habe mit Sicherheit etwas falsch interpretiert.
 
OK also das mit den Seiten ist folgender maßen, es wird "automatisch" berechnet wie viele inneren Zeilen in der Abfrage benötigt werden ($zeilenProSeite * $seite) um zur nächsten Seite zu gelangen muß folglich bei dem übergebenen Parameter der Wert um 1 erhöht werden.
Es wird also nun zuerst die ersten Zeilen selektiert, die im vergleich zum vorherigen Seitenaufruf so aussehen würden: $zeilenProSeite * ($seite+1).
Oder ganz einfach gesagt: es ist wie in einem Buch (ist das erste Beispiel)
nächste Seite = aktuelle Seite + 1
vorherige Seite = aktuelle Seite - 1

Beide Abfragen müssen einzeln ausgeführt werden schließlich brauchst du ja eine Art Referenzpunkt, wenn du sagst du hättest gerne 30% Schnitzel in der Gaststätt wirst du auch erstmal angeschaut wie ein Alien. Wenn du dagegen sagst 30% von dem Argentienischen 1,5KG Broken ist das zwar immer noch etwas seltsam aber zumindest klar.
Und hier ist das ähnlich, wenn du sagst du willst den letzten Eintrag von irgendetwas weisst aber weder wo du bist noch bis wohin du gehen kannst, dann ist das ziemlich nunja blöd.
Quasi dafür steht der erste Block erstmal schauen was wir denn alles anstellen können
PHP:
/* das $where steht für deine "Bedingungsauswertung, muss also schon erstellt worden sein */
$query = 'SELECT ' 
       . '      COUNT(*) AS seite_anzahl '  
       . '  ,   1 AS seite_erste '  
       . '  ,   CEILING( COUNT(*) / ' . $zeilenProSeite . ' ) AS seite_letzte '  
       . 'FROM testtabelle '  
       . '' . $where; 

/* ... hier Abrufen der Ergebnisse ... */ 

/* nachschaun ob die übergebene Seitennummer hinkommt, also weder zu groß noch zu klein */
$seite = $_GET['seite'];  
if( empty( $seite ) || && $seite < $row['seite_erste'] || $seite > $row['seite_letzte'] )  
{ 
  $seite = $row['seite_erste']; 
} 

/* jetzt wo die gewünschte Seite bekannt ist auswerten ob es möglich ist weiter bzw zurück zu gehen */
$zeigeWeiter  = false; 
$zeigeZurueck = false; 

/*wenn die aktuell Seite größer als die erste ist, dann können wir auch zurück */
if ( $seite > $row['seite_erste'] ) 
    $zeigeZurueck = true; 
     
/* anlog zu oben */
if ( $seite < $row['seite_letzte'] ) 
    $zeigeWeiter  = true;

/* an diesem Punkt kommt jetzt deine eigentlich Abfrage ... */
/* und noch ein paar andere Sachen -- oder auch nicht */

/* ausgeben der Ergebnisse bla und so weiter */
/* jetzt kommt der Teil wo der Zurücklink eingebaut werden soll */
if ( $zeigeZurueck ) 
{ 
    echo '<a href="' . $_SERVER['PHP_SELF'] . '"?seite=' . ($seite - 1) .'">&lt;&lt; Zur&uuml;ck</a>';  
}

/* anderer Quälcode */
/* jetzt kommt der Teil wo der Vorwärtslink eingebaut werden soll */
if ( $zeigeWeiter ) 
{ 
    echo '<a href="' . $_SERVER['PHP_SELF'] . '"?seite=' . ($seite + 1) .'">Weiter &gt;&gt;</a>';   
}
/*...*/
 
Dank Dir für die ausführliche Kommentierung. Ist echt sehr verständlich und ich habe auch wieder einiges dazugelernt.

Ich habe jetzt mal testweise den Code einfach übernommen, nur muss ich Dir ehrlich gestehen, dass ich nicht weiß was ich da noch erweitern soll. Du machst in dem Beispiel anhand von Kommentaren deutlich, dass da noch etwas fehlt, zum Beispiel
"/* an diesem Punkt kommt jetzt deine eigentlich Abfrage ... */
/* und noch ein paar andere Sachen -- oder auch nicht */ ".

Ich hab jetzt den Code mal komplett an einem Stück übernommen:

PHP:
$zeilenProSeite = 10;
$queryseite = 'SELECT ' 
       . '      COUNT(*) AS seite_anzahl '  
       . '  ,   1 AS seite_erste '  
       . '  ,   CEILING( COUNT(*) / ' . $zeilenProSeite . ' ) AS seite_letzte '  
       . 'FROM testtabelle '  
       . '' . $where; 
       
$sqlseite = mssql_query($queryseite) or die (mssql_get_last_message());

/* nachschaun ob die übergebene Seitennummer hinkommt, also weder zu groß noch zu klein */
$seite = $_GET['seite'];  
if( empty( $seite ) || && $seite < $row['seite_erste'] || $seite > $row['seite_letzte'] )  
{ 
  $seite = $row['seite_erste']; 
} 

/* jetzt wo die gewünschte Seite bekannt ist auswerten ob es möglich ist weiter bzw zurück zu gehen */
$zeigeWeiter  = false; 
$zeigeZurueck = false; 

/*wenn die aktuell Seite größer als die erste ist, dann können wir auch zurück */
if ( $seite > $row['seite_erste'] ) 
    $zeigeZurueck = true; 
     
/* anlog zu oben */
if ( $seite < $row['seite_letzte'] ) 
    $zeigeWeiter  = true;

/* an diesem Punkt kommt jetzt deine eigentlich Abfrage ... */
/* und noch ein paar andere Sachen -- oder auch nicht */

/* ausgeben der Ergebnisse bla und so weiter */
/* jetzt kommt der Teil wo der Zurücklink eingebaut werden soll */
if ( $zeigeZurueck ) 
{ 
    echo '<a href="' . $_SERVER['PHP_SELF'] . '"?seite=' . ($seite - 1) .'">&lt;&lt; Zur&uuml;ck</a>';  
}

/* anderer Quälcode */
/* jetzt kommt der Teil wo der Vorwärtslink eingebaut werden soll */
if ( $zeigeWeiter ) 
{ 
    echo '<a href="' . $_SERVER['PHP_SELF'] . '"?seite=' . ($seite + 1) .'">Weiter &gt;&gt;</a>';   
}

Es erscheint jedoch folgende Fehlermeldung:

Parse error: syntax error, unexpected T_BOOLEAN_AND in ** on line 264

Zeile 264 ist folgende:

PHP:
if( empty( $seite ) || && $seite < $row['seite_erste'] || $seite > $row['seite_letzte'] )

Verstehe mich bitte nicht falsch, ich möchte nicht, dass Du mir das einfach alles vorkaust, aber wenn ich das jetzt richtig verstanden habe, fehlt doch nichts mehr, oder?
 
Also den Query hast du ja schon abgeschickt, jetzt brauchst du nur noch die Ergebnisse auch "abholen".
PHP:
$zeilenProSeite = 10;
$queryseite = 'SELECT ' 
       . '      COUNT(*) AS seite_anzahl '  
       . '  ,   1 AS seite_erste '  
       . '  ,   CEILING( COUNT(*) / ' . $zeilenProSeite . ' ) AS seite_letzte '  
       . 'FROM testtabelle '  
       . '' . $where; 
       
$sqlseite = mssql_query($queryseite) or die (mssql_get_last_message());

$row = mssql_fetch_array($sqlseite);

if ( $row == false ) die( 'this should never happen');

letzterer Fehler ist schlicht Unachtsamkeit von mir
PHP:
if( empty( $seite ) || $seite < $row['seite_erste'] || $seite > $row['seite_letzte'] )
 
Zuletzt bearbeitet:
So jetzt klappt schonmal die Ausgabe. Die Links bzw. nur der Link "Weiter" (wenn man sich auf Seite 1 befindet) wird angezeigt, allerdings wird man nicht weitergelinkt wenn man draufklickt.

Jetzt passt doch alles, oder?

PHP:
$zeilenProSeite = 5;

$queryseite = 'SELECT ' 
       . '      COUNT(*) AS seite_anzahl '  
       . '  ,   1 AS seite_erste '  
       . '  ,   CEILING( COUNT(*) / ' . $zeilenProSeite . ' ) AS seite_letzte '  
       . 'FROM testtabelle '  
       . '' . $where; 
       
$sqlseite = mssql_query($queryseite) or die (mssql_get_last_message());

$row = mssql_fetch_array($sqlseite);

if ( $row == FALSE ) die (mssql_get_last_message());

/* nachschaun ob die übergebene Seitennummer hinkommt, also weder zu groß noch zu klein */
$seite = $_GET['seite'];  
if ( empty( $seite ) || $seite < $row['seite_erste'] || $seite > $row['seite_letzte'] )  
{ 
  $seite = $row['seite_erste']; 
} 

/* jetzt wo die gewünschte Seite bekannt ist auswerten ob es möglich ist weiter bzw zurück zu gehen */
$zeigeWeiter  = FALSE; 
$zeigeZurueck = FALSE; 

/*wenn die aktuell Seite größer als die erste ist, dann können wir auch zurück */
if ( $seite > $row['seite_erste'] ) 
    $zeigeZurueck = TRUE; 
     
/* anlog zu oben */
if ( $seite < $row['seite_letzte'] ) 
    $zeigeWeiter  = TRUE;

/** Hier kommt die eigentliche Abfrage mit der Ausgabe und Co **/

// Ausgabe der aktuellen und letzten Seite
echo "<div align=\"center\">". $seite ." / ". $row['seite_letzte'] ."</div>" . "\n";

// Weiter- und Zuruecklinks fuer die Seitenanzeige werden eingebaut
echo "<div align=\"center\">";
if ( $zeigeZurueck ) 
{ 
    echo '<a href="' . $_SERVER['PHP_SELF'] . '"?seite=' . ($seite - 1) .'">&lt;&lt; Zur&uuml;ck</a>';  
}
if ( $zeigeWeiter ) 
{ 
    echo '<a href="' . $_SERVER['PHP_SELF'] . '"?seite=' . ($seite + 1) .'">Weiter &gt;&gt;</a>';  
}  
echo "</div>" . "\n";

Kann mir bitte wer weiterhelfen?

/EDIT:

Hab ich zum Beispiel 10 Datensätze und lasse 5 pro Seite anzeigen, sind es ja zwei Seiten.

Mir ist nun aufgefallen, dass die beiden Links "Weiter" und "Zurück" keine Wirkung zeigen, wenn ich jedoch die Seite manuell aufrufe, sprich ..?seite=1 und ..?seite=2 dann klappts. Nur wie krieg ich das jetzt noch so hin, dass das die beiden Links auch kapieren bitte?

/EDIT 2:

Ich habe es!!
Es lag an den beiden Links. Nachdem ich das ' . $_SERVER['PHP_SELF'] . ' durch den Dateinamen ersetzt habe, klappt es einwandfrei, sprich dateiname.php.

Ich danke Dir vielmals, ag3nt!

/EDIT 3:

Habe noch ein kleines Anliegen. Und zwar ist dazu ein kurzes theoretisches Beispiel nötig. Ich habe 20 Datensätze, lasse 5 pro Seite ausgeben, habe also 4 Seiten. Lasse ich 7 pro Seite ausgeben, muss ich 3 Seiten haben. Dem ist aber nicht so. Stattdessen werden nur 2 Seiten angezeigt und sozusagen 6 Datensätze nicht berücksichtigt. Das ist natürlich gar nicht gut. Wie kann ich dem bitte vorbeugen?
 
Zuletzt bearbeitet:
Kein Problem

Zu "Edit 3": Das ist simpel du gehst wie folgt vor:

1. Seiten = (Gesamtanzahl Datensätze) / (Datensätze je Seite)
2. Seiten = ceil( Seiten )

Die Funktion "ceil" (hier mal die Aufrunden Funktion von php) "fügt" dann quasi die letzte Seite hinzu.

Damit erhälst du immer die Seitenanzahl die nötig ist - stand aber auch in dem Beispiel ;-)
 
Zurück
Oben