我必须在PHP中创建一个代码,这样我就可以在MySQL数据库中保存记录更新的历史记录,这样我就可以按日期查找旧版本。
这是我实际想要实现的例子: http://en.wikipedia.org/w/index.php?title=Tunisia&action=history
数据主要是我们记录的关于公司的数字,用于生成报告和提取索引。
我计划使用codeigniter,因为它很简单,我正在寻找一个框架或开源项目的想法,它使用相同的方法来保存数据库中的修改历史。
答案 0 :(得分:16)
最简单的解决方案(取决于您的特定需求)可能是为您的表添加更新/插入/删除触发器,因此您可以在插入/更新/删除数据时执行额外的日志记录。这样就可以覆盖对数据库的人工干预......
答案 1 :(得分:8)
保持版本历史记录的一种简单方法是创建基本相同的表(例如,使用_version后缀)。这两个表都有一个版本字段,对于主表,您为每次更新都会增加。版本表将在(id, version)
上具有复合主键。
每当您对实际表进行更新时,您还会在版本表中插入包含重复数据的新行。每当您想要查找版本历史记录时,您需要做的就是SELECT * FROM content_version WHERE id = CONTENT_ID ORDER BY version
。
如果您使用Doctrine ORM之类的东西,它会有一种行为,可以通过事件侦听器自动执行此操作。您可以在此处查看:http://www.doctrine-project.org/documentation/manual/1_2/en/behaviors#core-behaviors:versionable
答案 2 :(得分:6)
有一个开源(MIT许可证)框架来构建CRM和ERP类型的数据库驱动的Web应用程序。您也可以从SourceFroge上的http://epe.si/下载 EPESI :http://sourceforge.net/projects/epesi/
EPESI的CRUD 引擎 - 记录浏览器 - 具有非常高效的记录历史记录以及其他功能,如高级权限系统(下至现场级别)等等
单个记录集将数据存储在多达10个表中,并且与数据库无关(使用PHPAdoDB)。名为 recordset_data 的表存储“原始”数据和更改历史记录存储在另外两个表中: recordset_edit_history 和 recordset_edit_history_data 。
Record的edit_history具有以下结构:
记录的edit_history_data具有以下结构:
这是一个非常快速和高效的引擎,它存储的变化不在记录上,而是存储在单个字段级别上。
答案 3 :(得分:2)
您必须在应用程序和数据库之间使用额外的层。你可以自己做一个非常简单的事情(而不是直接调用mysql_query
你调用一个包装它并跟踪更新的函数,或者使用一些现有的ORM。在伪代码中
my_mysql_query($query){
if($query is an update){
//Log stuff before query
}
$r = mysql_query($query);
if ($r && $query is an update){
//Log stuff after query
}
return $r;
}
然后在您的应用中,您拨打my_mysql_query
而不是mysql_query
。
您可以检查该表是否是您要跟踪的表,并且可以将该行复制到原始表的副本中。
如果您使用Doctrine ORM,则可以使用其Event Listeners来获得所需内容。
答案 4 :(得分:1)
这不是记录实际的SQL更新。它正在记录数据的更新。实际上它将存储页面的每个版本,并且默认情况下只提供最新版本。未存储用于它的SQL代码。
因此,你必须采取类似的方法。每次数据更改时,您都需要弄清楚数据的更改方式并存储此“补丁”数据。您可能最好存储最新版本,而不是必须通过所有补丁来实现它。这意味着您将能够看到类似
的内容! created file
* added data to cell D4 'product descript' D5 'set of pens' E5 '£5.99'
* added data to cell D6 'toaster' E5 '£10'
& changed data in cell D4 'Product Description'
这些更改中的每一项都需要与时间戳一起存储或在完成时存储。您还需要制定自己的Scheeme来存储对数据的更改。
另一个更简单的解决方案是使用wiki引擎,如果您愿意在网页中工作,它可以提供您想要的所有功能。您可能需要花一些时间让它更好地满足您的需求,让人们从更完整的视图中编辑它,而不是原始的wiki。
答案 5 :(得分:1)
如果我理解正确,您只是在特定表格中保存“数字”,并且您想要该数字的修订历史记录?
我会说:编写你的数据模型,使其包含该数字的历史记录。因此,您不仅要记录该数字的最新值,还要保留以前的任何值。
这样做的一个简单方法是使用包含以下字段的表:
如果您想知道当前的号码,请执行
SELECT * FROM table WHERE companyId = X ORDER BY timestamp DESC LIMIT 1
如果您想查看所有修订,请执行以下操作:
SELECT * FROM table WHERE companyId = X