-1

我有一个带有以下字段的表...

student_id, name, email, age

我使用下面的代码来更新我的学生表数据:

$this->db->query("UPDATE " . DB_PREFIX . "student SET name = '" . $this->db->escape($data['name']) . ", email= '" . $this->db->escape($data['email']) . ", age= '" . $this->db->escape($data['age']) . " WHERE student_id = '" . (int)$student_id . "'");

我的问题是如何在每次更新时获得DUPLICATE字段?我的意思是当我们更新我的表时,新数据必须是一个带有新添加数据的重复表,就像以前数据的副本一样更新......

我对mysql不太熟悉。

4

1 回答 1

2

几周前,我在自己的 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 个重要的字段是:

  1. dv_table:此字段包含数据库表的名称,例如students
  2. dv_primary_key:此字段包含students表的主键。确定 data_vesion 在哪一行。
  3. dv_data:包含先前在您的行中的数据数组的序列化字符串

我使用的方法是:

  1. 一行的编辑页面首先检查并获取数据,将其存储在一个变量中,例如:$studentData = $db->fetch("SELECT * FROM students WHERE id = 1");
  2. 当找到 POST 请求时,正在检查 POST 中的字段(验证),以确保新条目对我们的数据库有效。
  3. 一旦输入有效,“魔术”就会发生

神奇之处在于:

  1. 创建要插入的 data_version:$db->query("INSERT INTO data_version (dv_table, dv_primary_key, dv_data) VALUES ('students', 1, '".serialize($studentData)."')");
  2. 然后更新当前行:$db->update("UPDATE students SET ... WHERE id = 1");
  3. 使用新数据更新 $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.

于 2013-03-30T11:08:46.300 回答