dustingraham/react-mysql

此包已被废弃,不再维护。未建议替代包。

使用 PHP 实现非阻塞 MySQLi 数据库访问。旨在与 reactphp/react 一起使用。

v0.1.1 2016-05-20 16:56 UTC

This package is not auto-updated.

Last update: 2021-01-19 23:21:37 UTC


README

使用 PHP 实现非阻塞 MySQLi 数据库访问。旨在与 reactphp/react 一起使用。

Build Status

快速入门

$db = new \DustinGraham\ReactMysql\Database(
    ['localhost', 'apache', 'apache', 'react_mysql_test']
);

$db->statement('SELECT * FROM simple_table WHERE id = :test', [':test' => 2])
    ->then(function(\mysqli_result $result)
    {
        $rows = $result->fetch_all(MYSQLI_ASSOC);
    });

$db->shuttingDown = true;
$db->loop->run();

shuttingDown 设置为 true 将允许循环在查询解决后退出。

工作

这正在工作。但还远远没有完成。请查看示例文件以及单元测试以获取更多示例。

$ ./example 
Creating database....done!
Run Query: 0
Found rows: 0
Run Query: 1
Found rows: 1
Current memory usage: 868.164K
Run Query: 2
Found rows: 1
Run Query: 3
Found rows: 1
Run Query: 4
Found rows: 0
Current memory usage: 868.164K
Run Query: 5
Found rows: 0
Current memory usage: 865.719K
Current memory usage: 865.719K
Current memory usage: 865.719K
Loop finished, all timers halted.

如果不配置数据库,则无法直接使用。您还需要设置一个包含查询数据的数据库。

单元测试

示例和单元测试期望一个名为 react_mysql_test 的数据库,每次运行时都会创建适当的表。它还期望 localhost 和用户 apache,密码 apache

待办事项

这不是生产就绪。查询构建器还有很多工作要做。虽然我不喜欢重复造轮子,但我还没有找到一个轻量级的可注入查询构建器,它不与大型框架相关联。

计划(未来示例)

这些只是目前的计划。随着我们的开发,它可能会发生巨大变化。

当前开发示例

以下是目前大部分正常工作的示例。

$db = new \DustinGraham\ReactMysql\Database(
    ['localhost', 'apache', 'apache', 'react_mysql_test']
);

$db->statement('SELECT * FROM simple_table WHERE id = :test', [':test' => 2])
    ->then(function(\mysqli_result $result)
    {
        $rows = $result->fetch_all(MYSQLI_ASSOC);
        
        // Do something with $rows.
    });

$db->shuttingDown = true;
$db->loop->run();

原始的大图计划

这里是一些可能最终成为的示例。隐藏一些当前的样板代码将很棒。

Connection::init($loop, ['db_host', 'db_user', 'db_pass', 'db_name']);

Connection::query(
  'SELECT * FROM `table` WHERE `column` = ? AND `column2` = ?;',
  ['red', 'white']
)->then(function($result) { ... });

Connection::query(...) returns a promise.

$db = new Database();
$db->createCommand('SELECT * FROM table WHERE id = :id', [':id' => 1])
  ->execute()
  ->then(function($results) {
      echo $results[0]->name;
  });

还有另一个想法...

DB::loadModel('id', ' =', '3')->then(function($model) use ($socket) {
  $socket->send('Your name is '.$model->name);
});

困难

有很多困难。

到目前为止,我没有找到任何可以不使用 PDO 或预处理语句处理参数化查询的库。

MYSQLI_ASYNC 不支持预处理语句和参数绑定。因此,我们必须自己编写它。

mysqli::real_escape_string 需要一个链接。但是,链接是许多链接之一。在命令和连接从池中结合在一起的最后时刻进行最后时刻的转义。可能需要一个专门的链接来进行转义。

查询构建支持

已经分析了许多 MySQL 封装包,但没有一个是完全独立于可找到的连接对象的。

目前,我们将转义参数,但要求用户提供一个包含引号参数的 SQL 查询。

这显然是不理想的,因为像 $created_at 这样的变量可能是 NOW()、'2016-01-01' 或 NULL。

我一直使用的试金石查询如下

INSERT INTO `simple_table` (`id`, `name`, `value`, `created_at`)
VALUES (NULL, 'John\'s Name', 7, NOW());

这里的关键点是

  • 支持将参数放在引号中!这是第一步。其余的是智能地知道何时不引号。
  • 支持将空值转换为 NULL。
  • 支持使用单引号'或双引号''来转义参数。
  • 支持不转义函数,如NOW()。
  • 支持识别整数值。这是可选的,因为'7'也可以正常工作。

包装器选项已审查

  1. nilportugues/php-sql-query-builder - 无需连接!但,语法有些奇怪。
  2. usmanhalalit/pixie - 需要连接。非常接近需求。
  3. joshcam/PHP-MySQLi-Database-Class - 需要连接。
  4. aviat4ion/Query - 需要连接。
  5. rkrx/php-mysql-query-builder - 需要连接。
  6. stefangabos/Zebra_Database - 需要连接,功能多于所需。
  7. indeyets/MySQL-Query-Builder - 未维护。语法有些奇怪。

nilportugues/php-sql-query-builder包非常接近,但它没有引号参数。

安装

推荐通过Composer安装此库。

$ composer require dustingraham/react-mysql

需要PHP 5.4和php ext-mysqli扩展。

致谢

非常感谢在reactphp/react上的辛勤工作。

受类似项目启发

许可

DustinGraham/ReactMysql在MIT许可证下发布。