class DB
{
protected $db;
public function __construct(){
//require_once 'config_db.php';
try{
$this->db = new PDO('mysql:host=localhost;dbname=test','root','');
}catch(PDOException $e){
die('DB ERROR');
}
}
private function query($query, array $params = array()){
$stmt = $this->db->prepare($query);
if(!empty($params)){
foreach($params as $k => $v){
if(is_int($v)){
$stmt->bindValue(':'.$k, $v, PDO::PARAM_INT);
}else{
$stmt->bindValue(':'.$k, $v, PDO::PARAM_STR);
}
}
}
$stmt->execute();
return $stmt;
}
public function getRows($query, array $params = array()){
return $this->query($query, $params)->fetchAll(PDO::FETCH_ASSOC);
}
public function getColumn($query, array $params = array()){
return $this->query($query, $params)->fetchColumn();
}
public function lastInsertId(){
return $this->db->lastInsertId();
}
}
class Car
{
protected $db;
public function __construct(DB $db){
$this->db = $db;
}
public function getAll(){
$query = "SELECT `id`, `name` FROM `cars`";
return $this->db->getRows($query);
}
public function getById(int $id){
$query = "SELECT `id`, `name` FROM `cars` WHERE `id` = :id";
return $this->db->getRows($query, array('id' => $id));
}
}
$db = new DB();
$car = new Car($db);
var_dump($car->getAll());
var_dump($car->getById(1));
die('DB ERROR');
никакой работы с БД не должно быть в модели
Ухожу с синглтона
private function query($query, array $params = array()){
$stmt = $this->db->prepare($query);
$stmt->execute($params);
return $stmt;
}
public function getRows($query, array $params = array(), $mode= PDO::FETCH_ASSOC){
return $this->query($query, $params)->fetchAll($mode);
}
- либо добавить методы для всех методов PDO, либо сделать $db публичной. потому что когда тебе нужно будет выполнить десяток инсертов обернутых в транзакцию, эта обертка превратится в тыкву. всё началось с фразы "никакой работы с БД не должно быть в модели".это правильно и это ты правильно понял, абстрагировав слой БД от слоя модели. Советую почитать книгу Фаулера "Архитектуру корп. пр. приложений" и особенно главу "Источники данных". Без этой концепции ты дальше своей подделки не уедешь в знаниях.
class Sql {
public function query() {
....
return new SqlResult($stmt);
}
}
class SqlResult {
public function __constructor($stmt) {
$this->stmt = $stmt;
}
public function getCollumns() {
return $this->stmt->fetchColumn();
}
public function getRows() {
return $this->stmt->fetchAll(PDO::FETCH_ASSOC);
}
}