charm / database
又一个 PDO 封装器。因为我不喜欢每次都显式地准备、执行和获取每个查询。可以使用您提供的 PDO 实例,或者创建一个新的独立连接。
Requires
- charm/error: ^0.0.1
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()
魔术方法,以避免意外泄露秘密,但在一般情况下,您绝对不应该在生产环境中显示原始错误消息。