Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

PDO i OOP konekcija sa bazom?

[es] :: PHP :: PDO i OOP konekcija sa bazom?

[ Pregleda: 2898 | Odgovora: 7 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

WoosTy

Član broj: 319486
Poruke: 3
*.tippnet.co.rs.



Profil

icon PDO i OOP konekcija sa bazom?01.12.2013. u 10:39 - pre 125 meseci
Imam par pitanja...
Kada radim sa OOP jel bolje da PDO konekcija ima svoju klasu ili da bude napolju pa da je onda ubacim gde je potrebna? Gledao sam na netu i vecina ljudi koristi ovako nesto:

Code:
<?php

defined("DB_HOST") ? NULL : define("DB_HOST", "localhost");
defined("DB_USER") ? NULL : define("DB_USER", "root");
defined("DB_PASS") ? NULL : define("DB_PASS", "");
defined("DB_NAME") ? NULL : define("DB_NAME", "website");

class DBConnection{
    
    private static $conn;
    
    public function __construct(){
        try{
            self::$conn = new PDO("mysql:host=". DB_HOST .";dbname=". DB_NAME, DB_USER, DB_PASS);
            self::$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
            echo "Connection<br>";
        } catch(PDOException $ex){
            die($ex->getMessage());
        }
    }
    
    public static function connected(){
        if(!isset(self::$conn)){
            self::$conn = new DBConnection();
        }
    }
    
}

$db = DBConnection::connected();
$query = $db->query("SELECT * FROM users");

?>


Problem je tu sto ne postoji "query" metoda, tj ne ucitava PDO query nego trazi tu metodu unutar ove klase...
Citat:
( ! ) Fatal error: Call to a member function query() on a non-object in C:\wamp\www\testDB\config.php on line 31



Takodje kada ubacim isto ovako u neku drugu klasu opet mi govori da ne postoji query() metoda. Da li je uospte dobro koristiti singleton pattern za konekciju sa bazom?
Da je bolje ovako raditi ili ubaciti konekciju kroz "class users extends DBConnection{ ... }"

Kako vi ovo radite?

Hvala unapred :)
 
Odgovor na temu

deZio
Inđija

Član broj: 150608
Poruke: 345
*.dynamic.isp.telekom.rs.



+38 Profil

icon Re: PDO i OOP konekcija sa bazom?01.12.2013. u 12:17 - pre 125 meseci
Nema pravila kako je bolje. Sve zavisi šta želiš postići.

Pošto ne postoji "query" metoda unutar te klase, moraš je sam dodati, pa da ti kod izgleda ovako:

Code (php):
<?php

defined("DB_HOST") ? NULL : define("DB_HOST", "localhost");
defined("DB_USER") ? NULL : define("DB_USER", "root");
defined("DB_PASS") ? NULL : define("DB_PASS", "");
defined("DB_NAME") ? NULL : define("DB_NAME", "website");

class DBConnection{
   
    private static $conn;
   
    public function __construct(){
        try{
            self::$conn = new PDO("mysql:host=". DB_HOST .";dbname=". DB_NAME, DB_USER, DB_PASS);
            self::$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
            echo "Connection<br>";
        } catch(PDOException $ex){
            die($ex->getMessage());
        }
    }
   
    public function query($sql){
        self::$conn->query($sql);
    }
   
}

?>


Dakle iz metode "query" klase DBConnection pozivaš metodu "query" klase PDO. Ali takav način rada ti je nepotreban jer samo kopiraš funkcionalnost query metode. Onda je bolje da direktno pozivaš PDO::query umesto što ga pozivaš iz klase DBConnection.

Kopiranje funkcionalnosti se obično radi ako želiš da svaki poziv na query uradi nešto pre nego što pozove PDO::query. Tada ti je potrebna tvoja klasa za komunikaciju sa bazom, dakle kada nešto želiš da uradiš pre/posle SVAKOG querya, preparea ili bilo koje druge metode..

Na primer hoćeš da napraviš metodu select koja bi trebalo da uradi select iz baze pomoću PDO i da ti vrati rezultat. Na taj način praktično skraćuješ potrebni kod za svaki select. Onda klasa treba da ti izgleda otprilike ovako:

Code (php):
<?php

