我在下面有这个PHP函数,如果一个具有相同ID的那个已经存在,则创建一个新的Project Task MySQL数据库记录。
如果已经存在具有相同ID的那个,那么它将成为UPDATES
MySQL记录。
此代码投入了大量时间,因为只有在这5个字段中的任何一个已更改为a时,才会更新任务记录的date_modified
字段非常重要。新价值!:
- 姓名
- 说明
- 状态
- 类型
- 优先级
如果在制作UPDATE
时所有这些字段都与上一个值具有相同的值,例如,如果sort_order
值已更改,则不更新date_modified
字段!
经过大量工作以使其正常工作,它的效果非常好。我提到这一切因为不破坏这个功能很重要!
现在这个问题是因为这个函数在MySQL中可以CREATE
和UPDATE
任务记录。
我现在需要知道每个事件发生的时间。
如果新的任务记录为CREATED
,那么我需要知道已创建新记录。
如果任务记录只是UPDATED
,那么我需要知道该记录已经存在且只是更新。
无论如何要确定我发生的事件中发生了哪两件事?
private function _addOrUpdateTaskRecord($taskId, $projectId, $created_by_user_id, $modified_user_id, $name, $description, $status, $priority, $type, $date_entered, $date_modified, $date_started, $date_completed, $date_due, $milestone_id, $assigned_user_id, $sort_order, $heading){
$sql = "
INSERT INTO
$this->tasksDbTableName(task_id, project_id, created_by_user_id, modified_user_id, name, description, status, priority, type, date_entered, date_modified, date_started, date_completed, date_due, milestone_id, assigned_user_id, sort_order, heading)
VALUES
('$taskId', '$projectId', '$created_by_user_id', '$modified_user_id', '$name', '$description', '$status', '$priority', '$type', UTC_TIMESTAMP(), UTC_TIMESTAMP(), '$date_started', '$date_completed', '$date_due', '$milestone_id', '$assigned_user_id', '$sort_order', '$heading')
ON DUPLICATE KEY UPDATE
date_modified = (CASE
WHEN name <> values(name)
OR description <> values(description)
OR status <> values(status)
OR type <> values(type)
OR priority <> values(priority)
THEN UTC_TIMESTAMP()
ELSE date_modified
END),
modified_user_id='$modified_user_id',
name='$name',
description='$description',
status='$status',
priority='$priority',
type='$type',
date_started='$date_started',
date_completed='$date_completed',
date_due='$date_due',
milestone_id='$milestone_id',
assigned_user_id='$assigned_user_id',
sort_order='$sort_order',
heading='$heading'";
$insertOrUpdateTasks = $this->db->query($sql);
return $insertOrUpdateTasks;
}
更新
我在这里添加我的MySQL触发器代码供其他人查看,因为它可能会帮助有一天有类似问题的人,或者我自己,所以我不会发布一个问题我再次找到解决方案!
在创建任务时触发创建事件记录
DROP TRIGGER IF EXISTS project_task_new_event;
CREATE TRIGGER `project_task_new_event` AFTER INSERT ON `apoll_web_projects_tasks`
FOR EACH ROW
INSERT INTO apoll_web_projects_events (event_type, project_id, task_id, created_by_user_id, description, date_created) VALUES ('6', NEW.project_id, NEW.task_id, NEW.modified_user_id, NEW.name, UTC_TIMESTAMP());
触发在任务更新时创建事件记录
DROP TRIGGER IF EXISTS project_task_update_event;
DELIMITER $$
CREATE TRIGGER `project_task_update_event` AFTER UPDATE ON `apoll_web_projects_tasks` FOR EACH ROW
BEGIN
IF NOT (NEW.date_modified <=> OLD.date_modified)
THEN
INSERT INTO apoll_web_projects_events (event_type, project_id, task_id, created_by_user_id, description, date_created) VALUES ('7', NEW.project_id, NEW.task_id, NEW.modified_user_id, NEW.name, UTC_TIMESTAMP());
END IF;
END $$
DELIMITER ;
答案 0 :(得分:2)
您可以使用db类中的affected_rows。 (我不确定究竟是哪个班级)。来自the manual:
使用ON DUPLICATE KEY UPDATE, 每行的受影响行值为1 该行作为新行和2插入 如果现有行已更新。
答案 1 :(得分:1)
您的代码不安全。你有SQL注入问题。
要知道记录是否已创建或更新,请简单比较create_date!= update_date
插入数据时,请将create_date和update_date设置为相同的值。在&#34; ON DUPLICATE&#34;部分更新&#34; update_date&#34;字段。
另一种解决方案是使用触发器,如下所示:
DELIMITER $$
CREATE TRIGGER `update_trigger` BEFORE UPDATE ON `tasks_table` FOR EACH ROW
BEGIN
/* Add any fields you want to compare here */
IF !(OLD.name <=> NEW.name OR OLD.description <=> NEW.description OR OLD.description <=> NEW.description OR OLD.status <=> NEW.status OR OLD.type <=> NEW.type OR OLD.priority <=> NEW.priority) THEN
NEW.date_modified = NOW()
END IF;
END;$$
DELIMITER ;