xp-framework / rdbms
XP Framework 的 RDBMS 支持
Requires
- php: >=7.0.0
- xp-framework/core: ^12.0 | ^11.0 | ^10.0 | ^9.0 | ^8.0 | ^7.0
- xp-framework/logging: ^11.0 | ^10.0 | ^9.0 | ^8.0 | ^7.0
- xp-framework/math: ^9.0 | ^8.0 | ^7.0
- xp-framework/networking: ^10.0 | ^9.0 | ^8.0 | ^7.0
Requires (Dev)
- xp-framework/test: ^2.0 | ^1.0
- dev-master
- v13.3.0
- v13.2.0
- v13.1.0
- v13.0.3
- v13.0.2
- v13.0.1
- v13.0.0
- v12.0.3
- v12.0.2
- v12.0.1
- v12.0.0
- v11.0.0
- v10.2.0
- v10.1.0
- v10.0.2
- v10.0.1
- v10.0.0
- v9.0.8
- v9.0.7
- v9.0.6
- v9.0.5
- v9.0.4
- v9.0.3
- v9.0.2
- v9.0.1
- v9.0.0
- v8.0.4
- v8.0.3
- v8.0.2
- v8.0.1
- 8.0.0.x-dev
- v8.0.0
- v7.3.5
- v7.3.4
- 7.3.3
- v7.3.2
- v7.3.1
- v7.3.0
- v7.2.2
- v7.2.1
- v7.2.0
- v7.1.0
- v7.0.1
- 7.0.0.x-dev
- v7.0.0
- v6.7.1
- v6.7.0
- v6.6.0
- v6.5.5
- v6.5.4
- v6.5.3
- v6.5.2
- v6.5.1
- v6.5.0
- v6.4.4
- v6.4.3
- v6.4.2
- v6.4.1
- v6.4.0
- v6.3.2
- v6.3.1
- v6.3.0
- v6.2.2
- v6.2.1
- v6.2.0
- v6.1.1
- v6.1.0
- v6.0.0
- dev-ten
This package is auto-updated.
Last update: 2024-08-24 14:23:52 UTC
README
RDBMS 访问 API、连接管理器、反向工程、O/R 映射。
DriverManager 模型
要从驱动管理器获取连接类,您需要使用 rdbms.DriverManager 类。
use rdbms\DriverManager; $conn= DriverManager::getConnection('sybase://user:pass@server/NICOTINE');
DriverManager 类期望一个统一的连接字符串(我们称其为 DSN)。
支持的驱动
DriverManager 将根据 DSN 字符串中的名称选择适当的驱动。这将加载一个实现类,该类可能基于 PHP 扩展或实现与数据库系统在用户代码中通信的协议。在后一种情况下,您不需要对 PHP 设置进行任何操作;如果存在对 PHP 扩展的硬依赖,您必须在能够使用驱动之前安装它。
基础知识
一旦我们获取了特定的数据库连接类,我们现在可以调用它的一系列方法。
选择
选择可以通过“一站式”方法 select()
完成,该方法将所有结果返回到数组中。或者,query()
方法允许迭代获取。
$news= $conn->select('news_id, caption, author_id from news'); // $news= [ // [ // 'news_id' => 12, // 'caption' => 'Hello World', // 'author_id' => 1549 // ] // ] $q= $conn->query('select news_id, caption, author_id from news'); while ($record= $q->next()) { // $record= [ // 'news_id' => 12, // 'caption' => 'Hello World', // 'author_id' => 1549 // ] }
插入
要将参数“绑定”到 SQL 查询中,查询、选择、更新、删除和插入方法提供 printf 样式的标记和解码器,并支持可变参数语法。这些为您处理 NULL、类型处理和适当的转义。
$conn->insert(' into news ( caption, author_id, body, extended, created_at ) values ( %s, -- caption %d, -- author_id %s, -- body %s, -- extended %s -- created_at )', $caption, $authorId, $body, $extended, Date::now() );
更新
如果感兴趣,update()
和 delete()
方法将返回受影响行数。
$conn->update('news set author_id= %d where author_id is null', $authorId);
删除
即使您的 RDBMS 要求您使用单引号(或其它),API 也会为您处理字符串字面量的重写。
$conn->delete('from news where caption = "[DELETE]"');
异常
上述所有方法都会在失败的 SQL 查询、语法错误、连接失败等情况下抛出异常。所有这些异常都是 rdbms.SQLException
的子类,因此要捕获所有可能的错误,请在捕获子句中使用它。
+ rdbms.SQLException
|-- rdbms.ConnectionNotRegisteredException
|-- rdbms.SQLConnectException
|-- rdbms.SQLStateException
`-- rdbms.SQLStatementFailedException
|-- rdbms.SQLConnectionClosedException
`-- rdbms.SQLDeadlockException
事务
要开始事务,您可以使用连接的 begin()
、commit()
和 rollback()
方法,如下所示
public function createAuthor(...) { $tran= $conn->begin(new Transaction('create_author')); try { $id= $conn->insert('into author ...'); $conn->insert('into notify ...'); $tran->commit(); return $id; } catch (SQLException $e) { $tran->rollback(); throw $e; } }
注意:并非所有数据库系统都支持事务,并且支持事务的那些系统中,并非所有都支持嵌套事务。请务必阅读您访问的 RDBMS 的手册页面。