Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [PHP]Moja klasa do obsługi MySQL pod PDO, proszę o oceny i pomysły co do zmian :)
Apocalyptiq
post
Post #1





Grupa: Zarejestrowani
Postów: 230
Pomógł: 3
Dołączył: 8.01.2008

Ostrzeżenie: (10%)
X----


Witam!

Ostatnio przeszedłem z AdoDB na PDO. Napisałem (z pomocą tutejszych forumowiczów (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) ) taką klasę:

Kod
<?php class Database{
     protected $db;
     public function __construct(){
         $this->db=new Pdo('mysql:host=localhost;dbname=siatka','root','jo');
         $this->db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
     }
     public function sql($query,$return='exec',$binds=null){
         $sql=$this->db->prepare($query);
         if($binds!=null){
             if(is_array($binds)){
                 foreach($binds as $n => $bind)
                     $sql->bindValue(($n+1), $bind);
             } else
                 $sql->bindValue(1, $binds);
         }
         if($sql->execute()){
             # włączenie tablic jedynie asocjacyjnych
             # if($return!='exec') $sql->setFetchMode(PDO::FETCH_ASSOC);
             switch($return){
                 case 'all':
                     return $sql->fetchAll();
                     break;
                 case 'one':
                     return $sql->fetchColumn();
                     break;
                 case 'row':
                     return $sql->fetch();
                     break;
                 case 'id':
                     return $this->db->lastInsertId();
                     break;
             }
         } else
             return false;
     }
}
$db=new Database();?>

No i teraz, jeżeli np. z tabeli users chcę pobrać wiersz, gdzie login = $_POST['login'], piszę takie coś:
Kod
<?php $db->sql("SELECT * FROM users WHERE login=?","row",$_POST['login']);?>
. Dla rodzaju returnowania exec - nic nie jest zwracane. Służy to tylko do wykonywania działań na bazie: insert, update, delete.

Zamierzałem jakoś zoptymalizować tą klase - tj. rozbić jakoś rodzaj returnowania, zrobić osobne funkcje na returnowanie wiersza, wszystkiego, rekordu... Wtedy aby pobrać wiesz, napisalibyśmy np. $db->getRow("SELECT * FROM users WHERE id=1"). Proszę o jakieś pomysły jak tą klasę nieco zoptymalizować (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)

Może macie jakieś swoje, z których korzystacie? Albo jakieś gotowe klasy, które można pobrać z neta?

Ten post edytował nospor 17.11.2008, 13:23:37
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
Apocalyptiq
post
Post #2





Grupa: Zarejestrowani
Postów: 230
Pomógł: 3
Dołączył: 8.01.2008

Ostrzeżenie: (10%)
X----


Zmodyfikowałem klasę co do wyjątków:

Kod
<?php class Database{
     protected $db;
     public function __construct(){
         $this->db=new Pdo('mysql:host=localhost;dbname=siatka','root','jo');
         $this->db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
     }
     public function exec($query, $binds=null){
         try{
             $sql=$this->db->prepare($query);
             if($binds!==null){
                 if(is_array($binds)){
                     foreach($binds as $n => $bind)
                     $sql->bindValue($n+1,$bind);
                 } else
                     $sql->bindValue(1,$binds);
             }
             $sql->execute();
         } catch(PDOException $e){
             $_SESSION['mesg']='Wystapil bląd biblioteki PDO: '.$e->getMessage();
         }
         return $sql;
     }
     public function getAll($query, $binds=null){
         $sql=$this->exec($query,$binds);
         return $sql->fetchAll();
     }
     public function getRow($query, $binds=null){
         $sql=$this->exec($query,$binds);
         return $sql->fetch();
     }
     public function getOne($query, $binds=null){
         $sql=$this->exec($query,$binds);
         return $sql->fetchColumn();
     }
     public function insertId($query, $binds=null){
         $sql=$this->exec($query,$binds);
         return $this->db->lastInsertId();
     }
}
$db=new Database();?>