defined("DB_HOST") ? NULL : define("DB_HOST", "localhost");
defined("DB_USER") ? NULL : define("DB_USER", "root");
defined("DB_PASS") ? NULL : define("DB_PASS", "");
defined("DB_NAME") ? NULL : define("DB_NAME", "website");

class DBConnection{
   
    private static $conn;
   
    public function __construct(){
        try{
            self::$conn = new PDO("mysql:host=". DB_HOST .";dbname=". DB_NAME, DB_USER, DB_PASS);
            self::$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
            echo "Connection<br>";
        } catch(PDOException $ex){
            die($ex->getMessage());
        }
    }
   
    public function query($sql){
        self::$conn->query($sql);
    }
   
    public function select($select, $from, $where){
        // >>> KREIRAJ SQL QUERY STRING NA OSNOVU ATRIBUTA FJE
        $sql = "SELECT $select FROM $from WHERE 1";
       
        foreach( $where as $key => $value )
            $sql .= " AND $key = :$key";
        // <<< KREIRAJ SQL QUERY STRING NA OSNOVU ATRIBUTA FJE
       
        $pdostatement = self::$conn->prepare( $sql );
       
        foreach( $where as $key => $value )
            $pdostatement -> bindParam(":$key", $value);

        $pdostatement->execute();
        return $pdostatement->fetchAll(PDO::FETCH_ASSOC);
    }
   
}

$db = DBConnection::connected();
$rezultat_selecta = $db->select( "naziv_kolone_1,naziv_kolone_2,naziv_kolone_3", "naziv_tabele", array( 'where1' => 'vrednost1', 'where2' => 'vrednost2' ) );

?>


Pisao sam kod na brzinu tako da je moguće da postoje greške, ali bitno je da suštinu razumeš. Znači PDO ubacuj u svoju klasu ako hoćeš da pojednostaviš upite. Kao što vidiš u mom primeru, pojednostavio sam select upit preko PDO. Isto tako možeš dodati metodu za update ili insert..

Što se tiče singletona, po meni je nepotrebno da se koristi. Ako ga koristiš, onda ne možeš napraviti konekciju u isto vreme na primer na drugu bazu. Ili neko drugi ko koristi tvoj kod.
 
Odgovor na temu

WoosTy

Član broj: 319486
Poruke: 3
*.tippnet.co.rs.



Profil

icon Re: PDO i OOP konekcija sa bazom?01.12.2013. u 12:48 - pre 125 meseci
Hvala, donekle sam svatio.
Inace kako ti radis ovo, tj kako se najcesce povezujes sa bazom preko PDO?

I sta mislis o ovom nacinu pobezivanja baze?
Code:
<?php

defined("DB_HOST") ? NULL : define("DB_HOST", "localhost");
defined("DB_USER") ? NULL : define("DB_USER", "root");
defined("DB_PASS") ? NULL : define("DB_PASS", "");
defined("DB_NAME") ? NULL : define("DB_NAME", "website");

try{
    $db = new PDO("mysql:host=localhost;dbname=website;","root","");
    $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    echo 'Connection<br>';
} catch(PDOException $ex){
    die($ex->getMessage());
}


class users{
    
    public $db;
    
    public function __construct($value){
        $this->db = $value;
    }
    
}

$newUser = new users($db);

?>

Znaci preko PDO se konektujemo i kada pozivamo neku klasu kroz konstruktor pozovemo konekciju...
Posto sam jos donekle pocetnik u OOP zanima me iskusnije misljenje sta je efikasnije i "pravilnije"...
 
Odgovor na temu

plus_minus

Član broj: 289459
Poruke: 2242
*.dynamic.isp.telekom.rs.

Sajt: https://hardcoder.xyz


+2247 Profil

icon Re: PDO i OOP konekcija sa bazom?01.12.2013. u 13:14 - pre 125 meseci
Ukoliko si donekle, kako već stoji u tekstu, shvatio i ako već krećeš sa oop, onda za početak skokni ovde,
poigraj se .. http://php.net/manual/en/language.oop5.constants.php to je navodno pravilnije za oop.

Code (php):


# standard, procedural php
define('lowerUPPERcase', microtime());

# php oop
const lowerUPPERcase = microtime();

 


ili uradi početak malo elegantnije, a i ne moraš.

