Класс-обёртка для PHP/PDO
В подведении итогов знакомства с PDO реализуем класс-обёртку над PHP для удобной работы с этим самым PDO ☺ Данный класс значительно упрощает работу с PDO, сокращает код. Реализован на статических методах и не требует создание экземпляра класса.
PHP: PDO быстрый старт, работа с MySQL
PHP: Режимы получения данных в PDO, константы PDO::FETCH_*
Класс
<?php /** * Class wrapper for working with PDO */ class DB { /** * Настройки подключения * Лучше выносить в конфиг * self::DB_HOST -> Config::DB_HOST */ const DB_HOST = '127.0.0.1'; // localhost const DB_USER = 'root'; const DB_PASSWORD = ''; const DB_NAME = 'pdo'; const CHARSET = 'utf8'; const DB_PREFIX = ''; /** * @var PDO */ static private $db; /** * @var null */ protected static $instance = null; /** * DB constructor. * @throws Exception */ public function __construct(){ if (self::$instance === null){ try { self::$db = new PDO( 'mysql:host='.self::DB_HOST.';dbname='.self::DB_NAME, self::DB_USER, self::DB_PASSWORD, $options = [ PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES ".self::CHARSET ] ); } catch (PDOException $e) { throw new Exception ($e->getMessage()); } } return self::$instance; } /** * @param $stmt * @return PDOStatement */ public static function query($stmt) { return self::$db->query($stmt); } /** * @param $stmt * @return PDOStatement */ public static function prepare($stmt) { return self::$db->prepare($stmt); } /** * @param $query * @return int */ static public function exec($query) { return self::$db->exec($query); } /** * @return string */ static public function lastInsertId() { return self::$db->lastInsertId(); } /** * @param $query * @param array $args * @return PDOStatement * @throws Exception */ public static function run($query, $args = []) { try{ if (!$args) { return self::query($query); } $stmt = self::prepare($query); $stmt->execute($args); return $stmt; } catch (PDOException $e) { throw new Exception($e->getMessage()); } } /** * @param $query * @param array $args * @return mixed */ public static function getRow($query, $args = []) { return self::run($query, $args)->fetch(); } /** * @param $query * @param array $args * @return array */ public static function getRows($query, $args = []) { return self::run($query, $args)->fetchAll(); } /** * @param $query * @param array $args * @return mixed */ public static function getValue($query, $args = []) { $result = self::getRow($query, $args); if (!empty($result)) { $result = array_shift($result); } return $result; } /** * @param $query * @param array $args * @return array */ public static function getColumn($query, $args = []) { return self::run($query, $args)->fetchAll(PDO::FETCH_COLUMN); } public static function sql($query, $args = []) { self::run($query, $args); } }
Методы класса
Использование класса:
DB::query()
выполнить один запрос к БД с возвращением результата PDOStatement
. его следует использовать только в том случае, если запрос не содержит необработанные данные, например из внешних источников.
DB::getRow()
вернёт из БД одну запись (одна, категория, один пост и тп).
DB::getRows()
вернёт из БД все записи (или несколько по условию).
DB::getValue()
вернёт из БД одно значение (название категории).
DB::getColumn()
вернёт из БД значения одной колонки (все названия категорий).
DB::sql()
произвольный запрос.
Примеры использования
Выбрать одну категорию по id
:
$data = $db::getRow("SELECT * FROM `category` WHERE `id` = ?", [$id]);
Выбрать имена всех категорий у которых parent_id
больше $parent_id
:
$data = $db::getRows("SELECT `title` FROM `category` WHERE `parent_id` > ?", [$parent_id]); foreach ($data as $item) { echo $item['title'].'<br>'; }
Выбрать имя категории по id
:
$data = $db::getValue("SELECT `title` FROM `category` WHERE `id` > ?", [$id]);
Выбрать имена всех категорий:
$data = $db::getColumn("SELECT `title` FROM `category`"); foreach ($data as $item) { echo $item.'<br>'; }
Вставить запись в БД:
$query = "INSERT INTO `category` ( `title`, `alias`, `parent_id`, `keywords`, `description` ) VALUES ( :title, :alias, :parent_id, :keywords, :description )"; $args = [ 'title' => $title, 'alias' => $alias, 'parent_id' => intval($parent_id), 'keywords' => $keywords, 'description' => $description ]; $db::sql($query, $args)
Обновить запись в БД:
$query = "UPDATE `category` SET `title` = :title WHERE `id` = :id"; $args = [ 'id' => $id, 'title' => $title ]; $db::sql($query, $args)
Удалить запись:
$db::sql("DELETE FROM `category` WHERE `id` = ?", [$id]);
PDOx - быстрый, эффективный и полезный конструктор запросов и класс PDO для PHP.