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






4.80/5 (3投票s)
本文介绍了一个使用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 以后可用于 update
、delete
或 query
该注释。
更新一个对象
$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 编码并保存到磁盘,然后文件被关闭。 在 update
或 remove
操作的情况下,两种方法都必须加载整个数据文件以搜索要 update
或 remove
的对象。 找到该对象后,它将从已加载的集合中更新/删除,并且集合将使用新更改保存到文件中。
历史
- 2014 年 10 月 22 日:初始版本