Code (php):


foreach (
 array (
  "DB_HOST"=>'localhost',
  "DB_USER"=>'root',
  "DB_PASS"=>'',
  "DB_NAME"=>'website',
) as $const => $value){
 defined("$const") ? NULL :
 define("$const", "$value");
}

 

about:networking
 
Odgovor na temu

WoosTy

Član broj: 319486
Poruke: 3
*.tippnet.co.rs.



Profil

icon Re: PDO i OOP konekcija sa bazom?01.12.2013. u 15:26 - pre 125 meseci
Hvala svima na pomoci, ako jos neko ima nesto da doda slobodno, svaki savet je dobrodosao ;)
 
Odgovor na temu

Nikola Poša
Backend (PHP) developer
Beograd

Član broj: 173839
Poruke: 1616
109.121.0.*



+33 Profil

icon Re: PDO i OOP konekcija sa bazom?01.12.2013. u 19:15 - pre 125 meseci
Ja sam odavno digao ruke od pisanja nekog svog DBAL-a i te neke apstrakcije za komunikaciju sa bazom, kada postoje tako dobra i robustna rešenja kao što su Doctrine DBAL, Zend\Db, Laravel DB, itd.
 
Odgovor na temu

agvozden
Aleksandar Gvozden
founder
Info-G
Beograd

Član broj: 37813
Poruke: 1122
*.dynamic.sbb.rs.

Sajt: www.gvozden.info


+68 Profil

icon Re: PDO i OOP konekcija sa bazom?02.12.2013. u 08:23 - pre 125 meseci
nije toliko bitno koju ces db platformu i interfejs izabrati koliko je bitno da se toga pridrzavas u kodu.

Jer, ukoliko ti db apstrakt sluzi samo za uspostavljanje konekcije, onda to nije dobar pristup.
Dobro je sve upite provuci kroz takve klase (ne mislim na izvrsi $sql), mozda cak i koristiti kveri-bilder.
Na taj nacin bi klasa morala da se pobrine i osigurnostnim aspektima i prevenciji.

 
Odgovor na temu

verodostojan

Član broj: 252511
Poruke: 110
*.dynamic.isp.telekom.rs.



+9 Profil

icon Re: PDO i OOP konekcija sa bazom?16.12.2013. u 21:38 - pre 125 meseci
Citat:
WoosTy: Hvala svima na pomoci, ako jos neko ima nesto da doda slobodno, svaki savet je dobrodosao ;)


Primera je mnogo. Evo i jednog veoma apstraktnog, a ujedno i fleksibilnog...

Code:
<?php

class DataBase
{
    //Atributi klase
    private static $_instance = null;
            private $_pdo, 
            $_query,
            $_error = false,
            $_result,
            $_count = 0; 
    
    private function __construct(){
    try {
        $this->_pdo = new PDO('mysql:host=' . Config::get('mysql/host') . ';dbname=' . Config::get('mysql/db'), 
                              Config::get('mysql/username'), Config::get('mysql/password'));
    } catch(PDOException $e){
        die($e->getMessage());
    }
}
    
        public static function getInstance() //Uspostaviti konekciju sa bazom
        {
            if (!isset(self::$_instance)) 
            {
                self::$_instance = new DataBase();
            }
            
            return self::$_instance;
        }
        
        public function query ($sql, $params = array())
        {
            $this->_error = FALSE;
            if ($this->_query = $this->_pdo->prepare($sql))//Priprema statement za izvrsenje
            {
                $x = 1;
                if (count($params))
                {
                    // Primer SQL injection
                     foreach ($params as $param) {
                        $this->_query->bindValue($x, $param);
                        $x++;
                    
                    }
                }
                  if ($this->_query->execute())//Izvrsava se pripremljeni statement
            {
                      $this->_result = $this->_query->fetchAll(PDO::FETCH_OBJ);
                      $this->_count = $this->_query->rowCount();
            }
 else {
                $this->_error = TRUE;
 }
            }
            return $this;
        }


Ovo je naravno deo klase, ali ujedno i osnova za dalje kreiranje metoda za CRUD.
 
Odgovor na temu

[es] :: PHP :: PDO i OOP konekcija sa bazom?

[ Pregleda: 2898 | Odgovora: 7 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.