gajus/doll

扩展PDO,支持内联类型提示、延迟连接支持、日志和基准测试。

1.2.0 2015-03-07 16:06 UTC

This package is not auto-updated.

Last update: 2024-09-10 01:02:31 UTC


README

Build Status Coverage Status Latest Stable Version License

扩展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);

连接将延迟到以下任一方法被调用时

默认属性

不在表中的属性的值没有区别。

方法链

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个查询的限制。"。