vertilia / pdo-wrap
PDO 包装库,用于简化基本的数据库操作
Requires
- php: >=8
- ext-pdo: *
Requires (Dev)
README
PDO (PHP 数据对象) 是 PHP 应用程序与数据库交互的标准接口。尽管它为大量提供者提供了完整的数据库相关功能,但某些基本操作似乎缺乏简洁性。
此包为从 PHP 代码中与基于 PDO 的数据库连接工作添加了一些形式上的简洁和优雅。
它具有以下功能:
- 具有标准占位符形式的类型占位符,大多数 IDE 可以识别,
- 透明的类型参数绑定,允许简单的链式操作。
示例
使用 PDO 获取具有入参数的记录集的快速示例
<?php use PDO; $pdo = new PDO('sqlite::memory:'); $sth = $pdo->prepare("SELECT name, join_date, acl FROM users WHERE acl IN(:a1,:a2)"); $sth->bindValue(':a1', 9, PDO::PARAM_INT); $sth->bindValue(':a2', 10, PDO::PARAM_INT); $sth->execute(); $result = $sth->fetchAll();
是的,没有标准 PDO 方法可以在指定列表时自动展开数组...
比较与 PdoWrap
相同的操作
<?php use PDO; use Vertilia\PdoWrap\PdoWrap; $pdo_wrap = new PdoWrap('sqlite::memory:'); $result = $pdo_wrap->queryFetchAll( "SELECT name, join_date, acl FROM users WHERE acl IN(:acls)", [':acls[i]' => [9, 10]] );
一个示例中实现了
PdoWrap
的两个主要概念。首先,我们在参数列表中通过添加[i]
后缀提供了类型信息。其次,由于[i]
后缀表示对应的值必须表示为整数列表,因此:acls
命名参数被展开以包含数组中的多个元素。注意:
:acls
占位符采用标准的 PDO 命名参数形式,它将被 IDE 自动识别为此类。
下面是可用的完整类型列表。
类型参考
PdoWrap
扩展 PDO 类并添加了 3 个辅助方法,您将每天都会用到
queryFetchAll()
用于执行带有类型占位符的 SELECT 语句并返回整个记录集(与正常的序列PDO::prepare
/PDOStatement::bindValue
× n /PDOStatement::execute
/PDOStatement::fetchAll
相同),queryFetchOne()
用于执行带有类型占位符的 SELECT 语句并返回第一条记录(与正常的序列PDO::prepare
/PDOStatement::bindValue
× n /PDOStatement::execute
/PDOStatement::fetch
/PDOStatement::closeCursor
相同),queryExecute()
用于执行带有类型占位符的 DML 语句(与正常的序列PDO::prepare
/PDOStatement::bindValue
× n /PDOStatement::execute
/PDOStatement::rowCount
相同)。
所有这些方法都接受一个 SQL 语句作为其第一个参数,该语句具有问号占位符(如 ?
)或命名占位符(如 :name
)。第二个参数是一个数组,其中包含用于相应占位符的值。可能还有其他参数表示 PDO 获取模式,它们将被传递到相应的 PDOStatement::fetchAll()
或 PDOStatement::fetch()
方法。
对于问号占位符,无法提供类型,因此值存储在一个数字数组中,就像在标准 PDO 形式 PDO::prepare()->execute()
中一样。保留此形式是为了兼容性。
对于命名占位符,值通过关联数组传递,其中键对应于 SQL 语句中占位符的名称,但具有类型指示后缀,如 :acls[i]
。
类型指示符是附加到传递给相应 query*()
方法的参数列表中参数名称的后缀,并且可能采用两种形式之一,要么是尖括号(如 <TYPE>
),用于指定指定类型的 单个 值,要么是方括号(如 [TYPE]
),用于指定指定类型的 数组 值。
以下类型指示符可用
一些示例
<?php $db = new PdoWrap($db_dsn, $db_user, $db_pass, $db_options); $admins_rows = $db->queryFetchAll('SELECT * FROM users WHERE acl >= ?', [90]); $admins_list = $db->queryFetchAll( 'SELECT id, name FROM users WHERE acl >= :acl', [':acl<i>' => 90], PDO::FETCH_KEY_PAIR ); $admins_count = $db->queryFetchOne( 'SELECT COUNT(*) FROM users WHERE acl >= :acl', [':acl<i>' => 90], PDO::FETCH_COLUMN ); $admins_updated = $db->queryExecute( 'UPDATE users SET connected = :conn WHERE acl >= :acl', [ ':acl<i>' => 90, ':conn<b>' => false, ] );
请查看 /tests/
以获取更多示例。
更多功能即将推出,请保持关注 ;-)