Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [klasa] DB manager
Forum PHP.pl > Inne > Oceny
ARJ
witam.
wystartowałem z projektem frameworka i póki co ciężko mi idzie. postanowiłem napisać najpierw DB manager i dopiero wgłębiać się dalej.
proszę o ocenę kodu i wszelkie sugestię. PDO dopiero poznaje jak i możliwości php5 dlatego podejrzewam, że mogłem coś namieszać smile.gif zastosowania nie podaję bo to chyba oczywiste.

config
  1. <?php
  2. define('DB_HOST','localhost');
  3. define('DB_USER','arj');
  4. define('DB_PASS','');
  5. define('DB_NAME','test');
  6. define('DB_KIND','mysql');
  7. define('DB_CHARSET','utf8');
  8. define('DB_COLCON','utf8_general_ci');
  9. ?>


dbmanager.class.php
  1. <?php
  2. /**
  3.  * Database Manager
  4.  * 
  5.  * @package Darion
  6.  * @author Arkadiusz 'ARJ' Jasak
  7.  * @copyright Copyright (c) 2006 Arkadiusz 'ARJ' Jasak (ajasak[at]gmail.com)
  8.  * @version 0.2
  9.  */
  10. class DBmanager{
  11. /**
  12.  * Object instance
  13.  *
  14.  * @var object
  15.  * @access private
  16.  */
  17. static private $thisInstance = null;
  18.  
  19. /**
  20.  * Query results
  21.  *
  22.  * @var array
  23.  * @access private
  24.  */
  25. private $result = array();
  26.  
  27. /**
  28.  * PDO instance
  29.  *
  30.  * @var object
  31.  * @access private
  32.  */
  33. private $dbh;
  34.  
  35. /**
  36.  * Number of executes
  37.  *
  38.  * @access private
  39.  * @var int
  40.  */
  41. private $numExecutes = 0;
  42.  
  43. /**
  44.  * Constructor
  45.  * Connect to database and set character encoding
  46.  * @access public
  47.  */
  48. public function __construct(){
  49. try{
  50. $this->dbh = new PDO(DB_KIND.':host='.DB_HOST.';dbname='.DB_NAME, DB_USER, DB_PASS);
  51. $this->dbh->exec('SET CHARACTER SET '.DB_CHARSET);
  52. $this->dbh->exec('SET collation_connection = '.DB_COLCON.';');
  53. }catch (PDOException $e){
  54. echo 'Error!: ' . $e->getMessage() . '<br/>';
  55. }
  56. }
  57.  
  58. /**
  59.  * Query and fetch
  60.  *
  61.  * @param string $_query
  62.  * @param string $_mode
  63.  * @param int $_param
  64.  * @access public
  65.  * @return array
  66.  */
  67. public function queryandfetch($_query, $_mode, $_param = NULL){
  68. $this->numExecutes++;
  69. $this->result = null;
  70. $this->result = $this->dbh->query($_query);
  71.  
  72. switch ($_mode){
  73. case 'assoc':
  74. return $this->result->fetchAll(PDO::FETCH_ASSOC);
  75. break;
  76. case 'both':
  77. return $this->result->fetchAll(PDO::FETCH_BOTH);
  78. break;
  79. case 'column':
  80. return $this->result->fetchAll(PDO::FETCH_COLUMN, $_param);
  81. break;
  82. default:
  83. return $this->result->fetchAll(PDO::FETCH_ASSOC);
  84. }
  85. }
  86.  
  87. /**
  88.  * Exec: insert, update, delete
  89.  *
  90.  * @param string $_exec
  91.  * @access public
  92.  * @return int or false
  93.  */
  94. public function exec($_exec){
  95. $this->numExecutes++;
  96. $this->result = $this->dbh->exec($_exec);
  97. if($this->result == false){
  98. return false;
  99. }else{
  100. return $this->result;
  101. }
  102. }
  103.  
  104. /**
  105.  * Count rows number
  106.  *
  107.  * @param string $_table
  108.  * @param string $_where
  109.  * @return int
  110.  */
  111. public function numRows($_table, $_where){
  112. $this->numExecutes++;
  113. $this->result = $this->dbh->query("SELECT COUNT(*) FROM ".$_table." WHERE ".$_where);
  114. return $this->result->fetchColumn();
  115. }
  116.  
  117. /**
  118.  * Return number of executes
  119.  *
  120.  * @access public
  121.  * @return int
  122.  */
  123. public function numExecutes(){
  124. return $this->numExecutes;
  125. }
  126.  
  127. /**
  128.  * Singleton
  129.  *
  130.  * @access public
  131.  * @return object
  132.  */
  133. static public function getInstance() {
  134. if(self::$thisInstance == null)
  135. {
  136. self::$thisInstance = new DBmanager();
  137. }
  138. return self::$thisInstance;
  139. }
  140.  
  141. /**
  142.  * Destructor
  143.  * Close connection with database
  144.  * @access public
  145.  */
  146. public function __destruct(){
  147. $this->dbh = null;
  148. }
  149. }
  150. ?>
