gajus / doll
扩展PDO,支持内联类型提示、延迟连接支持、日志和基准测试。
Requires
- php: >=5.4
- ext-pdo: *
- psr/log: 1.0.0
Requires (Dev)
- satooshi/php-coveralls: dev-master
This package is not auto-updated.
Last update: 2024-09-10 01:02:31 UTC
README
扩展PDO,支持内联类型提示、延迟连接支持、日志和基准测试。
单参数构造函数
PDO::__construct 使用数据源名称 (DSN) 字符串来描述连接。PDO DSN实现不包括用户、密码和驱动程序选项。
使用DataSource
对象描述Doll实例
$data_source = new \Gajus\Doll\DataSource([ 'host' => '127.0.0.1', 'driver' => 'mysql', 'database' => null, 'user' => null, 'password' => null, 'charset' => 'utf8', 'driver_options' => [] ]);
延迟连接
PDO会在初始化时与数据库建立连接。如果应用程序在引导过程中初始化PDO,但不执行查询(例如,从缓存中提供的请求),则连接是不必要的。
Doll初始化时不会连接到数据库
$db = new \Gajus\Doll\PDO($data_source);
连接将延迟到以下任一方法被调用时
- PDO::prepare()
- PDO::exec()
- PDO::query()
- PDO::beginTransaction()
- PDO::commit()
- PDO::rollBack()
- PDOStatement::execute()
默认属性
不在表中的属性的值没有区别。
方法链
PDOStatement::execute() 返回一个布尔值,表示事务的状态,例如。
$sth = $db->prepare("SELECT ?"); // PDOStatement $sth->execute([1]); // boolean $input = $sth->fetch(PDO::FETCH_COLUMN);
然而,如果您正在使用PDO::ERRMODE_EXCEPTION 错误处理策略,则execute
的输出是多余的。
Doll强制使用PDO::ERRMODE_EXCEPTION
错误处理策略,而execute
方法返回一个\Gajus\Doll\PDOStatement
实例。这允许进一步的方法链,例如。
$input = $db ->prepare("SELECT ?") // Gajus\Doll\PDOStatement ->execute([1]) // Gajus\Doll\PDOStatement ->fetch(PDO::FETCH_COLUMN);
扩展类型提示
内联类型提示
PDOStatement::bindValue() 方法允许设置参数类型。然而,语法是冗长的。
$sth = $db->prepare("SELECT :foo, :bar, :baz"); $sth->bindValue('foo', 'foo', PDO::PARAM_STR); $sth->bindValue('bar', 1, PDO::PARAM_INT); $sth->bindValue('baz', $fp, PDO::PARAM_LOB); $sth->execute();
Doll允许内联类型提示
$sth = $db->prepare("SELECT s:foo, i:bar, l:baz"); $sth->execute(['foo' => 'foo', 'bar' => 1, 'baz' => $fp]);
Doll实现支持所有参数类型
推断类型提示
当参数名为"id"或以"_id"结尾时,除非显式设置参数类型,否则Doll将使用PDO::PARAM_INT
,例如。
$db->prepare("SELECT :id, :foo_id");
相当于
$db->prepare("SELECT i:id, i:foo_id");
您可以显式设置参数类型
$db->prepare("SELECT s:id, s:foo_id");
您可以禁用推断类型提示
$db->setAttribute(\Gajus\Doll\PDO::ATTR_INFERRED_TYPE_HINTING, false);
参数标记重用
使用Doll,您可以在预编译语句中重用命名参数标记,例如。
$db->prepare("SELECT :foo, :foo");
原生PDO实现不支持此功能。它将引发以下错误
PDOException: SQLSTATE[HY093]: Invalid parameter number
日志和基准测试
Doll支持查询和语句执行日志。要启用日志记录,您需要将\Gajus\Doll\PDO::ATTR_LOGGING
属性设置为true
。
$db->setAttribute(\Gajus\Doll\PDO::ATTR_LOGGING, true); $db ->prepare("SELECT :foo, SLEEP(.2)") ->execute(['foo' => 'a']); $log = $db->getLog(); var_dump($log);
日志输出包含有关每个查询的以下信息
array(1) { [0]=> array(7) { ["statement"]=> string(22) "SELECT :foo, SLEEP(.2)" ["parameters"]=> array(1) { ["foo"]=> string(1) "a" } ["execution_wall_time"]=> float(0.20117211341858) ["backtrace"]=> array(5) { ["file"]=> string(85) "/../doll/tests/LogTest.php" ["line"]=> int(28) ["function"]=> string(7) "execute" ["class"]=> string(23) "Gajus\Doll\PDOStatement" ["type"]=> string(2) "->" } ["execution_duration"]=> float(0.200723) ["execution_overhead"]=> float(0.00044911341857909) ["query"]=> string(19) "SELECT ?, SLEEP(.2)" } }
"execution_duration"和"query"是从SHOW PROFILES中检索的。"Doll会自动每100次执行运行诊断,以克服100个查询的限制。"。