charm/database

此软件包已被废弃,不再维护。作者建议使用 charm/db 软件包。

又一个 PDO 封装器。因为我不喜欢每次都显式地准备、执行和获取每个查询。可以使用您提供的 PDO 实例,或者创建一个新的独立连接。

0.0.1 2021-03-27 16:24 UTC

This package is auto-updated.

Last update: 2021-03-27 16:37:17 UTC


README

Charm\DB 是围绕 PDO 的一个非常薄的封装器。它存在的原因仅仅是因为我讨厌多次编写大量的代码。

它与使用 PDO 的框架配合良好,如 Doctrine 或 Symfony,这对于您编写库且不希望库依赖于 Doctrine 来说是很棒的。

我已多次为不同的项目编写此类封装器。因此,我最终决定编写一些文档并将其放在 Packagist 上 - 主要是为了让自己更容易安装。:-D

懒惰读者的示例

  • Charm\DB 查询

     $rows = $db->query('SELECT * FROM users WHERE id = ?', [ 123 ] );
    
  • PDO 查询

     $stmt = $db->prepare('SELECT * FROM users WHERE id = ?', [ 123 ] );
     $stmt->execute([123]);
     $rows = $stmt->fetchAll(PDO::FETCH_CLASS);
    
  • Charm\DB 执行

     $affectedRows = $db->exec('DELETE FROM trash WHERE age < ?', [ gmdate('Y-m-d H:i:s') ]);
    
  • PDO 执行

     $stmt = $db->prepare('DELETE FROM trash WHERE age < ?');
     $stmt->execute([ gmdate('Y-m-d H:i:s') ]);
     $affectedRows = $stmt->rowCount();
    
  • PDO 对于懒惰的人来说,容易犯错误,这可能导致巨大的安全问题

     $affectedRows = $db->exec('DELETE FROM trash WHERE age < '.$db->quote(gmdate('Y-m-d H:i:s')));
    
  • 没有特殊方法来获取单行,只需使用 ->current()

     $row = $db->query('SELECT * FROM users WHERE id = ?', [123])->current();
    
  • 没有特殊方法来获取单列,只需提供列号。

     $usernames = $db->query('SELECT username FROM users', [], 0);
    
  • 获取单个字段,只需使用 ->current()

     $value = $db->query('SELECT username FROM users WHERE id = ? LIMIT 1', [123], 0)->current();
    

有时您可能需要 PDO API 提供的额外功能。有两个方法相关

  • $db->prepare( string $statement, array $driver_options = array() )PDO::prepare() 方法的工作方式完全相同,但具有语句缓存。

  • $db->pdo(): ?PDO 返回原始的 PDO 实例。

使用方法

连接到数据库(使用 PDO DSN 字符串)。

$db = Charm\DB::__construct ( string $dsn, string $username = ?, string $passwd = ?, array $options = ? )

或包装现有的 PDO 实例

$db = Charm\DB::wrap ( PDO $pdoInstance ) : Charm\DB;

使用内置工厂

在 PHP 世界中,人们似乎有成千上万种方法想要使其“容易”配置框架应用程序。我们必须学习如何将配置注入到将被注入到另一个工具的配置中。但只有当你配置了自动注入时,它才会被注入。

当你在构建你认为将成为 Facebook 和“Johnny Inc.”的创始人 Johnny 所喜爱的框架时,这是可以理解的。我更喜欢在(如果)我成长到最初架构之外时重构我的代码。

我们这些开发者一直在设计最复杂的结构,以使配置变得容易。

但如果你没有时间做这件事,Charm* 组件通常允许你通过公共静态属性来配置它们,然后你可以通过它们的 ::instance() 静态方法检索实例。

Charm\DB::instance() 可以通过以下方式配置

    // Either put in some configuration:

    Charm\DB::$dsn          = $dsn;
    Charm\DB::$username     = ?;
    Charm\DB::$passwd       = ?;
    Charm\DB::$options      = ?;

    // Or provide an instance directly

    Charm\DB::$instance     = $pdoInstance;

现在,您可以通过 Charm\DB::instance() 在整个项目中访问数据库。

如果您不这样做,请继续设置 Symfony 或设计自己的方法来构建它。

`Charm\DB::query (

更多示例,基本上是与 TLDR 标题下的示例相同。

查询数据

数据库查询是通过 $db->query()$db->column() 进行的。

// Multiple rows returns an iterable
$users = $db->query('SELECTFROM users WHERE last_login < ?', [gmdate('Y-m-d H:i:s')]);

// Single rows can be fetched this way (sending 'LIMIT 1' is kind to your database engine)
$user = $db->query('SELECTFROM users WHERE username = ? LIMIT 1', [ $username ])->current();

// Fetch a single column
$usernames = $db->column('SELECT username FROM users);

// Fetcha single value
$numberOfUsers = $db->column('SELECT COUNT(*) FROM users')->current();

定义、操作、控制

所有对数据库的修改都是通过 $db->exec() 函数完成的。

// Insert a row into a table
if ($db->exec('INSERT INTO users (username, password ) VALUES (?, ?)', [ $username, $password ])) {
    echo "Created a new user with id ".$db->lastInsertId()."!\n";
}

// Delete some data
if ($count = $db->exec('DELETE FROM users WHERE expires_date < ?', [ gmdate('Y-m-d H:i:s') ])) {
    echo "Deleted $count users\n";
}

错误处理

封装器默认为 PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,因此您将收到标准的 PDO 异常。

不正确使用此包装器将触发带有类常量错误代码的 Charm\DB\Error 异常。如果您未使用 PDO::ERRMODE_EXCEPTION,我们只会抛出 Charm\DB\Error 异常。

最后错误触发时发出的查询可在 $db->lastFailedQuery 中找到。

安全性

此类对安全性没有任何作用,但它使您更容易进行更安全的数据库查询。

此类重写了 __debugInfo() 魔术方法,以避免意外泄露秘密,但在一般情况下,您绝对不应该在生产环境中显示原始错误消息。