65.9K
CodeProject 正在变化。 阅读更多。
Home

JsonDb - 一个简单的平面文件数据库

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.80/5 (3投票s)

2014 年 10 月 22 日

CPOL

3分钟阅读

viewsIcon

25533

downloadIcon

344

本文介绍了一个使用Json作为存储格式的简单扁平文件数据库。

引言

JsonDb 是一个 PHP 库,旨在对扁平文件执行 CRUD 操作。 它可以部署在不需要传统数据库的情况下。 例如,网站留言簿或记录应用程序错误。 它也有查询方法,可以根据搜索条件返回数据。 如果您需要在需要查询的文本文件中存储数据,请考虑使用 JsonDb

在深入研究 JsonDb 的工作原理的技术细节之前,我们先来看一些代码示例。 JsonDb 使用命名空间,因此需要加载类文件。 简单调用 spl_autoload_register() 函数即可加载 JsonDb 类。

spl_autoload_register(function($class){
    require $class .'.php'; 
});

接下来,需要一个 JsonDb 实例。

$db = new JsonDb();
// or
$db = new JsonDb('path to save document');

JsonDb 构造函数接受一个可选的 $documentStorePath 变量。 这是数据文件将保存到的路径。 默认行为是将文件保存在当前执行脚本的目录中。 数据文件以 .json 扩展名保存。 请记住,如果您将数据文件保存在您的 public 目录中,这些文件将可以通过 URL 访问。

对于第一个示例,我们从介绍 insert() 方法开始。 此方法接受一个标准对象,然后将其编码为 json 格式并保存到文件中。 insert() 不属于 JsonDb 类。 实际上,它是 JsonDocumentCollection 类的一个方法。 要获取 JsonDocumentCollection 的实例,您必须首先在 JsonDb 实例上调用一个动态属性。 为了更好地解释这一点,让我们看一些例子。

$db->comments->insert(...); 

$db->posts->insert(...); 

$db->whatever->insert(...);

属性 comments、posts 和 whatever$db 对象的动态属性。 动态属性名称用作数据文件名。 例如,$db->comments 将返回一个新的 JsonDocumentCollection 实例,然后它将尝试创建一个名为 comments.json 的文件(如果它不存在)。 然后,JsonDocumentCollection 实例将公开所有用于处理该文件的方法。 以下示例演示了其中一些方法。

插入一个对象

$comment = new stdClass();
$comment->first_name = 'John';
$comment->last_name = 'Smith';
$comment->comment = 'This is my first comment';
$comment->date = date('Y-M-d H:i:s');

$db->comments->insert($comment); 

$comment 变量必须是 object 类型。 不支持数组。 如果 $comment 对象不存在,insert() 方法将为其分配一个新属性 __object_id。 此属性包含一个唯一 ID,该 ID 以后可用于 updatedeletequery 该注释。

更新一个对象

$objId = '14138983955446609b776c0';

$comment = new stdClass();
$comment->first_name = 'John';
$comment->last_name = 'Smith';
$comment->comment = 'Replace the current comment.';
$comment->date = date('Y-M-d H:i:s');

$db->comments->update($objId, $comment); 

使用从 insert 生成的 __object_id,您可以使用 update() 更新现有记录。

删除一个对象

$objId = '14138983955446609b776c0';
$db->comments->remove($objId); 

查询文档存储

$jsonQuery = $db->comments->find(array('first_name' => 'John'));
// or
$objId = '14138983955446609b776c0';
$jsonQuery = $db->comments->find($objId);

find 方法接受一个搜索参数数组。 您可以使用多个搜索参数。 每个搜索参数对查询执行 "AND" 操作。 find() 方法返回一个新的 JsonQuery 实例。 如果找到结果;在 $jsonQuery 对象上调用 fetchOne()fetch()。 调用 fetchOne() 方法将从搜索集合中返回单个数组,而 fetch() 方法将返回整个搜索集合。

$comment = $jsonQuery->fetchOne(); // Returns a single comment
$comments = $jsonQuery->fetch();   // Returns an array of comments

您还可以使用 limit() 方法限制文档集合结果。 limit() 方法接受两个参数 ($start, $count)。 如果您需要在分页格式中显示该数据,limit() 方法会很有用。

$results = $jsonQuery->limit(2,3)->fetch();

最后,find() 方法允许您根据搜索条件返回文档。 多个搜索条件;导致一个 "AND" 操作。 在某些情况下,条件可能更复杂。 使用 query() 方法指定一个回调函数,该函数可用于自定义搜索结果。

$results = $db->comments->query(function($document){
    if($document->first_name == 'John' || $document->first_name == 'Suzan'){
        return $document;
    }
}, true);

"技术细节"

现在,简要概述一下。 将文档插入到“文档存储”中时,它会以追加模式打开文件。 在调用 insert() 时,对象被 json 编码并保存到磁盘,然后文件被关闭。 在 updateremove 操作的情况下,两种方法都必须加载整个数据文件以搜索要 updateremove 的对象。 找到该对象后,它将从已加载的集合中更新/删除,并且集合将使用新更改保存到文件中。

历史

  • 2014 年 10 月 22 日:初始版本
© . All rights reserved.