Wrapper class in php

Класс-обёртка для PHP/PDO

В подведении итогов знакомства с PDO реализуем класс-обёртку над PHP для удобной работы с этим самым PDO ☺ Данный класс значительно упрощает работу с PDO, сокращает код. Реализован на статических методах и не требует создание экземпляра класса.

Класс

 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 . его следует использовать только в том случае, если запрос не содержит необработанные данные, например из внешних источников.

Читайте также:  Java image compression algorithm

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'].'
'; >

Выбрать имя категории по id :

$data = $db::getValue("SELECT `title` FROM `category` WHERE `id` > ?", [$id]);

Выбрать имена всех категорий:

$data = $db::getColumn("SELECT `title` FROM `category`"); foreach ($data as $item) < echo $item.'
'; >
$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.

Источник

PHP Database Wrapper Class

Many organizations use multi database software. For example an organisation’s HRD system using SQL Server and on its ERP they use DB2.

To develop an application that can connect to DB2 and SQL Server using PHP, we need database-independent connection object.

Here’s a database wrapper class sample code:

class DBType < const db2 = 0; const sqlserver = 1; >class db_connection < private $conn, $query_stmt; private $dbprod_var; function __construct($Database_var, $host, $dbname, $user, $passwd) < $this->dbprod_var = $Database_var; switch ($this->dbprod_var) < case DBType::db2: $this->conn = db2_connect($dbname,$user,$passwd); break; case DBType::sqlserver: $this->conn = mssql_connect($host,$user,$passwd); mssql_select_db($dbname, $this->conn); break; > > function loadrecords($sql) < if (strtoupper(substr(trim($sql), 0, 6))=="SELECT") < try < switch ($this->dbprod_var) < case DBType::db2: $this->query_stmt = db2_prepare($this->conn, $sql); $result = db2_execute($this->query_stmt); break; case DBType::sqlserver: $this->query_stmt = mssql_query($sql, $this->conn); $result =$this->query_stmt; break; > if ($result) < return new db_recordset($this->query_stmt,$this->dbprod_var); > else < return false; >> catch (Exception $ex) < die($sql."

".$ex->getMessage()); > > else < die($sql."

loadrecords error: No 'select' sql statement"); > > function execute($sql) < if (strtoupper(substr(trim($sql), 0, 6))<>"SELECT") < try < switch ($this->dbprod_var) < case DBType::db2: $this->query_stmt = db2_prepare($this->conn, $sql); $result = db2_execute($this->query_stmt); break; case DBType::sqlserver: $result = mssql_query($sql, $this->conn); break; > return $result; > catch (Exception $ex) < die($sql."

".$ex->getMessage()); > > else < die($sql."

execute error: Can not start sql statement with 'select'"); > > function Close() < switch ($this->dbprod_var) < case DBType::db2: db2_close($this->conn); break; case DBType::sqlserver: mssql_close($this->conn); break; > > > class db_recordset < private $query_stmt, $row; private $dbprod_var; function __construct($query_stmt, $dbprod_var) < $this->dbprod_var = $dbprod_var; $this->query_stmt = $query_stmt; > function ReadArray($bool_as_struct=false) < switch ($this->dbprod_var) < case DBType::db2: $this->row = db2_fetch_array($this->query_stmt); break; case DBType::sqlserver: $this->row = mssql_fetch_array($this->query_stmt, MSSQL_NUM); break; > if ($this->row) < if (!$bool_as_struct) < return $this->row; > else < return row_on_struct(); >> else < return false; >> function Close() < unset($this->row); > >

Explanation:
Class DBTypeis an enumeration constants that define DB2 and SQL Server.
Class db_connection connects, load records with ‘select’ query and executes add, edit, delete to database objects.
Class db_recordset reads recordset data.

PHP Example of DB2 Implementation:

//include the database wrapper class include_once "connect_db_wrap.php"; $sql = "select DEPTNO, DEPTNAME from DEPARTMENT"; //Open DB2 connection with related enumeration $dbconn = new db_connection(DBType::db2,"127.0.0.1", "SAMPLE", "user", "pwd"); $rs = $dbconn->loadrecords($sql); while ($row = $rs->ReadArray()) < echo $row[0]." ".$row[1]."-- "; >$rs->Close(); $dbconn->Close();

PHP Example of SQL Server Implementation:

//include the database wrapper class include_once "connect_db_wrap.php"; $sql = "select tester, division from Testers"; //Open DB2 connection with related enumeration $dbconn = new db_connection(DBType::sqlserver, "127.0.0.1", "TestDB", "sa", ""); $rs = $dbconn->loadrecords($sql); while ($row = $rs->ReadArray()) < echo $row[0]." ".$row[1]."-- "; >$rs->Close(); $dbconn->execute("insert into Testers (tester, division) values ('Rin tintin', 'ERP report')"); $dbconn->Close();

Both of implementation php file has same structure and codes, except that on db_connection’s constructor. It choose between DB2 or SQL Server.

Источник

Оцените статью