Ergebnis 1 bis 6 von 6

Thema: MySQL und Pager Klasse im Bundle

  1. #1
    TP-Specialist Avatar von phpBuddy
    Registriert seit
    Aug 2004
    Ort
    Kaiserslautern
    Beiträge
    4.678

    MySQL und Pager Klasse im Bundle

    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 || $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&uuml;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&amp;";

    $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
    Angehängte Dateien Angehängte Dateien

  2. #2
    TP-Supporter
    Registriert seit
    Dec 2005
    Beiträge
    455
    Die MySQL Klasse gefällt mir garnicht. Ich weiß nicht, warum du versch. Methoden fpür insert(), delete() etc hast. Das ist doch reichlich sinnlos, da das genausogut über einen normalen Query gemacht werden kann!
    Desweiteren fehlen mir die Methoden getRows() oder sowas, womit man alle Datensätze in einem Array erhält!

    ZUr Pagerklasse: Ist es damit möglich, das so hinzubekommen: vor 1 2 .... 6 7 weiter?

  3. #3
    TP-Specialist Avatar von phpBuddy
    Registriert seit
    Aug 2004
    Ort
    Kaiserslautern
    Beiträge
    4.678
    Hi [jacky]

    Die Klasse ist nur ein Gerüst, das sich jeder nach seinen Bedürfnissen anpassen kann. Das insert(), update(), delete() usw jeweils eine eigene Methode darstellen hängt damit zusammen, daß ich öfter mal noch verschiedene andere Aktionen damit verknüpfe die ich dann mit in diese Methode packe. Wenn ich also gezielt ein UPDATE ausführen will und auf bestimmte Ereignisse in Verbindung mit UPDATE reagieren möchte, wäre es unnötig kompliziert erst mal anzufangen Abfrage zu erstellen was eigentlich mit dem Query durchgeführt wurde. Sicherlich könnte man auch, wie in der Pager-Klasse, mit einem preg_match schauen was geschickt wurde und dann mit einem switch() hantieren für die Auswertung, aber ehrlich gesagt finde ich es übersichtlicher wenn jede Aktion ihre eigene, eindeutige Methode hat.

    Was meinst Du denn mit getRows()? Eigentlich sollte alles was mit "Rows" zu tun hat da sein (num_rows(), fetch_rows(), affected_rows()). Ein Beispiel steht auch direkt in der Pager-Klasse, die auch die -aus der DB- geholten Rows seitenweise aus einem Array ausgibt. BTW, ist es nicht generell so das man ein Array() erhält wenn man etwas aus der DB fetched? (zumindest habe ich bisher noch nie nicht ein Array zurück bekommen )

    In der Pager-Klasse werden am Ende ja die Links generiert, da sieht man das auch "zurück" und "weiter" generiert werden.
    Der Pager sieht in etwa so aus: zurück | 1 | 2 | 3 | weiter (die Schriftgröße ist etwas kleiner/dezenter in der Pager-Klasse, was man sich aber anpassen kann)
    Das "zurück" ist nur sichtbar, wenn es auch ein zurück gibt. Also auf Seite 1 steht es nicht da. Das selbe auch für "weiter", das nur angezeigt wird solange es mehr als eine Seite gibt und man nicht auf der letzten Seite ist. Alle Seitenzahlen werden als Link dargestellt, bis auf die Seite auf der man ist. Diese Seitenzahl wird hervorgehoben dargestellt, damit man weiß auf welcher Seite man ist.

  4. #4
    TP-Supporter
    Registriert seit
    Dec 2005
    Beiträge
    455
    Zu dem insert(), update() und delete(): Nun gut, wenn Du dort noch extra Sachen ausführst, soll mir das recht sein

    Zu getRows(): Naja mir fehlt eine Methode, um einfach ein multidimensionales Array mit den einzelnen Datensatzarrays als Elemente zu bekommen, da ich sonst immer noch im Script sowas machen muss:

    PHP-Code:
    $res $mysql_class->query($sql);
    $rows = array();
    while(
    $row mysql_fetch_assoc($res)) {
      
    $rows[] = $row;

    Zur Pager Klasse: Das meinte ich nicht; ich meinte sowas, dass wenn man ca. 30 Seitenlinks hat und sich auf Seite 1 befindet, dass dann nur n Links um die aktuelle Seite rum angezeigt werden, und die restlichen per "..." verschwinden!

  5. #5
    TP-Specialist Avatar von phpBuddy
    Registriert seit
    Aug 2004
    Ort
    Kaiserslautern
    Beiträge
    4.678
    Hi [jacky]

    Wie gesagt, das sind Basis-Klassen die für Leute gedacht sind, die gerade anfangen sich mit Klassen zu beschäftigen und so ein funktionierendes Beispiel für den schnelleren Einstieg haben. Das man die Klassen beliebig erweitern und anpassen kann (und soll) wie z.B. dein Vorschlag mit getRows() ist selbstredend.

    Die Pager-Klasse gibt die Links so aus wie oben beschrieben. Advanced Funktionen, die z.B. hinten, vorne und in der Mitte Links abschneidet und durch "..." ersetzen, muß man sich schon selbst einbauen.

    Wenn Du sowas schon fertig hast könntest Du es auch hier in's Forum stellen. Es gibt bestimmt genug dankbare Anwender dafür.

  6. #6
    TP-Supporter
    Registriert seit
    Dec 2005
    Beiträge
    455
    Ja ich habe sowas mit dem Abkürzen der Links, aber naja, ist auch nicht von mir, von daher ...

Aktive Benutzer

Aktive Benutzer

Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)

Aktive Benutzer

Aktive Benutzer

Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)

     

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51