Hallo TPler 
Obwohl es im Web von Datenbank und Pager Klassen wimmelt, stolpert man immer wieder über Threads in denen danach gefragt wird. Die meisten die bereits beides benutzen werden sicher ihre eigenen Klassen dafür erstellt haben. Für alle die, die noch ganz ohne sind stelle ich hier mal die beiden Klassen zur Verfügung die ich selbst auch benutze. Dabei habe ich das Rad nicht neu erfunden, sondern habe die Klassen vor einer Weile nach Tutorials gebaut, bzw Teile von anderen Klassen übernommen und um eigenen Methoden erweitert. Leider weiß ich nicht mehr woher die ursprünglichen Klassen waren, von daher kann ich keine Credits geben.
Nachfolgend mal die Listings und ein Anwendungsbeispiel und im Anhang das ganze zum downloaden. Natürlich kann jeder die Klassen an seine Bedürfnisse anpassen und erweitern, da diese Klassen nur als Basis dienen sollen.
1.) Einstellungen für den Datenbankzugriff
PHP-Code:
<?php
// Datenbank-Verbindungsdaten als Konstante deklarieren
define(HOST, 'localhost');
define(USER, 'root');
define(PASSWORD, 'abersowasvongeheim');
define(DBASE, 'tabellenname');
?>
Wie unschwer zu erkennen ist, habe ich die Zugangsdaten als Konstante deklariert. Wenn das jemand gerne anders lösen möchte, muß er in der Datenbank Klasse den Konstruktor anpassen! Die Datei mit den Einstellungen muß inkludiert oder direkt im Script plaziert werden. In der Zip Datei ist es die einstellungen.inc.php
2.) Die Datenbank-Klasse
PHP-Code:
<?php
class MySQL {
// Konstruktor - stellt die Datenbankverbindung her und waehlt die DB aus
function MySQL($dbhost = HOST, $dbuser = USER, $dbpass = PASSWORD, $dbname = DBASE) {
$this->connect = mysql_connect($dbhost, $dbuser, $dbpass) or die(mysql_error());
if($this->connect) {
$this->dbselect = mysql_select_db($dbname, $this->connect) or die(mysql_error());
}
}
// Daten zum schreiben in die DB vorbereiten
function dbinput($input) {
$input = trim($input);
if(get_magic_quotes_gpc()) {
$input = stripslashes($input);
}
if(!is_numeric($input)) {
$input = "'" . mysql_real_escape_string($input) . "'";
}
return $input;
}
// Query - Sendet die Anfrage an die Datenbank
function query($sql) {
if(is_resource($this->connect)) {
$result = '';
$this->sql = trim($sql);
$this->result = mysql_query($this->sql) or die(mysql_error());
return $result;
}
}
// Insert - Fuegt Eintraege zur Datenbank hinzu
function insert($insert) {
if(is_resource($this->connect)) {
$result = '';
$this->insert = trim($insert);
$this->result = mysql_query($this->insert) or die(mysql_error());
return $result;
}
}
// Update - Aktualisiert bestehende Eintraege in der Datenbank
function update($update) {
if(is_resource($this->connect)) {
$result = '';
$this->update = trim($update);
$this->result = mysql_query($this->update) or die(mysql_error());
return $result;
}
}
// Delete - Loescht einen Datensatz aus der Datenbank
function delete($delete) {
if(is_resource($this->connect)) {
$result = '';
$this->delete = trim($delete);
$this->result = mysql_query($this->delete) or die(mysql_error());
return $result;
}
}
// Affected Rows - Anzahl betroffener Datensätze zaehlen
function affected_rows() {
if(is_resource($this->connect)) {
$affected = mysql_affected_rows();
return $affected;
}
}
// Insert ID - ID des hinzugefuegten Datensatz ermitteln
function insert_id() {
if(is_resource($this->connect)) {
$insertid = mysql_insert_id();
return $insertid;
}
}
// Fetch Array - Holt Datensaetze als Objekt aus der Datenbank, die mit Query abgefragt wurden.
function fetch_object() {
if(is_resource($this->result)) {
$fetchobject = '';
$fetchobject = mysql_fetch_object($this->result);
return $fetchobject;
}
}
// Fetch Assoc - Holt Datensaetze als assoziatives Array aus der Datenbank, die mit Query abgefragt wurden.
function fetch_assoc() {
if(is_resource($this->result)) {
$fetchassoc = '';
$fetchassoc = mysql_fetch_assoc($this->result);
return $fetchassoc;
}
}
// Fetch Row - Holt Datensaetze als Array mit numerischem Index aus der Datenbank, die mit Query abgefragt wurden.
function fetch_row() {
if(is_resource($this->result)) {
$fetchrow = '';
$fetchrow = mysql_fetch_row($this->result);
return $fetchrow;
}
}
// NumRow - Liest die Anzahl der Datensätze in der Datenbank
function num_rows() {
if(is_resource($this->result)) {
$row = '';
$row = mysql_num_rows($this->result);
return $row;
}
}
// Free Result - Loescht die Abfrageergebnisse und gibt Resourcen frei
function free() {
if(is_resource($this->connect)) {
if(is_resource($this->result)) {
mysql_free_result($this->result);
}
}
}
// Disconnect - Datenbankverbindung schliessen
function disconnect() {
if(is_resource($this->connect)) {
mysql_close($this->connect);
}
}
}
?>
Die Methode dbinput() hat jemand hier im Forum gepostet (bin mir gerade nicht sicher, aber ich glaube es war Boris - ein Dank an dieser Stelle). Ich hatte zwar eine ähnliche Funktion zum aufbereiten der Daten vor dem schreiben in die DB, aber diese Version gefiel mir besser, also habe ich sie übernommen.
Die Klasse sollte eigentlich alles wichtige beinhalten was zum arbeiten mit der Datenbank notwendig ist. Die Namen der Methoden sollten auch intuitiv zu benutzen sein.
3.) Die Pager-Klasse
PHP-Code:
<?php
class MySQLPager {
var $db;
var $query;
var $seitenlink;
var $anzahl;
var $seite;
var $ausgabe = '';
// Uebergebener Query und Seitenzahl pruefen
function MySQLPager(&$db, $query, $anzahl = 5){
$this->db = &$db;
(preg_match("/^SELECT/", $query)) ? $this->query = $query : die('Fehlerhafter Query: ' .$query);
(is_int($anzahl) && $anzahl > 0) ? $this->anzahl = $anzahl : die('Fehlerhafte Seitenanzahl');
}
function PagerAusgabe($seitenlink, $seite){
// Gesamtanzahl der Datensaetze ermitteln
if (!$gesamtanzahl = $this->db->num_rows($this->db->query($this->query))){
die('Beim ermitteln der Gesamtanzahl ist ein Fehler aufgetreten!');
}
// Errechnen wie viele Seiten ausgegeben werden muessen
$seitenanzahl = ceil($gesamtanzahl / $this->anzahl);
if (!preg_match("/^\d{1,3}$/", $seite) || $seite < 1 || $seite > $seitenanzahl){
$seite = 1;
}
/* *************************************************** */
/* Datenbankeintraege der ausgewaehlten Seite ausgeben */
/* *************************************************** */
$this->db->query($this->query.' LIMIT '. (($seite-1) * $this->anzahl). ', ' .$this->anzahl);
while ($zeilen = &$this->db->fetch_row()){
foreach ($zeilen as $zeile){
$this->ausgabe .= $zeile;
$this->ausgabe .= "<br>";
}
}
/* **************************** */
/* Link zum Blaettern ausgeben */
/* **************************** */
$this->ausgabe .= '<div style="font: 11px Verdana, Arial, Helvetica, sans-serif; margin-top: 15px;">';
// Zurueck-Link erzeugen
if ($seite > 1){
$this->ausgabe .= '<a href="'.$seitenlink. 'seitenzahl=' .($seite-1). '">zurück</a> | ';
}
// Seiten-Link erzeugen - Aktuelle nicht als Link ausgeben
for ($i = 1; $i <= $seitenanzahl; $i++){
($i != $seite) ? $this->ausgabe .= '<a href="'.$seitenlink. 'seitenzahl=' .$i. '">' .$i. '</a> | ' : $this->ausgabe .= '<span style="color: #F00; font-weight: bold;">' .$i. '</span> | ';
}
// Weiter-Link erzeugen
if ($seite < $seitenanzahl){
$this->ausgabe .= '<a href="' .$seitenlink. 'seitenzahl=' .($seite+1). '">weiter</a>';
}
$this->ausgabe .= '</div>';
// Link zum blaettern und Datensaetze ausgeben
return $this->ausgabe;
}
}
?>
Dieser Klasse müßen einige Werte übergeben werden - dazu aber gleich mehr im Anwendungsbeispiel. Die Klasse gibt nicht nur die Links für das paging aus, sondern auch seitenweise Daten aus der DB. Für Formatierungen der Ausgabe kann man den Block Datenbankeintraege der ausgewaehlten Seite ausgeben anpassen oder diesen ganz entfernen und sich seine Ausgabe in einem anderen Script/Funktion basteln. Der Pager wird dennoch ausgegeben.
4.) Anwendungsbeispiel
PHP-Code:
/* ************************ */
/* Ausgabe der Pager-Klasse */
/* ************************ */
if (!isset($_GET['seitenzahl'])) {
$_GET['seitenzahl'] = 1;
}
$pagersql = "SELECT name FROM tabellenname";
$anzahlproseite = 10;
$pagelink = $_SERVER['PHP_SELF']. "?goto=testseite&";
$info = new MySQL();
$blaettern = new MySQLPager($info, $pagersql, $anzahlproseite);
echo $blaettern->PagerAusgabe($pagelink, $_GET['seitenzahl']);
$info->free();
$info->disconnect();
Zunächst einmal müßen alle 3 Dateien aus der Zip in eine Seite eingebunden werden. Um einen Startwert für den Pager zu haben, wird $_GET['seitenzahl'] auf 1 gesetzt, sofern diese Variable ungesetzt war. Danach wird der Query zum Daten auslesen zusammengestellt und in $pagersql abgelegt. Was sich hinter $anzahlproseite versteckt sollte klar sein. Der $pagelink ist wichtig, damit keine Links zerhackt werden und der Parameter zum blättern an den bestehenden Link angefügt werden.
Jetzt treten die Klassen in Aktion...
Zunächst wird mit $info = new MySQL(); eine Instanz der MySQL Klasse erzeugt und der Konstruktor stellt uns automatisch eine Verbindung zur DB her. Direkt danach wird eine Instanz der Pager-Klasse erzeugt und alle benötigten Werte übergeben. Der erste Parameter $info ist das Objekt das wir zuvor erzeugt haben und beinhaltet die Datenbankverbindung - ohne die geht gar nichts! Die beiden anderen Parameter sind selbstredend.
Die seitenweise Ausgabe der Daten und des Pager wird mit dem Aufruf echo $blaettern->PagerAusgabe(); erledigt. Die beiden letzten Zeilen geben Resourcen frei und beenden die Verbindung zur Datenbank.
Die Handhabung ist sehr einfach wie man sieht und man kann mit wenigen Zeilen Code seine Daten aus der DB ausgeben lassen und komfortabel durch die Datensätze blättern.
Wie erwähnt sollen diese Klassen nur als Basis dienen und jeder sollte sie sich nach eigenen Bedürfnissen anpassen. 
5.) Anwendungsbeispiel zum schreiben in die Datenbank
PHP-Code:
$eintragen = new MySQL();
$sql = "INSERT INTO
tabellenname (name, anschrift, bemerkung)
VALUES (
" .$eintragen->dbinput("Hoss Cartwright"). ",
" .$eintragen->dbinput("Ponderosa 1"). ",
" .$eintragen->dbinput("Braucht bald ein neues Pferd, weil sein altes Rückenprobleme hat."). "
)";
$eintragen->insert($sql);
if ($eintragen->affected_rows() > 0) {
echo "Der neue Eintrag hat den auto_increment Wert: ";
echo $eintragen->insert_id();
} else {
echo "Oooops, da hat was nicht geklappt!";
}
Ok, hier geht's rund
Zuerst wird wieder eine Instanz der MySQL Klasse erzeugt und eine Verbindung zur Datenbank hergestelt. In $sql wird der String abgelegt der gleich an die DB geschickt wird. Wichtig ist hier das $eintragen->dbinput() da in dieser Zeile sehr viel passiert, auch wenn es nicht den Anschein hat. Ein genauerer Blick auf die Methode dbinput() in der MySQL-Klasse zeigt, daß hier die Daten die in die DB geschrieben werden sollen korrekt aufbereitet werden, so das sichergestellt ist, daß keiner Schadcode in unsere Datenbank schreiben kann oder sonstigen Blödsinn macht.
Es werden Leerzeichen entfernt, unnötige Slashes entfernt die durch die Übermittlung (z.B. eines Formulars) eingefügt wurden und letztendlich werden potentiell schädliche Zeichen korrekt maskiert. Sehr oft wird addslashes() für das maskieren zum schreiben in die DB benutzt, was aber laut Handbuch inkorrekt ist und es wird ausdrücklich angeraten statt dessen mysql_real_escape_string() zu benutzen!
Mit $eintragen->insert() werden die Daten dann an die DB geschickt damit sie gespeichert werden können. Zum überprüfen ob die Daten angekommen sind machen wir eine Abfrage mit $eintragen->affected_rows() und sehen nach ob mehr als 0 Zeilen von unserer Schreib-Anfrage betroffen waren. Ist das der Fall wurde erfolgreich in die DB geschrieben und wir können uns mit $eintragen->insert_id() die ID (auto_increment) anzeigen lassen.
Die anderen Methoden in der MySQL-Klasse funktionieren alle nach dem selben Prinzip und sollten keine Schwierigkeiten bereiten.
So das war's. Ich hoffe dem ein oder anderen ist dieser Beitrag (und die Klassen) irgendwie von Nutzen.
Happy Coding und Gruß,
Andy