DBX:尝试摆脱编译MySQL查询

很久以前,当我刚开始学习PHP和编译MySQL查询的复杂性(2011年)时,我想到了为MySQLi编写包装器(如Doctrine)的想法,以简化访问数据库的语法。 已经是2019年了,决定分享我关于ORM主题的自行车。

因此,这就是DBX-基于MySQLi库的PHP MySQL数据库引擎,它基于对表和字段结构描述类型的查询,这些查询以规则数组的形式存在,具有静态查询缓存和静态哈希自动更新的功能。

与对PDO的普遍喜爱相反,它选择了轻量级的MySQLi功能,该功能更软,更容易编程,并且更简洁地适合于所建议的DBX API。 我什至没有使用过composer,因为除了自写项目之外,我没有任何项目使用第三方依赖项。

实际上,请考虑一个声明简单测试数据库及其表的结构的示例。 首先,我们将库本身与类连接,并向数据库主机发送授权数据:

require_once './DBX.php'; $dbx_data = ['localhost', 'root', 'root', 'dbx_test', '8889']; 

现在假设我们需要使用常规PHP数组的语法在数据库中描述和创建表:

 <?php /** * CREATE TABLE EXAMPLE */ $table_1 = 'example'; // table name $query_1 = 'c'; // create table sql $fields_1 = [ 'field_id' => [ 'type' => 'num', // int 'auto' => true, // auto increment 'length' => 255, 'fill' => true // not null ], 'field_text' => [ 'type' => 'text', // varchar 'length' => 255, 'fill' => true ], 'field_date' => [ 'type' => 'time', // TIMESTAMP 'value' => date('Ym-d') ] ]; ?> 

语法很简单。 我没有使用强类型,而是选择了值TEXT,NUMBER和TYMESTAMP。 当然,对于更“引导”的表结构,将使用具有自动增量的键ID字段(我在实际项目中没有看到设置自动增量的情况,并且键会干扰查询和表关系的设计)。 要指示该字段是否可以为空,请指定fill => true。

DataBaseX查询类型非常简单,包含基本方法,例如选择,插入,删除,更新,删除,截断等。

例如,创建表的查询:

 // perform queries $dbx::query("c", $table_1, $fields_1); 

或者添加数据和列结构的查询可能如下所示:

 // fields values for table_1 example $fields_2 = [ 'field_id' => [ 'value' => 456 ], 'field_text' => [ 'value' => 'I have to add into my table' ], 'field_date' => [ 'value' => date('Ym-d') ] ]; // perform queries $dbx::query('i', $table_1, $fields_2); 

数组的结构允许一天描述数据库,随后只能操纵值字段来修改用于构成查询的数据。

这是一个示例更新语句,在以下示例中将删除该语句:

 // fields values for table_1 example $fields_3 = [ 'field_id' => [ 'value' => 456 ], 'field_text' => [ 'new_value' => 'I was updated', 'criterion_field' => 'field_id', 'criterion_value' => 456 ], 'field_date' => [ 'value' => date('Ym-d') ] ]; // perform queries $dbx::query('u', $table_1, $fields_3); 

在我看来,使用criteria_field和criteria_value字段会使系统复杂化,因此我创建了一个查询,该查询会自动将数据添加到数据库(如果尚未创建)或更新现有数据。 我将此查询称为INJECT QUERY,它以前缀“ in”调用:

 // fields values for table_1 example $fields_2 = [ 'field_id' => [ 'value' => 0 ], 'field_text' => [ 'value' => 'Yo if field_id = 0 it\'s an insert or if id exists it\'s an update' ], 'field_date' => [ 'value' => date('Ym-d') ] ]; // perform queries $dbx::query('in', $table_1, $fields_2); 

这在较低的水平上是这样的:

 INSERT INTO `revolver__comments` (`field_id`, `field_content`) VALUES ('5', 'TEST UPDATE') ON DUPLICATE KEY UPDATE `field_id`='5', `field_content`='TEST UPDATE'; 

所有其他查询都是最简单的,描述它们没有任何意义(请参阅index.php测试文件中的示例),但是我不禁要说明SELECT查询的工作方式:

 <?php // perform queries $dbx::query('s|field_id|asc|100|0', $table_1, $fields_1); ?> <?php // print structure print '<h2>DBX STRUCTURE</h2>'; print '<pre><code>'; print_r( $fields_1 ); print '</code></pre>'; // print result print '<h2>DBX QUERY RESULT</h2>'; print '<pre><code>'; print_r( $dbx::$result ); print '</code><pre><hr />'; ?> 

在这里,使用前缀“ s”,可以将查询参数s | field_id( 顺序 )| asc( 方向 )| 100( 限制 )| 0( 偏移 )分组

其中,DBX具有独特的功能,例如基于JSON静态信息的内置文件缓存。 每个更改请求(INSERT,UPDATE,DELETE和TRUNCATE)都会导致在哈希哈希表中计算哈希并自动更新静态缓存,这使您不必考虑SELECT查询的负载。

将来,我计划使用UNION和JOIN配置系统开发DBX引擎并扩展SQL查询设计器的功能,并基于JSON结构类型从MySQL 8添加新的数据库支持。

现在,DBX已用于我的RevolveR内容管理系统中,并显示出良好的特性(如果有一个更新的缓存,则整个站点将通过对数据库的一次查询进行初始化,并消耗约0.7 Mb的解释器RAM)。 对于我来说,在一个单独的文件中查看整个数据库结构也非常方便,这有时会加快新模块的构建和设计。

项目存储库: GitHub上的DBX v1.1.1

Source: https://habr.com/ru/post/zh-CN438762/


All Articles