看一下PHP代码:
$user->v_useragent = 'coresky.agent';
这样的代码可能会引发UPDATE或INSERT SQL查询,或者可能不会引发数据库中是否已经安装了相同的数据,这就是为什么将此功能称为Phantom SQL查询的原因。 大多数CRM中通常都具有类似的功能,但让我们看一下如何在没有CRM的情况下实现该功能。 虚拟请求有可能在Web应用程序中被广泛使用,尤其是在配置方面。 典型(但不是必需)的算法分三个阶段进行:从数据库中读取数据,可能多次更改数据以及生成实际的SQL查询以更新数据库中的数据。 让我们弄清楚细节...
总共必须有三种方法,每个阶段一种。 我将给出第一种方法的代码,该方法可以完全解压缩从数据库读取的数据,因为它非常简单:
class SKY // coresky { ... static function &ghost($char, $original, $sql = '', $flag = 0) { SKY::$mem[$char] = [$flag, $flag & 4 ? null : $original, $sql, []]; if ($sql) trace('GHOST SQL: ' . (is_array($sql) ? end($sql) : $sql), false, 1); if ($original) foreach (explode("\n", unl($original)) as $v) { list($k, $v) = explode(' ', $v, 2); SKY::$mem[$char][3][$k] = unescape($v, true); } return SKY::$mem[$char][3]; }
方法输入参数:
- $ char-英文字母的一个小写字母,表示虚幻查询的功能类型,可以在可变前缀中使用,如上例所示;
- $ original-数据库单元的文本内容(对于MySQL为`mediumtext`),其中幻象查询的所有变量$ char均批量存储。 也可以输入一个空字符串。
- $ sql-一个查询模板,将用于生成实际的SQL查询,例如,在register_shutdown_function()的回调函数中;
- $ flag-标志。 通常,使用预定义值0;
查询模板可以基于sql(..)或sqlf(..)函数两种类型。 我将完全给出第二个代码,因为如果使用正确,它可以保证SQL注入的不可能,它非常快捷而且非常简单:
function sqlf() {
不幸的是,就防止注入而言,就编译
任意SQL查询而言,sqlf()函数并不通用。 但是,由于操作速度相对较高,它与通用sql()函数并行存在。 sqlf()的模板用于仅使用一个中文本单元格的情况。 当您需要为表的许多列组织此类挂起的查询时,使用第二个模板。
在本文的开头如何处理指定的PHP代码
$ user变量包含一个指向USER对象的指针,该对象又具有魔术方法__get()和__set()。 通过前缀v_,该类了解到它正在写入`visitors'会话表,并调用SKY :: save(..)方法,该方法将代码保存在SKY :: $ mem数组中。 在脚本的末尾,调用register_shutdown_function()的回调函数,在该回调函数中实际执行(或不执行)数据库中的实际SQL查询。
因此,组织功能所需的其他两种方法是SKY :: save(..)和SKY :: here(..)。 第一个将数据存储在数组中,第二个在数据库中生成并执行实际查询。
coresky代码(可重用框架或CMF代码)使用8种类型的幻像SQL:
- 系统配置,存储在数据库中;
- 访客配置
- 配置授权用户;
- 管理面板的系统配置;
- 控制台启动的系统配置;
- 三种类型的幻像SQL用于组织i18n实用程序;
如您所见,“虚拟SQL”与几乎所有Web应用程序都相关。
所描述功能的优势
- 在应用程序开发时,无需执行ALTER TABLE ...(或INSERT新行)来添加新的配置变量。 您可以简单地在PHP代码中添加新变量,而无需更改数据库结构。
- 对于同一表的同一行中有记录的情况,该功能可以将数据库查询的数量减少到一个。
劣势
对于幽灵SQL变量,您无法“拧入”索引;最有可能的是,您无法制作LOCK TABLE或使用其他高级MySQL功能。
可以
在SKY项目网站上找到更多信息
。