phossa2 / db
PHP的数据库连接、管理和统计库。
This package is not auto-updated.
Last update: 2024-09-14 19:36:59 UTC
README
phossa2/db是一个PHP数据库连接管理库,用于处理与数据库的交互。
它需要PHP 5.4,支持PHP 7.0+和HHVM。它遵循PSR-1、PSR-2、PSR-3、PSR-4,以及提议的PSR-5。
特性
-
简单接口。没有你不需要的。
-
支持多个数据库平台/驱动,目前支持PDO(所有PDO驱动)和Mysqli。
-
通过驱动管理器处理多个连接
-
轮询负载均衡
使用轮询方式使用多个数据库连接,并支持权重因子(1-10)。每个连接都会被监控(ping)。
-
驱动标记,用户可以将不同的数据库连接标记为“读取器”或“写入器”等。
-
-
易于分析,获取每个执行的SQL及其执行时间。
-
安全。所有SQL都通过低级驱动程序中的prepare/execute执行。
安装
通过composer
工具安装。
composer require "phossa2/db"
或者将以下行添加到您的composer.json
{ "require": { "phossa2/db": "2.*" } }
用法
-
驱动
-
DDL
use Phossa2\Db\Driver\Pdo\Driver as Pdo_Driver; $db = new Pdo_Driver([ 'dsn' => 'mysql:dbname=test;host=127.0.0.1;charset=utf8' ]); // simple delete if ($db->query("DELETE FROM test WHERE id < 10")) { echo sprintf("%d records deleted", $db->affectedRows()) . \PHP_EOL; } else { echo $db->getError() . \PHP_EOL; } // with parameters if ($db->query("INSERT INTO test (val) VALUES (?)", [ 100 ])) { echo sprintf("last id is %d", $db->lastInsertId()) . \PHP_EOL; } else { echo $db->getError() . \PHP_EOL; }
-
SELECT
// simple select if ($db->query("SELECT * FROM test WHERE id < 10")) { $rows = $db->getResult()->fetchAll(); } else { echo $db->getError() . \PHP_EOL; } // fetch first 5 rows if ($db->query("SELECT * FROM test WHERE id > ? LIMIT ?", [10, 20])) { $rows = $db->getResult()->fetchRow(5); } // fetch first field if ($db->query("SELECT id, name FROM test WHERE id < :id", ['id' => 10])) { $cols = $db->getResult()->fetchCol('id'); }
-
-
语句
Statement
在执行$db->prepare()
后返回。// PREPARE using prepare() if ($db->prepare("SELECT * FROM test WHERE id < :id")) { $stmt = $db->getStatement(); if ($stmt->execute(['id' => 10])) { $rows = $stmt->getResult()->fetchAll(); } } else { echo $db->getError() . \PHP_EOL; }
-
结果
Result
通过$db->getResult()
或$stmt->getResult()
返回。if ($db->query('SELECT * FROM test')) { // SELECT if ($db->getResult()->isSelect()) { // get fields count $fieldCount = $db->getResult()->fieldCount(); // row count $rowCount = $db->getResult()->rowCount(); // DDL } else { $affectedRows = $db->getResult()->affectedRows(); } }
Mysqli
也支持Mysqli驱动。
use Phossa2\Db\Driver\Mysqli\Driver as Mysqli_Driver; $db = new Mysqli_Driver([ 'db' => 'mysql', 'host' => '127.0.0.1', 'charset' => 'utf8' ]); // simple delete if ($db->query("DELETE FROM test WHERE id < ?", [10])) { echo sprintf("%d records deleted", $db->affectedRows()) . \PHP_EOL; } else { echo $db->getError() . \PHP_EOL; }
注意:Mysqli驱动不支持命名参数。
驱动管理器
驱动管理器管理多个数据库连接。权重因子N
表示添加虚拟N次驱动。将具有因子5的驱动A和具有因子1的驱动B添加到池中,意味着在调用getDriver()
时,用户将获得5次A而不是一次B。
// dbwriter 1
$db1 = (new Phossa2\Db\Driver\Pdo\Driver($conf1))->addTag('RW');
// dbreader 2
$db2 = (new Phossa2\Db\Driver\Pdo\Driver($conf2))->addTag('RO');
// dbreader 3
$db3 = (new Phossa2\Db\Driver\Pdo\Driver($conf3))->addTag('RO');
// db manager
$dbm = (new Phossa2\Db\Manager\Manager())
->addDriver($db1, 1) // writable connection with factor 1
->addDriver($db2, 5) // read_only, factor 5
->addDriver($db3, 5) // read_only, factor 5
// get a db connect, no matter writer or reader
$db = $dbm->getDriver();
// get a readonly driver
$db = $dbm->getDriver('RO');
SQL分析
获取执行的SQL及其执行时间。
// init driver $db = new Phossa2\Db\Driver\Pdo\Driver($conf); // enable profiling $db->enableProfiling(); // execute a DELETE $db->query("DELETE FROM test WHERE test_id > 10"); // get sql $sql = $db->getProfiler()->getSql(); $time = $db->getProfiler()->getExecutionTime();
方法重载
在查询成功执行后,可以通过数据库驱动访问来自Phossa2\Db\Interfaces\ResultInterface
的方法。
if ($db->query('SELECT * FROM test')) { // normally is $db->getResult()->fetchAll() $rows = $db->fetchAll(); }
变更日志
请参阅CHANGELOG以获取更多信息。
测试
$ composer test
贡献
请参阅CONTRIBUTE以获取更多信息。
依赖
-
PHP >= 5.4.0
-
phossa2/shared >= 2.0.25