Ociu
I to koniec ? Nic więcej ? Po co tworzyć coś nowego, coś co po prostu tworzy obiekt PDO ? Szkoda na to czasu.
SongoQ
PDO obslugukje wiele baz a w Twoim kodzie jest ustawienie kodowanie tylko dla MySQLa, to chyba nie powinno miec miejsca.
ARJ
@Ociu a co tam powinno być więcej? stworzyłem tą klasę ponieważ gdy stworze np. frameworka i okaże się, że na serwerze nie ma PDO to wtedy przerabiam klasę na np. adodb. poprostu nie wiem co jeszcze musi posiadać taka klasa: liczenie rekordów w tabeli?
@SongoQ no tak pewne przeoczenie, a w innych typach baz danych też trzeba ustawić kodowanie znaków czy to tylko dotyczny MySQL? nie orientuje się w tym temacie.
nospor
Ździebko przekombinoiwales:
  1. <?php
  2. foreach ($this->dbh->query($_query) as $row) {
  3.  $this->result[] = $row;
  4. }
  5. ?>

Przeciez mozna szybciej, latwiej, prosciej:
  1. <?php
  2. $this->result = $this->dbh->query($_query);
  3. ?>
ARJ
@nospor próbowałem już tak. wtedy metoda zwraca
Cytat
PDOStatement Object
(
[queryString] => SELECT * FROM templates
)

chyba że to jakoś inaczej trzeba się do tego zabrać. ja próbuje w ten sposób:
  1. <?php
  2. //najpierw include configu i samej klasy dbmanager
  3. $connection = DBmanager::getInstance();
  4. $cos = $connection->queryandfetch('SELECT * FROM templates');
  5. echo "<pre>";
  6. print_r($cos);
  7. echo "</pre>";
  8. ?>
nospor
hehe, no tak, przeciez query() zwraca obiekt. moja wina.
Ale jesli na tym obiekcie zrobisz fetchAll(), to dostaniesz cala tablice
SongoQ
Cytat
@SongoQ no tak pewne przeoczenie, a w innych typach baz danych też trzeba ustawić kodowanie znaków czy to tylko dotyczny MySQL? nie orientuje się w tym temacie.


Jesli masz kodowanie w bazie ok to nic nie musisz robic. W MySQLu stosuje sie to jesli klient mysqla lub kodowanie odbiega od tego jak jest na www.
ARJ
w pierwszym poście przedstawiam DB manager ver 0.2
Wprowadziłem następujące zmiany:
- przerobiona metoda queryandfetch (można wybrać co ma zostać zwrócone)
- nowa metoda numRows
- nowa zmienna i metoda numExecutes zwracająca ilość zapytań wysłanych do bazy

ToDo:
- napisać obsługę Exceptions
- wprowadzić wszystkie poprawki i naprawić błędy które tu zgłosicie
Fipaj
@ARJ: sam też tworzyłem takie klasy, a potem była krótka acz owocna przygoda z Ruby on Rails i...

http://wiki.rubyonrails.org/rails/pages/ActiveRecord

Ot, jeszcze Propel jest całkiem ciekawy. Podobno chcą go na PDO przetegować, wtedy będzie już całkiem ciekawie smile.gif
NetJaro
Cytat
poprostu nie wiem co jeszcze musi posiadać taka klasa: liczenie rekordów w tabeli?

Taka podstawa jak cache ;-)
ARJ
@NetJaro zaskoczyłeś mnie i to totalnie. nie wiem czemu nie przyszło mi to do głowy. już zabieram się do szukania i czytania na czym to polega bo nigdy nie pisałem cache`a.
teraz do ToDo moge dodać Cache.
jeżeli macie jeszcze jakieś pomysły lub uwagi to słucham. dzięki za wszystkie podpowiedzi do tej pory.
NuLL
Maly Tip - http://ez.no/doc/components/view/1.1.1/(fi...n_Database.html - podpatrz co tu daja i oferuje a potem sie zastanow nad pisaniem wlasnych wariacji nt PDO winksmiley.jpg
ARJ
@Null to co pokazałeś jest bardzo ciekawe. zaskoczył mnie sposób budowania zapytań. moja klasa nie dorówna czemuś takiemu ale potrzebuję coś na własny użytek.
prawda jest taka, że mam słomiany zapał. łapię się za coś i w 1/4 zostawiam projekt bo nauczyłem się czegoś nowego i chce to przetestować lub nie chce mi się dalej tego pisać. jest to zasadniczo pierwsza moja klasa w php5 z pełną dokumentacją która doczekała się numerka wersji smile.gif
będzie to raczej prosta klasa na początek. dopisze cache i może coś jeszcze. gdybym wcześniej o tym wiedział to może bym tego nie pisał ale jak zacząłem to musze skończyć.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2024 Invision Power Services, Inc.