W $_SESSION["mesg"] przechowuje tymczasowe komunikaty, które później ładowane są na stronę.
Nic nie szkodzi, że returnuje $sql poza try{}catch{}? Bo wsadzając return $sql w try{}, funkcja mi nic nie zwróci. Jeżeli jest błąd, to execute() wywali false, ale jeżeli go drugi raz wywołam, to chyba drugi raz się wykona, tak? Jakbym dał tak:
Kod
        try{
             $sql=$this->db->prepare($query);
             if($binds!==null){
                 if(is_array($binds)){
                     foreach($binds as $n => $bind)
                     $sql->bindValue($n+1,$bind);
                 } else
                     $sql->bindValue(1,$binds);
             }
             $sql->execute();
         } catch(PDOException $e){
             $_SESSION['mesg']='Wystapil bląd biblioteki PDO: '.$e->getMessage();
         }
         if($sql->execute()) return $sql;

To zapytanie $sql ponownie wykona się na bazie?

[EDIT]

Co do podawania danych do połączenia, tak zmieniłem początek klasy Database:
Kod
class Database{
    protected $db;
    public function connect($engine,$host,$user,$pwd,$dbname){
        $this->db=new Pdo($engine.':host='.$host.';dbname='.$dbname,$user,$pwd);
        $this->db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    }
...

I teraz na początku index'u wypisujemy takie coś:
Kod
<?php #wrzucenie klasy Database
require_once 'inc/db.php';
$db=new Database();
$db->connect('mysql','localhost','root','haslo','nasza_baza');?>

I działa, dzięki za sugestie (IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg)

Ten post edytował Apocalyptiq 18.11.2008, 12:12:47
Go to the top of the page
+Quote Post

Posty w temacie
- Apocalyptiq   [PHP]Moja klasa do obsługi MySQL pod PDO   17.11.2008, 13:08:58
- - nospor   1) uzyj poprawnego bbcode 2) Przenosze. Z mysql to...   17.11.2008, 13:18:07
- - dr_bonzo   A co jak mam inna nazwe klasy, usera, hasla?   17.11.2008, 13:21:28
- - nospor   kolejna podstawa: [PHP] pobierz, plaintext <?ph...   17.11.2008, 13:28:50
- - Apocalyptiq   No nie zbinduje :/ A znasz może jakąś gotową pros...   17.11.2008, 15:11:56
- - nospor   CytatNo nie zbinduje Zamiast $binds!=nul...   17.11.2008, 15:17:25
- - Apocalyptiq   Dzięki nospor za wskazówki, i to z bindem null J...   17.11.2008, 15:30:36
- - nospor   jedna funkcja, ktora robi wszystko to "ble...   17.11.2008, 15:34:05
- - Apocalyptiq   A jak ustawić, aby te metody korzystały z tej jedn...   17.11.2008, 16:06:57
- - dr_bonzo   Cytatczy przy każdej z tych pomniejszych metod trz...   17.11.2008, 16:35:49
- - Apocalyptiq   No ale tą klasę piszę do działania na jednej bazie...   17.11.2008, 16:48:55
- - nospor   no ale powiedzmy ze te klase dasz koledze. On bed...   17.11.2008, 17:03:01
- - erix   CytatPS. Jakby w tej klasie jeszcze coś by...   17.11.2008, 17:07:25
- - Apocalyptiq   a jak sie wypluwa wyjątki?   17.11.2008, 19:32:32
- - erix   exceptions" title="Zobacz w manualu PHP" target="_...   17.11.2008, 19:46:25
- - Apocalyptiq   A jak to wsadzić do takiej bazy? W wikibooks widzi...   17.11.2008, 19:54:08
- - megawebmaster   Bo wyjątki się wypluwa wtedy, kiedy nie może dalej...   17.11.2008, 20:23:58
- - Apocalyptiq   Zmodyfikowałem klasę co do wyjątków: Kod<?php...   18.11.2008, 11:18:35


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

 



RSS Aktualny czas: 4.10.2025 - 09:00