simbiat/database

数据库池和辅助类的类集。


README

这是一组3个类,用于方便与数据库工作,是PHP PDO的包装和糖。

  • Config:一个用于准备数据库连接配置的类。你可以将其视为常见的'config.php'文件的替代品,但它有几个潜在的有益功能
    • 强制有用安全驱动程序设置
    • 验证某些主机参数(如端口号)
    • 使用getDSN()函数方便地生成DSN
    • 密码保护,使从外部函数中欺骗密码变得更困难,除了适当的Pool类
  • Pool:一个静态代理类,可以池化数据库连接设置(\Simbiat\Database\Config对象)并在请求PDO连接时使用当前活动的连接。如果有需要,可以更改活动连接。
  • Controller:具有一些潜在有用功能的包装器
    • 你可以发送字符串(单个查询)和数组(查询集),两者都会被处理。在数组的情况下,它将自动开始事务并分别处理每个查询。如果数组中有任何SELECT类似的查询,你会收到通知,因为它们的输出可能无法正确处理。
    • 在死锁的情况下尝试重试。你可以使用适当的设置器设置重试次数和每次尝试前的睡眠时间。
    • 绑定糖
      • 你可以在发送字符串时发送适当的数据类型,如'boolean',而不是\PDO::PARAM_*或模糊的整数
      • 强制类型转换:已知PDO驱动程序有时不进行转换或以奇怪的方式转换。一些情况强制执行常规转换,以尝试解决此问题
      • 限制转换:在发送与LIMIT一起使用的绑定时,你需要记住将其转换为整数,但使用此控制器,只需将其标记为'limit'
      • 类似转换:在发送与LIKE一起使用的绑定时,你需要自己用%括起来,但使用此控制器,只需将其标记为'like'
      • 日期和时间转换:将绑定标记为'date''time',脚本将尝试检查它是否是日期时间值并将其转换为相应的字符串。或者甚至获取当前时间,如果你不想使用引擎自己的函数
    • 语义包装器:一组用于SELECT的函数,明确说明它们将返回什么(行、列、全部)
    • 智能结果返回:如果你发送单个查询,脚本将尝试识别它并执行fetch()fetchAll()rowCount(),并设置适当的结果。缺点是之后你需要使用getResult()

如何使用

请注意,我在我的项目中使用MySQL作为主要的DB引擎,因此我可能遗漏了其他引擎的一些特性。请告诉我这些特性,以便它们可以被整合。

首先,你需要创建一个\Config对象,并设置其参数如下

$config = (new \Simbiat\Database\Config)->setUser('user')->setPassword('password')->setDB('database');

上面的行是你需要的最小内容。此外,你可以设置驱动程序选项如下

$config->setOption(\PDO::MYSQL_ATTR_FOUND_ROWS, true)->setOption(\PDO::MYSQL_ATTR_INIT_COMMAND, 'SET @@global.character_set_client = \'utf8mb4\', @@global.character_set_connection = \'utf8mb4\', @@global.character_set_database = \'utf8mb4\', @@global.character_set_results = \'utf8mb4\', @@global.character_set_server = \'utf8mb4\', @@global.time_zone=\'+00:00\'');

在设置满意后(可以一行完成),你需要将其添加到池中

(new \Simbiat\Database\Pool)->openConnection($config, 'example');

传递ID不是必需的,但如果需要处理多个连接,这将使你的生活变得更轻松。

你也可以传递第三个参数(maxTries),如果你想让脚本在失败的情况下重试连接。默认值为1

如果连接成功建立,你可以通过不向池发送任何参数来获取它的PDO对象

(new \Simbiat\Database\Pool)->openConnection();

或者发送之前配置的 $config 或连接ID,如果你需要特定的一个。 \Controller 类使用不带参数的变体以提高灵活性,但如果认为有必要,也可以进行覆盖。

如果连接失败,你可以使用以下方式获取错误:

\Simbiat\Database\Pool::$errors

要使用 \Controller,你需要按照上述方式建立连接,然后调用它的 query() 函数或任何包装器。例如,这一行将计算表中的行数,并返回这些行的数量,即一个整数

(new \Simbiat\Database\Controller)->count('SELECT COUNT(*) FROM `table`');

这一行将返回一个布尔值,表明某个东西是否存在于表中

(new \Simbiat\Database\Controller)->check('SELECT * FROM `table` WHERE `time`=:value', [':value'=>['', 'time']]);

上述示例还展示了设置绑定的一种可能方式。常规 \PDO 允许绑定如 hook, value, type 的值,但 \Controller 如果你想发送非字符串值或特殊值(如上面提到的 time),则期望 value 为一个数组。由于我们为 time 发送了一个空值,\Controller 将获取当前微时间戳,将其转换为并绑定成 Y-m-d H:i:s.u 格式。