几周前,我在自己的 CMS 中做了一个 data_versioning。这个想法很简单。我使用了一个额外的数据库表data_versioning
,它有几个字段:
- dv_id
- dv_table
- dv_primary_key
- dv_data
- dv_created_by
- dv_created_at
dv_id 是表的主键,dv_created_by 是 user_id,dv_created_at 是日期时间字段。这些是不太重要的字段,3 个重要的字段是:
- dv_table:此字段包含数据库表的名称,例如
students
。
- dv_primary_key:此字段包含
students
表的主键。确定 data_vesion 在哪一行。
- dv_data:包含先前在您的行中的数据数组的序列化字符串
我使用的方法是:
- 一行的编辑页面首先检查并获取数据,将其存储在一个变量中,例如:
$studentData = $db->fetch("SELECT * FROM students WHERE id = 1");
- 当找到 POST 请求时,正在检查 POST 中的字段(验证),以确保新条目对我们的数据库有效。
- 一旦输入有效,“魔术”就会发生
神奇之处在于:
- 创建要插入的 data_version:
$db->query("INSERT INTO data_version (dv_table, dv_primary_key, dv_data) VALUES ('students', 1, '".serialize($studentData)."')");
- 然后更新当前行:
$db->update("UPDATE students SET ... WHERE id = 1");
- 使用新数据更新 $studentData 数组:
$studentData = $_POST;
第 3 部分是可选的。就我而言,在有人提交更改后,我更新了我的表格,显示成功/错误消息,并且编辑表单再次可用,其中包含新数据。这个编辑是用$studentData
.. 填充的,所以这个数组必须更新,否则它包含前一个条目的数据(因为 $studentData 被填充在你的页面顶部)。
恢复数据
恢复数据就像从基于 dv_table 和 dv_primary_key 字段的表 data_versions 中获取包含可用版本的列表一样简单。然后 unserialize() dv_data 字段并更新数据。dv_data 字段包含表字段
OO 集成有点不同。在这种情况下,您只需在保存处理程序中添加一个额外的 before() 函数即可写入 data_version 表。
I'm not sure if this is the best option. But in my case I was looking for a solution that only needed 1 database table instead of a students_versions
, news_versions
and so on.