Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 

 
Reply to this topicStart new topic
> [klasa] DB manager
ARJ
post 18.09.2006, 11:47:29
Post #1





Grupa: Zarejestrowani
Postów: 442
Pomógł: 18
Dołączył: 20.09.2004
Skąd: Kraków - NH -

Ostrzeżenie: (0%)
-----


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. ?>


Ten post edytował ARJ 18.09.2006, 18:29:30


--------------------
Warsztat: Windows 7 Pro 64bit | Apache 2.2 | PHP 5.2 | MySQL 5.0 | PHPmyadmin 2.6.4
Go to the top of the page
+Quote Post
Ociu
post 18.09.2006, 12:56:50
Post #2





Grupa: Moderatorzy
Postów: 1 443
Pomógł: 24
Dołączył: 14.05.2003
Skąd: Połaniec




I to koniec ? Nic więcej ? Po co tworzyć coś nowego, coś co po prostu tworzy obiekt PDO ? Szkoda na to czasu.


--------------------
Szukam młodego programisty do współpracy ! Kontakt na pw.
Go to the top of the page
+Quote Post
SongoQ
post 18.09.2006, 13:02:32
Post #3





Grupa: Przyjaciele php.pl
Postów: 2 922
Pomógł: 8
Dołączył: 25.10.2004
Skąd: Rzeszów - studia / Warszawa - praca

Ostrzeżenie: (0%)
-----


PDO obslugukje wiele baz a w Twoim kodzie jest ustawienie kodowanie tylko dla MySQLa, to chyba nie powinno miec miejsca.


--------------------
Go to the top of the page
+Quote Post
ARJ
post 18.09.2006, 13:18:31
Post #4





Grupa: Zarejestrowani
Postów: 442
Pomógł: 18
Dołączył: 20.09.2004
Skąd: Kraków - NH -

Ostrzeżenie: (0%)
-----


@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.


--------------------
Warsztat: Windows 7 Pro 64bit | Apache 2.2 | PHP 5.2 | MySQL 5.0 | PHPmyadmin 2.6.4
Go to the top of the page
+Quote Post
nospor
post 18.09.2006, 14:43:32
Post #5





Grupa: Moderatorzy
Postów: 13 697
Pomógł: 1286
Dołączył: 27.12.2004




Ź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. ?>


--------------------
"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

--------------------
Wypełniasz PIT? Kliknij tu lub tu! Ciebie to nic nie będzie kosztować, a komuś życie możesz uratować
Moje klasy: Pager (stronicowanie) | Cache | ShoutBox (mini chat) | ActionsManager |||| Dział download
Artykuły: wzorzec obserwator | php-faq | mysql-faq | grupowanie wyników | wyszukiwarka | inne

Go to the top of the page
+Quote Post
ARJ
post 18.09.2006, 15:14:43
Post #6





Grupa: Zarejestrowani
Postów: 442
Pomógł: 18
Dołączył: 20.09.2004
Skąd: Kraków - NH -

Ostrzeżenie: (0%)
-----


@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. ?>


--------------------
Warsztat: Windows 7 Pro 64bit | Apache 2.2 | PHP 5.2 | MySQL 5.0 | PHPmyadmin 2.6.4
Go to the top of the page
+Quote Post
nospor
post 18.09.2006, 15:18:55
Post #7





Grupa: Moderatorzy
Postów: 13 697
Pomógł: 1286
Dołączył: 27.12.2004




hehe, no tak, przeciez query() zwraca obiekt. moja wina.
Ale jesli na tym obiekcie zrobisz fetchAll(), to dostaniesz cala tablice


--------------------
"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

--------------------
Wypełniasz PIT? Kliknij tu lub tu! Ciebie to nic nie będzie kosztować, a komuś życie możesz uratować
Moje klasy: Pager (stronicowanie) | Cache | ShoutBox (mini chat) | ActionsManager |||| Dział download
Artykuły: wzorzec obserwator | php-faq | mysql-faq | grupowanie wyników | wyszukiwarka | inne

Go to the top of the page
+Quote Post
SongoQ
post 18.09.2006, 15:30:50
Post #8





Grupa: Przyjaciele php.pl
Postów: 2 922
Pomógł: 8
Dołączył: 25.10.2004
Skąd: Rzeszów - studia / Warszawa - praca

Ostrzeżenie: (0%)
-----


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.


--------------------
Go to the top of the page
+Quote Post
ARJ
post 18.09.2006, 18:30:08
Post #9





Grupa: Zarejestrowani
Postów: 442
Pomógł: 18
Dołączył: 20.09.2004
Skąd: Kraków - NH -

Ostrzeżenie: (0%)
-----


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


--------------------
Warsztat: Windows 7 Pro 64bit | Apache 2.2 | PHP 5.2 | MySQL 5.0 | PHPmyadmin 2.6.4
Go to the top of the page
+Quote Post
Fipaj
post 18.09.2006, 19:07:11
Post #10





Grupa: Zarejestrowani
Postów: 691
Pomógł: 0
Dołączył: 19.01.2005
Skąd: Warszawa

Ostrzeżenie: (0%)
-----


@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


--------------------
Go to the top of the page
+Quote Post
NetJaro
post 18.09.2006, 19:12:54
Post #11





Grupa: Zarejestrowani
Postów: 466
Pomógł: 0
Dołączył: 1.04.2005
Skąd: Warszawa

Ostrzeżenie: (0%)
-----


Cytat
poprostu nie wiem co jeszcze musi posiadać taka klasa: liczenie rekordów w tabeli?

Taka podstawa jak cache ;-)


--------------------
Pozdrawiam,
Marcin Jarek.
GG: 2811253
Go to the top of the page
+Quote Post
ARJ
post 18.09.2006, 19:52:47
Post #12





Grupa: Zarejestrowani
Postów: 442
Pomógł: 18
Dołączył: 20.09.2004
Skąd: Kraków - NH -

Ostrzeżenie: (0%)
-----


@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.


--------------------
Warsztat: Windows 7 Pro 64bit | Apache 2.2 | PHP 5.2 | MySQL 5.0 | PHPmyadmin 2.6.4
Go to the top of the page
+Quote Post
NuLL
post 18.09.2006, 20:16:57
Post #13





Grupa: Zarejestrowani
Postów: 2 243
Pomógł: 19
Dołączył: 3.05.2004
Skąd: Sopot

Ostrzeżenie: (0%)
-----


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


--------------------
Wole projektowac niz programowac...
Go to the top of the page
+Quote Post
ARJ
post 18.09.2006, 20:35:41
Post #14





Grupa: Zarejestrowani
Postów: 442
Pomógł: 18
Dołączył: 20.09.2004
Skąd: Kraków - NH -

Ostrzeżenie: (0%)
-----


@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ć.


--------------------
Warsztat: Windows 7 Pro 64bit | Apache 2.2 | PHP 5.2 | MySQL 5.0 | PHPmyadmin 2.6.4
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 9.02.2010 - 11:51