Guest User

Baza

a guest
Jan 17th, 2014
151
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
PHP 12.51 KB | None | 0 0
  1.  
  2. /* * ***************************************************************************
  3.  * Klasa Bazy - umożliwia dostęp do baz danych: mysql i sqlite oraz postgree
  4.  * *****************************************************************************
  5.  *
  6.  * Klasa podczas inicjalizacji jest przyłączana do kontrolera jako dodatkowa
  7.  * subklasa
  8.  *
  9.  * Dostęp do niej jest realizowany poprzez właściwość 'baza' kontrolera
  10.  *
  11.  * W dowolnej metodzie kontrolera, jeśli wcześniej baza została zainicjalizowana
  12.  * można wykonać następujący kod
  13.  * $this->baza->(metoda)->(metoda)->metoda()->wykonaj()
  14.  *
  15.  * Przykłady
  16.  *
  17.  * $this->baza->tabela('tabela')->pobierz()->wykonaj();
  18.  * Wykona zapytanie SELECT * FROM 'tabela' i zwróci rekordy tego zapytania
  19.  * w postacji tablicy numerycznej, w której każdy element to tablica asocjacyjna
  20.  * zawierająca dane rekordu ,gdzie klucze są polami a pola - wartościami
  21.  *
  22.  *
  23.  * UWAGA: każdy ciąg musi być zakończony metodą wykonaj() !!!
  24.  *
  25.  * Przykłady zapytan:
  26.  * 1.   $this->baza->tabela('tabela')->usun()->wykonaj();
  27.  *      DELETE FORM 'tabela'
  28.  *
  29.  * 2.   $this->baza->tabela('tabela')->pobierz()->gdzie(array('id'=>1)
  30.  *          ->pola('user')
  31.  *      SELECT (user) FROM 'tabela' WHERE id = 2
  32.  *
  33.  * 3.   $this->baza->tabela('tabela')->update(array('pole' => 'wartosc'))
  34.  *          ->gdzie(array('id'=>4)
  35.  *      UPDATE tabela SET pole = wartosc WHERE id = 4
  36.  *
  37.  * ************************************************************************** */
  38.  
  39. class Baza {
  40.  
  41.     var $pdo;
  42.     var $nazwa;
  43.     var $port;
  44.     var $login;
  45.     var $haslo;
  46.     var $zapytanie = ' SELECT * FROM tabela WHERE 1 = 1';
  47.     var $operacja = ' SELECT ';
  48.     var $tabela = ' tabela ';
  49.     var $pola = ' * ';
  50.     var $z = ' FROM ';
  51.     var $warunek = ' WHERE 1 = 1';
  52.     var $wartosci = '';
  53.     var $handlers = array();
  54.  
  55.     /*     * *******************************************************************
  56.      * Konstruktor
  57.      * *********************************************************************** */
  58.  
  59.     public function __construct() {
  60.         $this->resetuj();
  61.         $this->konfiguruj();
  62.     }
  63.  
  64.     public function konfiguruj() {
  65.         global $konfiguracja;
  66.  
  67.         foreach ($konfiguracja['baza'] as $konfiguracjaBazy) {
  68.             $pdo = $konfiguracjaBazy['pdo'];
  69.             $host = $konfiguracjaBazy['host'];
  70.             $nazwa = $konfiguracjaBazy['nazwa'];
  71.             $port = $konfiguracjaBazy['port'];
  72.             $login = $konfiguracjaBazy['login'];
  73.             $haslo = $konfiguracjaBazy['haslo'];
  74.             $znaki = $konfiguracjaBazy['znaki'];
  75.  
  76.  
  77.             if ($pdo == 'mysql') {
  78.                 $handler = new PDO("mysql:host=$host;dbname=$nazwa;port=$port;charset", $login, $haslo, array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES $znaki"));
  79.             } else if ($pdo == 'sqlite') {
  80.                 $handler = new PDO("sqlite:$nazwa");
  81.             } else if ($pdo == 'pgsql') {
  82.                 $handler = new PDO("pgsql:host=$host;port=$port;dbname=$nazwa;user=$login;password=$haslo");
  83.             }
  84.  
  85.  
  86.             $this->handlers[] = $handler;
  87.         }
  88.     }
  89.  
  90.     /*     * *****************************************************************************
  91.      * Wybór tabeli, w kontolerze należy używać $this->baza->tabela('tabela')->(dalsze operacje)
  92.      *
  93.      * ***************************************************************************** */
  94.  
  95.     public function tabela($tabela) {
  96.         $this->tabela = $tabela;
  97.         return $this;
  98.     }
  99.  
  100.     /*     * ****************************************************************************
  101.      * Wybór pól przy zapytaniach typu select
  102.      * np: $this->baza->('tabela')->pola(array('pole1', 'pole2')
  103.      * *************************************************************************** */
  104.  
  105.     public function pola($tablica) {
  106.         $this->pola = ' ' . implode(', ', $tablica) . ' ';
  107.     }
  108.  
  109.     /*     * *****************************************************************************
  110.      * Formułowanie części zapytania "WHERE" przy zapytaniach typu SELECT, UPDATE i  DELETE
  111.      * np: $this->baza->tabela('tabela')->where('pole' => 'wartosc')->(dalsze operacje)
  112.      * ***************************************************************************** */
  113.  
  114.     public function gdzie($tablicaLubPole = false, $wartosc = false) {
  115.         if (is_array($tablicaLubPole) AND !empty($tablicaLubPole)) {
  116.             $tablica = $tablicaLubPole;
  117.             $warunek = ' WHERE ';
  118.  
  119.             $iteracja = 0;
  120.  
  121.             foreach ($tablica as $pole => $wartosc) {
  122.                 if ($iteracja > 0)
  123.                     $warunek .= ' AND ';
  124.  
  125.                 $wartosc = $this->handlers[0]->quote($wartosc);
  126.                 $warunek .= " $pole = $wartosc ";
  127.             }
  128.  
  129.             $this->warunek = $warunek;
  130.  
  131.             return $this;
  132.         } else if (is_string($tablicaLubPole)) {
  133.             $pole = $tablicaLubPole;
  134.             $wartosc = $this->handlers[0]->quote($wartosc);
  135.             $warunek = ' WHERE ' . $pole . ' = ' . $wartosc;
  136.             $this->warunek = $warunek;
  137.             return $this;
  138.         } else {
  139.             return $this;
  140.         }
  141.     }
  142.  
  143.     /*     * ****************************************************************************
  144.      * Ustawienie bazy na zapytanie typu SELECT
  145.      * np: $this->baza->tabela('tabela')->pola(array('pole1', 'pole2'))->pobierz()
  146.      * da zapytanie:
  147.      * SELECT pole1, pole2 FROM 'tabela';
  148.      *
  149.      * *************************************************************************** */
  150.  
  151.     public function pobierz() {
  152.         $this->operacja = ' SELECT ';
  153.         $this->wartosci = '';
  154.         if (empty($this->pola)) {
  155.             $this->pola = ' * ';
  156.         }
  157.         return $this;
  158.     }
  159.  
  160.     /*     * ****************************************************************************
  161.      * Ustawienie typu zapytania na zapytanie typu UPDATE
  162.      * np: $this->baza->tabela('tabela')->gdzie(array('id' => 2))->aktualizuj(array('pole1' => 2))
  163.      * da zapytanie UPDATE 'tabela' SET pole1 = 2
  164.      * *************************************************************************** */
  165.  
  166.     public function aktualizuj($tablicaWartosci) {
  167.         $this->operacja = ' UPDATE ';
  168.         $this->pola = '';
  169.         $this->z = '';
  170.         $this->formulujUstaw($tablicaWartosci);
  171.         return $this;
  172.     }
  173.  
  174.     /*     * ****************************************************************************
  175.      * formulujUstaw i formulujDodaj
  176.      * metody prywatne odpowiadające za sformułowanie fragmentów zapytań dla UPDATE tabela SET (funkcja) i
  177.      * INSERT INTO tabela (funkcja)
  178.      * *************************************************************************** */
  179.  
  180.     private function formulujUstaw($tablicaWartosci) {
  181.         $tablicaStringow = array();
  182.  
  183.         foreach ($tablicaWartosci as $pole => $wartosc) {
  184.             $wartosc = $this->handlers[0]->quote($wartosc);
  185.             $tablicaStringow[] = " $pole = $wartosc ";
  186.         }
  187.         $this->wartosci = ' SET ' . implode(',', $tablicaStringow);
  188.     }
  189.  
  190.     private function formulujDodaj($tablicaWartosci) {
  191.         $pola;
  192.         $wartosci;
  193.  
  194.         foreach ($tablicaWartosci as $pole => $wartosc) {
  195.             $pola[] = $pole;
  196.             $wartosci[] = $this->handlers[0]->quote($wartosc);
  197.         }
  198.         $pola = " (" . implode(', ', $pola) . ") ";
  199.         $wartosci = " ( " . implode(', ', $wartosci) . " ) ";
  200.  
  201.         $this->wartosci = $pola . ' VALUES ' . $wartosci;
  202.     }
  203.  
  204.     /*     * ****************************************************************************
  205.      * dodaj - metoda odpowiadająca za utworzenie zapytania typu INSERT
  206.      * np $this->baza->tabela('tabela')->insert(array('pole1' => 'wartosc1', 'pole2'=> 'wartosc2'))
  207.      * da zapytanie INSERT INTO tabela('pole1', 'pole2') VALUES ('wartosc1', 'wartosc2')
  208.      * *************************************************************************** */
  209.  
  210.     public function dodaj($tablicaWartosci) {
  211.         $this->operacja = 'INSERT INTO ';
  212.         $this->z = '';
  213.  
  214.         $this->formulujDodaj($tablicaWartosci);
  215.         return $this;
  216.     }
  217.  
  218.     /*     * *******************************************************************
  219.      * usun - metoda odpowiadająca za usuwanie rekordów
  220.      * np: $this->baza->tabela('tabela')->gdzie(array ('id'=>2, 'pole1' => 'wartosc'))->usun()
  221.      * da zapytanie: DELETE FROM 'tabela' WHERE id = 2 AND pole1 = 'wartosc'
  222.      * *********************************************************************** */
  223.  
  224.     public function usun() {
  225.         $this->operacja = ' DELETE ';
  226.         $this->z = ' FROM ';
  227.         $this->pola = '';
  228.         $this->wartosci = '';
  229.         return $this;
  230.     }
  231.  
  232.     /*     * *******************************************************************
  233.      * oczysc - funkcja umożliwiająca oczyszczenie ciągu znaków ze znaków niedo-
  234.      * puszczalnych dla danego PDO
  235.      * *********************************************************************** */
  236.  
  237.     public function oczysc($ciag_znakow) {
  238.         return $this->handlers[0]->quote($ciag_znakow);
  239.     }
  240.  
  241.     /*     * *******************************************************************
  242.      * zapytanie - metoda pozwalająca na samodzielne wprowadzenie zapytania do
  243.      * instancji klasy np:
  244.      * $this->baza->zapytanie('SELECT * FROM 'tabela')->wykonaj();
  245.      * wykona zapytanie i zwróci rekordy
  246.      * *********************************************************************** */
  247.  
  248.     public function zapytanie($zapytanie) {
  249.         $this->resetuj();
  250.         $this->zapytanie = $zapytanie;
  251.         return $this;
  252.     }
  253.  
  254.     /*     * **********************************************************************
  255.      * sformuluj - metoda prywatna odpowiadająca za sformułowanie zapytania, wykonywana przy
  256.      * wywołaniu wykonaj
  257.      *
  258.      * ********************************************************************** */
  259.  
  260.     private function sformuluj() {
  261.         if (empty($this->zapytanie)) {
  262.             $this->zapytanie = $this->operacja . $this->pola . $this->z . $this->tabela . $this->wartosci . $this->warunek;
  263.         }
  264.        
  265.     }
  266.  
  267.     /*     * **********************************************************************
  268.      * resetuj - metoda odpowiadająca za resetowanie zapytania i pól instancji
  269.      * klasy wywoływana po każdym wywołaniu metody - wykonaj
  270.      * ********************************************************************** */
  271.  
  272.     public function resetuj() {
  273.         $this->warunek = ' ';
  274.         $this->zapytanie = '';
  275.         $this->operacja = '';
  276.         $this->tabela = '';
  277.         $this->pola = '';
  278.         $this->wartosci = '';
  279.         $this->z = ' FROM ';
  280.     }
  281.  
  282.     /*     * **********************************************************************
  283.      * wykonaj - metoda wykonująca zadane zapytanie na bazie danych,
  284.      * każdy ciąg musi być zakończony jej wykonaniem na przykład:
  285.      * $this->baza->tabela('tabela')->gdzie(array ('id'=>2, 'pole1' => 'wartosc'))->usun()->wykonaj();
  286.      * zwraca rekordy zapytania
  287.      * ********************************************************************** */
  288.  
  289.     public function wykonaj() {
  290.         $this->sformuluj();
  291.         $wynik;
  292.         foreach ($this->handlers as &$handler) {
  293.             $wynik = $handler->query($this->zapytanie);
  294.         }
  295.         $this->resetuj();
  296.         if ($wynik) {
  297.             return $wynik->fetchAll();
  298.         }
  299.     }
  300.  
  301.     /*     * *******************************************************************
  302.      *  tablica - metoda zwracającą wynik, analogiczna do "wykonaj". Może być
  303.      * wykorzystana zamiast niej.
  304.      * Zwraca tablice numeryczną z rekordami
  305.      * ********************************************************************** */
  306.  
  307.     public function tablica() {
  308.         $wynik = $this->wykonaj();
  309.         if (is_array($wynik)) {
  310.             return $wynik;
  311.         } else {
  312.             return false;
  313.         }
  314.     }
  315.  
  316.     /*     * *******************************************************************
  317.      *  jeden - metoda zwracającą wynik, analogiczna do "wykonaj". Może być
  318.      * wykorzystana zamiast niej.
  319.      * Zwraca tablice asocjacyjną pierwszego elementu tablicy z wynikiem
  320.      * ********************************************************************** */
  321.  
  322.     public function jeden() {
  323.         $wynik = $this->wykonaj();
  324.         if (is_array($wynik)) {
  325.             return $wynik[0];
  326.         } else {
  327.             return false;
  328.         }
  329.     }
  330.  
  331. }
Advertisement
Add Comment
Please, Sign In to add comment