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.