andrey-tech / database-php
简单的可扩展PHP7+和PDO类库,用于与数据库(MySQL、SQLite等)交互,并支持准备语句缓存。
2.0.0
2020-08-04 09:37 UTC
Requires
- php: >=7.0
- ext-pdo: *
This package is auto-updated.
Last update: 2024-09-04 18:38:48 UTC
README
简单的可扩展PHP7+和PDO类库,用于与数据库(MySQL、SQLite等)交互,并支持准备语句缓存。
内容
要求
- PHP >= 7.0。
- 遵循PSR-4标准的任意自动加载器类。
安装
通过composer安装
$ composer require andrey-tech/database-php:"^2.0"
或在composer.json文件的require部分添加
"andrey-tech/database-php": "^2.0"
。
类 Database
类 \App\Database\Database
是用于操作数据库的抽象基类。
在 \App\Database
命名空间中的类发生错误时,会抛出包含 \App\Database\DatabaseException
对象的异常。
类 \App\Database\Database
包含以下公共方法
static instance(array $config = [], array $options = []) :Database
返回类的唯一对象。$config
- 数据库连接配置;$options
- 数据库驱动程序连接选项。
connect() :void
执行数据库服务器的连接。通常不需要,因为数据库服务器的连接会在第一次请求时自动执行。disconnect() :void
执行数据库服务器的断开连接。通常不需要,因为数据库服务器的断开连接会在对象类销毁时自动执行。- doStatement($statement, array $values = [], bool $isNamed = true, array $prepareOptions = []): \PDOStatement
准备查询,缓存准备好的查询并执行准备好的查询。
返回 \PDOStatement 类的对象。$statement
- SQL 操作符;$values
- SQL 操作符的值数组;$isNamed
- SQL 操作符中命名参数(:name)的标志;$prepareOptions
- 准备查询的数据库驱动程序选项。
beginTransaction()
初始化事务。commitTransaction()
提交事务。rollbackTransaction()
回滚事务。fetchAll(\PDOStatement $stmt): \Generator
允许使用生成器选择所有记录。$stmt
- \PDOStatement 类的对象。
getLastInsertId(string $idName = null) :string
返回最后一个插入记录的 "id" 值。$idName
- "id" 列的名称。
createInStatement(array $in = []): string
返回 IN (?, ?, ?,...) 表达式的字符串。$in
- IN(?, ?, ?,... )表达式内的值数组。
getPdo() :\PDO
返回 \PDO 类的对象。
通过对象类的公共属性访问额外的参数
类 MySQLDatabase
类 \App\Database\MySQLDatabase
扩展了类 \App\Database\Database
并用于与 MySQL 数据库交互。
默认配置和连接选项如下
$config = [ 'driver' => 'mysql', // Имя драйвера PDO 'host' => 'localhost', // Имя или IP хоста 'port' => 3306, // Порт 'database' => 'db', // Имя БД 'charset' => 'utf8mb4', // Кодировка 'user' => '', // Имя пользователя 'password' => '' // Пароль пользователя ]; $options = [ PDO::ATTR_TIMEOUT => 60, PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC ];
示例
直接使用 MySQLDatabase
类的示例
use App\Database\{MySQLDatabase, DatabaseException}; try { $config = [ 'host' => 'localhost', 'user' => 'test', 'password' => 'pass', 'database' => 'mydb' ]; $db = MySQLDatabase::instance($config); // Включаем отладочный режим с выводом в STDOUT $db->debug = true; // Запрос к таблице contacts без параметров $stmt = $db->doStatement(" SELECT COUNT(*) AS `count` FROM `contacts` "); print_r($stmt->fetchAll()); // Запрос к таблице contacts с использованием именованных параметров $stmt = $db->doStatement(" SELECT * FROM `contacts` WHERE `status` = :status LIMIT 10 ", [ 'status' => 1 ]); print_r($stmt->fetchAll()); // Запрос к таблице contacts с использованием НЕ именованных параметров $stmt = $db->doStatement(" SELECT * FROM `contacts` WHERE `status` = ? ", [ 1 ], $isNamed = false); // Выбираем все записи с помощью генератора $generator = $db->fetchAll($stmt); foreach ($generator as $row) { print_r($row); } } catch (DatabaseException $e) { printf('Ошибка (%d): %s' . PHP_EOL, $e->getCode(), $e->getMessage()); }
将调试信息输出到 STDOUT 的示例
***** CONNECT localhost
***** [1] SELECT COUNT(*) AS `count` FROM `contacts`
***** [2] SELECT * FROM `contacts` WHERE `status` = 1 LIMIT 10
***** [3] SELECT * FROM `contacts` WHERE `status` = 1
***** DISCONNECT localhost
创建子类的示例
use App\Database\{MySQLDatabase, DatabaseException}; class MyDatabase extends MySQLDatabase { /** * Выполняет соединение с CУБД * @return void */ public function connect() { parent::connect(); $this->tune(); } /** * Выполняет дополнительную настройку после соединения с СУБД * @return void */ public function tune() { // Устанавливаем таймаут неактивности соединения с СУБД $this->doStatement("SET SESSION wait_timeout = {$this->config['wait_timeout']}"); // Устанавливаем уровень изолированности транзакций $this->doStatement('SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED'); } /** * Извлекает клиентов с заданным статусом * @param int $status ID статуса * @return Generator */ public function selectContactsByStatus(int $status) :Generator { $stmt = $this->doStatement(" SELECT * FROM `contacts` WHERE `status` = :status FOR UPDATE ", [ 'status' => $status ]); return $this->fetchAll($stmt); } } try { $config = [ 'host' => 'localhost', 'user' => 'test', 'password' => 'pass', 'database' => 'mydb' ]; $db = MyDatabase::instance($config); // Включаем отладочный режим с выводом в STDOUT $db->debug = true; // Выбираем все записи с помощью генератора $generator = $db->selectContactsByStatus($status = 1); foreach ($generator as $row) { print_r($row); } } catch (DatabaseException $e) { printf('Ошибка (%d): %s' . PHP_EOL, $e->getCode(), $e->getMessage()); }
类 SQLiteDatabase
类 \App\Database\SQLiteDatabase
扩展了类 \App\Database\Database
并用于与 SQLite 数据库交互。
默认配置和连接选项如下
$config = [ 'driver' => 'sqlite', // Имя драйвера PDO 'database' => 'database.sqlite' // Имя файла SQLite ]; $options = [ PDO::ATTR_TIMEOUT => 60, PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC ];
示例
直接使用 SQLiteDatabase
类的示例
use App\Database\{SQLiteDatabase, DatabaseException}; try { $config = [ 'database' => 'db.sqlite', ]; $db = SQLiteDatabase::instance($config); // Включаем отладочный режим с выводом в STDOUT $db->debug = true; // Запрос к таблице contacts без параметров $stmt = $db->doStatement(" SELECT COUNT(*) AS `count` FROM `contacts` "); print_r($stmt->fetchAll()); } catch (DatabaseException $e) { printf('Ошибка (%d): %s' . PHP_EOL, $e->getCode(), $e->getMessage()); }
作者
© 2019-2020 andrey-tech
许可证
本库遵循MIT许可证。