Ankündigung

Einklappen
Keine Ankündigung bisher.

PEAR-Packages DB und HTML_Table, by Guradia

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • PEAR-Packages DB und HTML_Table, by Guradia

    Das Tutorial wurde geschrieben von: Guradia

    Thema: PEAR-Packages DB und HTML_Table für eine simple Tabellendarstellung einer DB-Abfrage, ohne in einer Funktion HTML nutzen zu müssen.



    Code:
    <?php 
    
    /** 
    * Inkludieren der benötigten Klassen 
    * 
    * http://pear.php.net/package/DB (pear install db) 
    * http://pear.php.net/package/HTML_Table (pear install html_table) 
    */ 
    require_once 'DB.php'; 
    require_once 'HTML/Table.php'; 
    
    
    
    /** 
    * Aufbau der Datenbank-Verbindung 
    * 
    * driver   : Datenbanktreiber, z.b. 'mysql' 
    * user     : 
    * 
    * $GLOBALS['db'] nimmt die Datenbankverbindung auf. 
    * Es ist meist eine praktische Idee eine DB-Verbindung über $GLOBALS überall 
    * verfügbar zu halten. 
    */ 
    $GLOBALS['db'] =& DB::connect('driver://user:pass@host/database'); 
    
    /* Check, ob Verbdinungsversuch fehlschlug */ 
    if (DB::isError($GLOBALS['db'])) { 
        print $GLOBALS['db']->getMessage(); 
    } else { 
        /** 
         * Setzen des default-Modus für die Rückgabe von Datensätzen. 
         * Für die meisten User wäre wohl DB_FETCHMODE_ASSOC die übliche Wahl. 
         * Dieser Modus erlaubt den Zugriff nach Art: 
         * $row['feld'] 
         * Der unten genutze Modus ermöglicht folgende Art: 
         * $row->feld  
         */ 
        $GLOBALS['db']->setFetchMode(DB_FETCHMODE_OBJECT); 
    } 
    
    
    
    /** 
    * Hier eine einfache kleine Abfrage. 
    * Zum selbertesten muss natürlich eine sinnvolle Abfrage eingesetzt werden. 
    * 
    * Die Abfrage zunächst in eine Variable zu setzen ist in sofern nützlich, 
    * als dass die Variable noch für Debug-Ausgaben genutzt werden könnte. 
    */ 
    $sql = " 
        SELECT  tabelleA.feldA, 
                tabelleA.feldB, 
                tabelleB.id 
                
        FROM    tabelleA 
        
            INNER JOIN  tabelleB 
                ON  tabelleA.tabelleBid = tabelleB.id 
    
        ORDER 
            BY  tabelleA.feldB 
    ;"; 
    
    /** 
    * Erzeugen eines 'DB_result' 
    * Das ist übrigens die einzige Stelle, an der für eine Abfrage nochmal die 
    * 'lange' Variable $GLOBALS['db'] genutzt wird. 
    */ 
    $res = $GLOBALS['db']->query($sql); 
    
    /* Das DB_result könnte auch ein DB_error sein, das wir hier geprüft */ 
    if (DB::isError($res)) { 
        /* Um einfach nur die etwaige Fehlermeldung auszuspucken: */ 
        print $res->getMessage(); 
        
        /* Hier zusammen mit $sql als Debuginformation */ 
        print '<pre>'; 
        print $sql; 
        print '</pre>'; 
        print $res->getMessage(); 
        
        /* DB_error zum debuggen: */ 
        print '<pre>'; 
        print $res->toString(); 
        print '</pre>'; 
        
        /** 
         * Für die HTML-unkundigen: 
         * <pre> übernimmt die Formatierung seines Inhalts aus dem Quelltext. 
         * Dies führt dazu, dass im Browser z.B. unsere Abfrage genauso lesbar ist 
         * wie schon hier im PHP-Source 
         */ 
    
    } else { 
        /* DB_result ist kein Error, also geht's hier weiter */ 
        
        
        /** 
         * Ab hier können wir uns mit unserer Tabelle beschäftigen. 
         * Als erstes benötigen wir passendes Objekt. 
         * per default ist es nicht nötig, irgendwelche Formatierungen vorzunehmen. 
         * Da ich selbst aber nicht so sehr auf cellspacing stehe, nutze ich diese 
         * Stelle, um den simplen Umgang mit Attributen in PEAR::HTML_* zu zeigen 
         */ 
        $attr = array( 
            'cellpadding' => '0', 
            'cellspacing' => '0', 
            'style' => 'width:100%;' 
        ); 
        $table =& new HTML_Table($attr); 
        
        /** 
         * Die Spaltenüberschriften über <th> 
         * $c hilft hier nur ein wenig, man könnte auch 
         */ 
        $c = 0; 
        $table->setHeaderContents(0, $c++, 'feldA'); 
        $table->setHeaderContents(0, $c++, 'feldB'); 
        $table->setHeaderContents(0, $c++, 'id (Tablle B)'); 
        
        /** 
         * Mit $onRow bestimme ich gleich, in welche HTML-Tabellenzeile geschrieben werden soll 
         * Da die Header ja gerade geschrieben wurden, beginnt es bei 1 
         */ 
        $onRow = 1; 
        
        /** 
         * Ene HTML-Tabelle, die was auf sich hält, alterniert die Hintergrundfarbe von Zeile zu Zeile 
         * In $swap wird abgelegt, welche Farben dies hier sein sollen (grau und weiss) 
         * $swapC bestimmt, welche Farbe gerade dran ist. 
         */ 
        $swap = array('#cccccc', '#ffffff'); 
        $swapC = 0; 
        
        /** 
         * Ein DB_result bietet im groben 2 Methoden, um Datensätze anzurufen: 
         * fetchInto($row) und 
         * $row = fetchRow() 
         * Beide liefern in $row einen Array (oder stdClass) zurück. Bei beiden liesse sich 
         * die genaue Rückgabeform über einen optionalen Parameter steuern, dem die gleichen 
         * Konstanten übergeben werden, sie schon setFetchMode() 
         * 
         * Wenn keine Datensätze mehr zur Abrufung bereitstehen, geben die Methoden NULL zurück. 
         * Daher hier die while()-Schleife solange keine NULL zurückgeworfen wird. 
         */ 
        while (!is_null($res->fetchInto($row))) { 
            
            /* Wie schon bei den Headern, $c hilft beim bestimmen der Spalte */ 
            $c = 0; 
            $table->setCellContents($onRow, $c++, $row->feldA); 
            $table->setCellContents($onRow, $c++, $row->feldB); 
            $table->setCellContents($onRow, $c++, $row->id); 
            
            /** 
             * Übergabe der Hintergrundfarbe. 
             * Das abschliessende TRUE sorgt dafür, dass die Attribute auf <tr> angewandt werden. 
             * Ein FALSE würde <tr> ignorieren und jedes <td> nutzen. 
             */ 
            $table->setRowAttributes( 
                $onRow, 
                array('style' => 'background-color:'.$swap[$swapC]), 
                true); 
                
            /* Hochzählerei, damit der nächste Durchlauf die Farbe wechselt und die nächste Zeile beschreibt */ 
            $swapC++; if ($swapC > 1) { $swapC = 0; } 
            $onRow++; 
        } 
        
        /* Ausgabe der Tabelle */ 
        print $table->toHtml(); 
    } 
    
    
    ?>
    [b][url=http://www.benjamin-klaile.de]privater Blog[/url][/b]

  • #2
    Re: PEAR-Packages DB und HTML_Table, by Guradia

    PHP-Code:
    <?php 

    /** 
    * Inkludieren der benötigten Klassen 

    * [url]http://pear.php.net/package/DB[/url] (pear install db) 
    * [url]http://pear.php.net/package/HTML_Table[/url] (pear install html_table) 
    */ 
    require_once 'DB.php'
    require_once 
    'HTML/Table.php'



    /** 
    * Aufbau der Datenbank-Verbindung 

    * driver   : Datenbanktreiber, z.b. 'mysql' 
    * user     : 

    * $GLOBALS['db'] nimmt die Datenbankverbindung auf. 
    * Es ist meist eine praktische Idee eine DB-Verbindung über $GLOBALS überall 
    * verfügbar zu halten. 
    */ 
    $GLOBALS['db'] =& DB::connect('driver://user:pass@host/database'); 

    /* Check, ob Verbdinungsversuch fehlschlug */ 
    if (DB::isError($GLOBALS['db'])) { 
        print 
    $GLOBALS['db']->getMessage(); 
    } else { 
        
    /** 
         * Setzen des default-Modus für die Rückgabe von Datensätzen. 
         * Für die meisten User wäre wohl DB_FETCHMODE_ASSOC die übliche Wahl. 
         * Dieser Modus erlaubt den Zugriff nach Art: 
         * $row['feld'] 
         * Der unten genutze Modus ermöglicht folgende Art: 
         * $row->feld  
         */ 
        
    $GLOBALS['db']->setFetchMode(DB_FETCHMODE_OBJECT); 




    /** 
    * Hier eine einfache kleine Abfrage. 
    * Zum selbertesten muss natürlich eine sinnvolle Abfrage eingesetzt werden. 

    * Die Abfrage zunächst in eine Variable zu setzen ist in sofern nützlich, 
    * als dass die Variable noch für Debug-Ausgaben genutzt werden könnte. 
    */ 
    $sql 
        SELECT  tabelleA.feldA, 
                tabelleA.feldB, 
                tabelleB.id 
                
        FROM    tabelleA 
        
            INNER JOIN  tabelleB 
                ON  tabelleA.tabelleBid = tabelleB.id 

        ORDER 
            BY  tabelleA.feldB 
    ;"


    /** 
    * Erzeugen eines 'DB_result' 
    * Das ist übrigens die einzige Stelle, an der für eine Abfrage nochmal die 
    * 'lange' Variable $GLOBALS['db'] genutzt wird. 
    */ 
    $res $GLOBALS['db']->query($sql); 

    /* Das DB_result könnte auch ein DB_error sein, das wir hier geprüft */ 
    if (DB::isError($res)) { 
        
    /* Um einfach nur die etwaige Fehlermeldung auszuspucken: */ 
        
    print $res->getMessage(); 
        
        
    /* Hier zusammen mit $sql als Debuginformation */ 
        
    print '<pre>'
        print 
    $sql
        print 
    '</pre>'
        print 
    $res->getMessage(); 
        
        
    /* DB_error zum debuggen: */ 
        
    print '<pre>'
        print 
    $res->toString(); 
        print 
    '</pre>'
        
        
    /** 
         * Für die HTML-unkundigen: 
         * <pre> übernimmt die Formatierung seines Inhalts aus dem Quelltext. 
         * Dies führt dazu, dass im Browser z.B. unsere Abfrage genauso lesbar ist 
         * wie schon hier im PHP-Source 
         */ 

    } else { 
        
    /* DB_result ist kein Error, also geht's hier weiter */ 
        
        
        /** 
         * Ab hier können wir uns mit unserer Tabelle beschäftigen. 
         * Als erstes benötigen wir passendes Objekt. 
         * per default ist es nicht nötig, irgendwelche Formatierungen vorzunehmen. 
         * Da ich selbst aber nicht so sehr auf cellspacing stehe, nutze ich diese 
         * Stelle, um den simplen Umgang mit Attributen in PEAR::HTML_* zu zeigen 
         */ 
        
    $attr = array( 
            
    'cellpadding' => '0'
            
    'cellspacing' => '0'
            
    'style' => 'width:100%;' 
        
    ); 
        
    $table =& new HTML_Table($attr); 
        
        
    /** 
         * Die Spaltenüberschriften über <th> 
         * $c hilft hier nur ein wenig, man könnte auch 
         */ 
        
    $c 0
        
    $table->setHeaderContents(0$c++, 'feldA'); 
        
    $table->setHeaderContents(0$c++, 'feldB'); 
        
    $table->setHeaderContents(0$c++, 'id (Tablle B)'); 
        
        
    /** 
         * Mit $onRow bestimme ich gleich, in welche HTML-Tabellenzeile geschrieben werden soll 
         * Da die Header ja gerade geschrieben wurden, beginnt es bei 1 
         */ 
        
    $onRow 1
        
        
    /** 
         * Ene HTML-Tabelle, die was auf sich hält, alterniert die Hintergrundfarbe von Zeile zu Zeile 
         * In $swap wird abgelegt, welche Farben dies hier sein sollen (grau und weiss) 
         * $swapC bestimmt, welche Farbe gerade dran ist. 
         */ 
        
    $swap = array('#cccccc''#ffffff'); 
        
    $swapC 0
        
        
    /** 
         * Ein DB_result bietet im groben 2 Methoden, um Datensätze anzurufen: 
         * fetchInto($row) und 
         * $row = fetchRow() 
         * Beide liefern in $row einen Array (oder stdClass) zurück. Bei beiden liesse sich 
         * die genaue Rückgabeform über einen optionalen Parameter steuern, dem die gleichen 
         * Konstanten übergeben werden, sie schon setFetchMode() 
         * 
         * Wenn keine Datensätze mehr zur Abrufung bereitstehen, geben die Methoden NULL zurück. 
         * Daher hier die while()-Schleife solange keine NULL zurückgeworfen wird. 
         */ 
        
    while (!is_null($res->fetchInto($row))) { 
            
            
    /* Wie schon bei den Headern, $c hilft beim bestimmen der Spalte */ 
            
    $c 0
            
    $table->setCellContents($onRow$c++, $row->feldA); 
            
    $table->setCellContents($onRow$c++, $row->feldB); 
            
    $table->setCellContents($onRow$c++, $row->id); 
            
            
    /** 
             * Übergabe der Hintergrundfarbe. 
             * Das abschliessende TRUE sorgt dafür, dass die Attribute auf <tr> angewandt werden. 
             * Ein FALSE würde <tr> ignorieren und jedes <td> nutzen. 
             */ 
            
    $table->setRowAttributes
                
    $onRow
                array(
    'style' => 'background-color:'.$swap[$swapC]), 
                
    true); 
                
            
    /* Hochzählerei, damit der nächste Durchlauf die Farbe wechselt und die nächste Zeile beschreibt */ 
            
    $swapC++; if ($swapC 1) { $swapC 0; } 
            
    $onRow++; 
        } 
        
        
    /* Ausgabe der Tabelle */ 
        
    print $table->toHtml(); 



    ?>

    Kommentar


    • #3
      so sieht es wirklich besser aus!
      [b][url=http://www.benjamin-klaile.de]privater Blog[/url][/b]

      Kommentar

      Lädt...
      X