PEAR::DB mit Blätterfunktion

Posted in PHP by tobi on the Oktober 6th, 2006

In diesem Beispiel wird PEAR::DB mit der Erweiterung PEAR::DB_Pager verwendet.

PHP:
  1. <?php
  2. // PEAR:DB mit Blätterfunktion(PEAR::DB_Pager)
  3. // Autor Tobias Lorsbach
  4. // tobi@phpschnipsel.de
  5. //
  6. //
  7.  
  8.  
  9. //Globale Konfiguration
  10. $config = array();
  11. //Diese Tabelle wird in diesem Tutorial benutzt:
  12.  
  13. # CREATE TABLE `user` (
  14. # `id` tinyint(64) NOT NULL auto_increment,
  15. # `name` varchar(128) NOT NULL default '',
  16. # `email` varchar(128) NOT NULL default '',
  17. # PRIMARY KEY (`id`)
  18. # );
  19.  
  20. $db_table = 'user';
  21. //Manueller Include_path. Da wo PEAR liegt. Meist auf Shared-Hosting Accounts:
  22. $config['include_path']='/home/www/web68/files/!PEAR/';
  23.  
  24.  
  25.  
  26.  
  27. //Den Include-Path einstellen
  28. //Dies kann natürlich wegelassen werden, wenn eine Installation im lokalen Include_path erfolgt ist
  29. ini_set('include_path',$config['include_path'].PATH_SEPARATOR.get_include_path());
  30.  
  31.  
  32.  
  33. //PEAR-Pakete includen
  34. $pear_package = 'DB/Pager.php';
  35. if(!@include_once($pear_package)) die('Fehler: Das Pearpaket '.$pear_package.' wurde nicht gefunden!');
  36.  
  37. //Muss nicht, KANN
  38. $pear_package = 'DB.php';
  39. if(!@include_once($pear_package)) die('Fehler: Das Pearpaket '.$pear_package.' wurde nicht gefunden!');
  40.  
  41.  
  42.  
  43. //PEAR::DB initalisieren
  44.  
  45. //Datebbankdaten
  46. $config['sqlhost'] = 'localhost';
  47. $config['sqluser'] = '##';
  48. $config['sqlpass'] = '##';
  49. $config['db_name'] = '##';
  50.  
  51. //Datenbanktyp
  52. define ('_DBTYPE', 'mysql');
  53. //Alles nochmal (superglobalen) Konstanten zuweisen
  54. define ('_DBUSER', $config['sqluser']);
  55. define ('_DBPASS', $config['sqlpass']);
  56. define ('_DBHOST', $config['sqlhost']);
  57. define ('_DBNAME', $config['db_name']);
  58.  
  59. //Der DSN
  60. define ('_DSN',_DBTYPE.'://'._DBUSER.':'._DBPASS.'@'._DBHOST.'/'._DBNAME);
  61.  
  62.  
  63. //
  64. //
  65. //
  66. //Per PEAR::DB mit der Datenbank Verbindung aufnehemen
  67. //
  68. //
  69. //
  70.  
  71.  
  72. //Optionen: z.B. dubug ist das Debug-Level,
  73. //das man mit 0 natürlich auch ausschalten kann
  74. $db_options = array(
  75. 'debug' => 2
  76. );
  77. //Referenz auf das PEAR::DB Objekt mit der
  78. //Konstanten _DSN in der unser DSN_String schlummert
  79. $db =& DB::connect(_DSN, $db_options);
  80.  
  81. //Immer checken ob kein Fehler aufgetreten ist.
  82. //Ab dann bricht das Script per die() ab und
  83. //gibt eine PEAR-Fehlermeldung aus
  84. if (DB::isError($db)) {
  85. die($db->getMessage());
  86. }
  87.  
  88.  
  89. //
  90. //
  91. //
  92. //Per PEAR::DB Daten aus einer Datenbank ziehen
  93. //
  94. //
  95. //
  96.  
  97.  
  98. //Zeit einen (zugegeben sehr trivialen) Query zu senden ;-)
  99. //Starten wir mit dem SQL-Statement
  100. $sql = 'SELECT * FROM '.$db_table;
  101.  
  102.  
  103. //ACHTUNG: Dieser Query wird nur dazu gebraucht um die komplette Datenmenge zu ermitteln
  104. $res =& $db->query($sql);
  105.  
  106. if (DB::isError($res)) {
  107. die($res->getMessage());
  108. }
  109. //Die komplette Anzahl der Zeilen ermitteln
  110. $numrows = $res->numRows();
  111.  
  112.  
  113. //Wichtig ist jetzt der Unterschied zur "Standard-Funktion" DB::query()
  114. //Zum Pagen müssen wir dem Query nämlich ein Limit verpassen.
  115. //Dies machen wir mit DB::limitQuery()
  116. //Damit auch apäter die Werte korrekt per GET-Request eingelesen werden können,
  117. //verpassen wir der Variablen $from noch einen dreifach-konditionalen Operator auf $_GET['page']
  118. //(das was wir später in den Link zum Blättern schreiben)
  119. $from = isset($_GET['page']) ? $_GET['page'] : 0;
  120. // Wie viele Results ausgegeben werden
  121. $limit = 4;
  122. // Hier wird der "Google-Algorithmus" verwendet,
  123. //der ab einer bestimmten Menge von Seiten, diese begrenzt. [optional]
  124. $maxpages = 5;
  125.  
  126.  
  127. $res = $db->limitQuery($sql, $from, $limit);
  128.  
  129. //Es besteht immer die Möglichkeit ein mysql_error() mit dran zuhängen,
  130. //falls man vor lauter Fehlern mal nicht weiterkommen sollte.
  131. //(Später wieder löschen um den bösen Hackern die Tour zu versauen)
  132. if (DB::isError($res)) {
  133. die($res->getMessage().mysql_error());
  134. }
  135.  
  136. //Resultset holen. Hier benutze ich die Konstante DB_FETCHMODE_ASSOC (Stichwort: mysql_fetch_array()),
  137. //die einen assoziativen Array zuweist.
  138. //Es ist auch möglich hier eigene Funktionen zu verwenden
  139. //Stichwort: mysql_fetch_array()
  140.  
  141. //der Tabellenkopf ;-)
  142. <table width="80%" border="1">
  143. <tr>
  144. <th width="34" scope="col">ID</th>
  145. <th width="340" scope="col">Name</th>
  146. <th width="422" scope="col">Email</th>
  147. </tr>
  148. <tr>
  149. <td>'.$row['id'].'</td>
  150. <td>'.$row['name'].'</td>
  151. <td>'.$row['email'].'</td>
  152. </tr>
  153. </table>
  154. ';
  155.  
  156.  
  157. //
  158. //
  159. //Pager
  160. //
  161. //
  162.  
  163.  
  164. //Kommen wir zum eigentlichen Pager:
  165. //Die erforderlichen Daten werde mit DB_Pager::getData() ermittelelt.
  166. //Diese Funtion gibt ein assoziatives Array, mit allen benötigten
  167. //Werten zurück, die zum Bauen des Pagers benötigt werden.
  168. //Bei den Parametern treffen wir nun wieder alte Bekannte.
  169. $data = &DB_Pager::getData($from, $limit, $numrows, $maxpages);
  170.  
  171.  
  172. //Fangen wir mit dem "Zurück-Link" an:
  173. echo $prevlink = isset($data['prev']) ? '<a xhref="'.$_SERVER['PHP_SELF'].'?page='.$data['prev'].'">zur&uuml;ck&nbsp;</a>' : '';
  174.  
  175. //Weiter geht es mit den Seiten
  176. // hierfür müssen wir uns aber einer foreach-Schleife bedienen.
  177. foreach($data['pages'] as $a => $val){
  178. echo '<a xhref="'.$_SERVER['PHP_SELF'].'?page='.$val.'">&nbsp;'.$a.'&nbsp;</a>';
  179. }
  180.  
  181. //Und last but not least der "Weiter-Button"
  182. echo $nextlink = isset($data['next']) ? '<a xhref="'.$_SERVER['PHP_SELF'].'?page='.$data['next'].'">weiter&nbsp;</a>' : '';
  183.  
  184.  
  185. //Das war`s
  186.  
  187.  
  188. //Wer zu faul ist, sich Daten für das Tutorial einzutippen
  189. /*
  190. INSERT INTO `user` VALUES (1, 'Tom', 'tom@phpschnipsel.de');
  191. INSERT INTO `user` VALUES (2, 'Klaus', 'klaus@phpschnipsel.de');
  192. INSERT INTO `user` VALUES (3, 'Jenny', 'jenny@phpschnipsel.de');
  193. INSERT INTO `user` VALUES (4, 'Claudia', 'cl@phpschnipsel.de');
  194. INSERT INTO `user` VALUES (5, 'ich', 'ich@phpschnipsel.de');
  195. INSERT INTO `user` VALUES (6, 'toller', 'toller@phpschnipsel.de');
  196. INSERT INTO `user` VALUES (7, 'Max', 'max@phpschnipsel.de');
  197. INSERT INTO `user` VALUES (8, 'Miliav', 'mm@phpschnipsel.de');
  198. INSERT INTO `user` VALUES (9, 'Superdupermann', 'wer@phpschnipsel.de');
  199. INSERT INTO `user` VALUES (10, 'tommy', 'tommy@phpschnipsel.de');
  200. INSERT INTO `user` VALUES (11, 'Vater', 'vater@phpschnipsel.de');
  201. INSERT INTO `user` VALUES (12, 'mudda', 'mudda@phpschnipsel.de');
  202. */
  203.  
  204. ?>

kommentieren