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.
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(); } ?>
Kommentar