Blätterfunktion mit MySQL
Aufgrund der Tatsache, dass Jann Hendrik zwei Tutorials zum Erstellen von Gästebüchern geschrieben hat, diese aber nur Grundlagen abdecken, habe ich mal eine kleine MySQL-basierte Blätterfunktion gebaut.
Ich erhebe mit diesem Codeschnipsel nicht den Anspruch etwas Effektives oder Unverbesserliches geschaffen zu haben
Zuerst erstellen wir natürlich eine Verbindung zur Datenbank:
PHP-Code:
<?php
// Einbinden der Konfigurationsdatei
include_once 'config.inc.php';
// Erstellen der Verbindung zur MySQL-Datenbank
if( !$connection = mysql_connect( $_config['host'], $_config['user'], $_config['password'] ) ) {
die( 'Verbindung zum Datenbankserver konnte nicht hergestellt werden.' );
}
if( !mysql_select_db( $_config['database'], $connection ) ) {
die ( 'Die Datenbank ' . $_config['database'] . ' kann nicht verwendet werden. <br />
MySQL-Error: <br />' . mysql_error() );
}
?>
Die Datei "config.inc.php" sieht sinngemäß so aus:
PHP-Code:
<?php
$_config = array();
$_config['host'] = 'localhost';
$_config['database'] = 'scriptarchiv';
$_config['user'] = 'root';
$_config['password'] = '';
?>
Nun machen wir einige Deklarationen und Initialisierungen
PHP-Code:
<?php
// Angabe der anzuzeigenden Datensätze pro Seite
$proSeite = 3;
// Deklaration und Initialisierung der Variablen $start.
// Sie wird für die Erstellung der Blätterfunktion benötigt
$start = 0;
?>
Danach beschaffen wir uns die Information wie viele Datensätze uns überhaupt zur Verfügung stehen. In diesem Tutorial verwenden wir diese Zahl nicht wirklich. Sie kann aber z.B. in der später vorgestellten Methode "blaettern" nützlich sein.
PHP-Code:
<?php
// Herausfinden, wie viele Datensätze existieren
$sql = 'SELECT
COUNT(_id) AS anzahl
FROM
archiv_news';
$res = mysql_query($sql) or die( 'Error[SELECT|News]: <br />
<pre>' . $sql . '</pre>
<br />
MySQL-Error: ' . mysql_error() );
$news = mysql_fetch_object($res);
$anzahlNews = $news->anzahl;
?>
In diesem Tutorial verwenden wir die Variable "$anzahlNews" nur zur Überprüfung des übergebenen Parameters.
Wir erstellen uns eine SQL-Anweisung, welche je nach URL-Parameter ergänz wird. Dabei habe ich mir mal ein feines Konstrukt ausgedacht

Die SQL-Anweisung kann selbstverständlich auch mit einer WHERE-Bedigung ergänzt werden, um z.B. nur Datensätze mit einer bestimmten Gruppe etc. anzuzeigen.
PHP-Code:
<?php
// SQL-Anweisung, welche je nach Übergabeparameter erweitert wird
$sql = 'SELECT
_id,
_titel
FROM
archiv_news
LIMIT';
?>
Nun das oben angesprochene Konstrukt, um die SQL-Anweisung zu vervollständigen.
Erklärung folgt direkt nach dem Schnipsel.
PHP-Code:
<?php
// Vervollständigung der SQL-Anweisung je nach $_GET['start']
$sql .= ( isset($_GET['start'])
AND
is_numeric($_GET['start'])
AND
$_GET['start'] > 0
AND
$_GET['start'] <= $anzahlNews )
? sprintf( ' %d, %d', $start = $_GET['start'], $proSeite )
: sprintf( ' %d, %d', 0, $proSeite );
?>
So. Was passiert denn da?
Ich nutze den
ternären Operator in einer etwas ausführlicheren Form.
Die bool'sche Bedingung überprüft, ob der übergebene Parameter überhaupt für die SQL-Anweisung geeignet ist. Ist dies der Fall so wird das "LIMIT" mit dem dekrementierten URL-Parameter und der Variable "$proSeite" ergänzt, ansonsten wird einfach explizit angegeben, dass die ersten "$proSeite" Datensätze ausgelesen werden sollen.
Warum wird dort dekrementiert?
Weil wir ein "LIMIT 0, 3" brauchen, um die ersten drei Datensätze auszulesen. Da der Parameter aber minimal 1 ist (der Übersichtlichkeit halber) müssen wir den Wert um eins verringern
Aber da geschieht ja noch etwas.
In diesem Ausdruck hier
PHP-Code:
<?php
sprintf( ' %d, %d', $start = $_GET['start'], $proSeite )
?>
wird der Variablen "$start" der Wert des dekrementierten URl-Parameters zugewiesen. Wir werden diesen Wert in der Funktion "blaettern" verwenden.
Vorher schicken wir aber erstmal die SQL-Anweisung an die Datenbank und geben die selektierten Datensätze aus.
PHP-Code:
<?php
$res = mysql_query($sql) or die( 'Error[SELECT|News]: <br />
<pre>' . $sql . '</pre>
<br />
MySQL-Error: ' . mysql_error() );
// Anzeige der selektierten Datensätze
echo '<ul>';
while( $news = mysql_fetch_object($res) ) {
printf( '<li>%d. <a href="%s">%s</a></li>',
$news->_id,
$_SERVER['PHP_SELF'] . '?news=' . $news->_id,
$news->_titel );
}
echo '</ul>';
?>
Und jetzt kommt die mysteriöse Funktion "blaettern"

Hier kann man sicherlich noch einiges einfügen, umändern und vor allem an die eigenen Bedürfnisse anpassen. Ich stelle hier einfach mal meine simple version vor:
PHP-Code:
<?php
// Funktion zur Erzeugung der Verweise
function blaettern( $start, $proSeite, $gesamtzahl ) {
$vorige = '';
$naechste = '';
// "nächste Seite"
if( ($start + $proSeite) <= $gesamtzahl ) {
$naechsteStart = $start + $proSeite;
$link = sprintf( '%s?start=%d',
$_SERVER['PHP_SELF'],
$start + $proSeite );
$naechste = sprintf( '» <a href="%s">Datensätze %d bis %d</a> »',
$link,
$naechsteStart,
$naechsteStart + $proSeite - 1 );
}
// "vorige Seite"
if( ($start - $proSeite) > 0 ) {
$vorigeStart = $start - $proSeite;
$link = sprintf( '%s?start=%d',
$_SERVER['PHP_SELF'],
$start - $proSeite );
$vorige = sprintf( '« <a href="%s">Datensätze %d bis %d</a> «',
$link,
$vorigeStart,
$vorigeStart + $proSeite -1 );
}
return sprintf( '%s aktuell: [%d bis %d] %s',
$vorige,
$start,
$start + $proSeite - 1,
$naechste );
}
echo blaettern( ++$start, $proSeite, $anzahlNews );
?>
Der Übergabeparameter "$gesamtzahl" wird, wie oben schon angedeutet, nicht verwendet. Man könnte ihn aber z.B. dafür verwenden die Seitenanzahl zu bestimmen
Code:
$seiten = ceil( $gesamtzahl / $proSeite );
und dann damit etwas herumzuspielen
In der Funktion passiert eigentlich nichts Aufregendes. Wie man eventuell merkt hat es mir die Funktion
sprintf angetan.

Man muss sich einfach nur mal den Manualeintrag anschauen und man wird die Funktion "blaettern" schnell verstehen.
Da ich bestrebt bin auch Anfänger die Arbeit mit dem Manual "aufzuzwingen"

gehe ich jetzt auch nicht weiter auf die Funktion ein.
Um das Tutorial ohne Probleme direkt testen zu können folgt nun ein SQL-Export, den ihr einfach nur per importieren müsst und der komplette Quellcode.
Code:
#
# Tabellenstruktur für Tabelle `archiv_news`
#
CREATE TABLE IF NOT EXISTS `archiv_news` (
`_id` int(5) NOT NULL auto_increment,
`_titel` varchar(50) NOT NULL default '',
PRIMARY KEY (`_id`)
) TYPE=MyISAM AUTO_INCREMENT=11 ;
#
# Daten für Tabelle `archiv_news`
#
INSERT INTO `archiv_news` (`_id`, `_titel`) VALUES (1, 'Unterschied zwischen HTML und XHTML'),
(2, 'RSS-Feeds leicht gemacht'),
(3, 'Mozilla Thunderbird vs. MS Outlook'),
(4, 'Testbericht: Notebook "Dell Inspiron 6000"'),
(5, 'Informationen zum Einstein-Jahr'),
(6, 'Wozu braucht man eigentlich XML?'),
(7, 'Internettelefonie auf dem Vormarsch'),
(8, 'Umfrage: Wer wird deutsche Fußballmeister 2005?'),
(9, 'Studium vs. Ausbildung'),
(10, 'Stefan Kuntz neuer Sportmanager des TuS Koblenz');
PHP-Code:
<?php
// Einbinden der Konfigurationsdatei
include_once 'config.inc.php';
// Funktion zur Erzeugung der Verweise
function blaettern( $start, $proSeite, $gesamtzahl ) {
$vorige = '';
$naechste = '';
// "nächste Seite"
if( ($start + $proSeite) <= $gesamtzahl ) {
$naechsteStart = $start + $proSeite;
$link = sprintf( '%s?start=%d',
$_SERVER['PHP_SELF'],
$start + $proSeite );
$naechste = sprintf( '» <a href="%s">Datensätze %d bis %d</a> »',
$link,
$naechsteStart,
$naechsteStart + $proSeite - 1 );
}
// "vorige Seite"
if( ($start - $proSeite) > 0 ) {
$vorigeStart = $start - $proSeite;
$link = sprintf( '%s?start=%d',
$_SERVER['PHP_SELF'],
$start - $proSeite );
$vorige = sprintf( '« <a href="%s">Datensätze %d bis %d</a> «',
$link,
$vorigeStart,
$vorigeStart + $proSeite -1 );
}
return sprintf( '%s aktuell: [%d bis %d] %s',
$vorige,
$start,
$start + $proSeite - 1,
$naechste );
}
// Erstellen der Verbindung zur MySQL-Datenbank
if( !$connection = mysql_connect( $_config['host'], $_config['user'], $_config['password'] ) ) {
die( 'Verbindung zum Datenbankserver konnte nicht hergestellt werden.' );
}
if( !mysql_select_db( $_config['database'], $connection ) ) {
die ( 'Die Datenbank ' . $_config['database'] . ' kann nicht verwendet werden. <br />
MySQL-Error: <br />' . mysql_error() );
}
// Angabe der anzuzeigenden Datensätze pro Seite
$proSeite = 3;
// Deklaration und Initialisierung der Variablen $start.
// Sie wird für die Erstellung der Blätterfunktion benötigt
$start = 0;
// Herausfinden, wie viele Datensätze existieren
$sql = 'SELECT
COUNT(_id) AS anzahl
FROM
archiv_news';
$res = mysql_query($sql) or die( 'Error[SELECT|News]: <br />
<pre>' . $sql . '</pre>
<br />
MySQL-Error: ' . mysql_error() );
$news = mysql_fetch_object($res);
$anzahlNews = $news->anzahl;
// SQL-Anweisung, welche je nach Übergabeparameter erweitert wird
$sql = 'SELECT
_id,
_titel
FROM
archiv_news
LIMIT';
// Vervollständigung der SQL-Anweisung je nach $_GET['start']
$sql .= ( isset($_GET['start'])
AND
is_numeric($_GET['start'])
AND
$_GET['start'] > 0
AND
$_GET['start'] <= $anzahlNews )
? sprintf( ' %d, %d', $start = $_GET['start'], $proSeite )
: sprintf( ' %d, %d', 0, $proSeite );
$res = mysql_query($sql) or die( 'Error[SELECT|News]: <br />
<pre>' . $sql . '</pre>
<br />
MySQL-Error: ' . mysql_error() );
// Anzeige der selektierten Datensätze
echo '<ul>';
while( $news = mysql_fetch_object($res) ) {
printf( '<li>%d. <a href="%s">%s</a></li>',
$news->_id,
$_SERVER['PHP_SELF'] . '?news=' . $news->_id,
$news->_titel );
}
echo '</ul>';
echo blaettern( ++$start, $proSeite, $anzahlNews );
?>
Ich wünsche Euch viel Spaß beim weiteren Basteln
Solltet Ihr Fragen zu dem Tutorial haben, so schreibt bitte einen Beitrag im
PHP-Forum mit einem Verweis auf dieses Tutorial.
Danke.
Ich hoffe, dass ich Euch hier etwas weiterhelfen konnte.
Bei Verbesserungsvorschlägen würde ich mich über eine Nachricht freuen.
Grüße Ben.