循环insert语句时,密钥“PRIMARY”的Codeigniter错误重复条目“”
我正在codeigniter中设置此函数,使其作为cron作业运行,并在X时间将所有用户注销。在选择一个用户并注销该用户时,我成功地使用了此代码,但在添加foreach时,我得到以下错误:循环insert语句时,密钥“PRIMARY”的Codeigniter错误重复条目“”,codeigniter,activerecord,insert,foreach,Codeigniter,Activerecord,Insert,Foreach,我正在codeigniter中设置此函数,使其作为cron作业运行,并在X时间将所有用户注销。在选择一个用户并注销该用户时,我成功地使用了此代码,但在添加foreach时,我得到以下错误: Error Number: 1062 Duplicate entry '3858' for key 'PRIMARY' INSERT INTO `time` (`id`, `projectid`, `phaseid`, `firstname`, `timest`, `status`, `activityi
Error Number: 1062
Duplicate entry '3858' for key 'PRIMARY'
INSERT INTO `time` (`id`, `projectid`, `phaseid`, `firstname`, `timest`, `status`, `activityid`, `todate`, `remark`, `time`, `workperiod`, `activitydate`, `entrydate`) VALUES ('3858', '212132 Unilever Nigeria  10000L Toothpaste Storage Tanks x 2', '1', 'BONGANI', '1347610976', '1', '1', '1', '1', 3335907, 'nothing', '2012-09-14 10:22:56', '2012-10-23 01:01:23')
Filename: C:\xampp\htdocs\projectfiles\protime\v2\system\database\DB_driver.php
Line Number: 330
这是模型的代码:
function punch_out() {
$this -> load -> database();
$this -> load -> helper('date');
//get people
$this -> db -> select('*');
$this -> db -> from('person');
$this -> db -> order_by("department", "asc");
$this -> db -> order_by("userid", "asc");
$query = $this -> db -> get();
foreach ($query->result_array() as $row) {
$people[] = $row;
}
foreach ($people as $row) :
$this -> db -> from('punch');
$this -> db -> where('firstname', $row['firstname']);
$this -> db -> order_by("id", "desc");
$this -> db -> limit(1);
$query = $this -> db -> get();
foreach ($query->result_array() as $row) {
$data = $row;
}
$data['workperiod'] = 'nothing';
$current_time = getdate();
if ($current_time['wday'] > '0' && $current_time['wday'] < '5') {
if ($current_time['hours'] > '7' && $current_time['hours'] < '12') {
$data['workperiod'] = 'stda';
} else if ($current_time['0'] > strtotime('4:16am') && $current_time < strtotime('11:59pm')) {
$data['workperiod'] = 'ota';
}
} else if ($current_time['wday'] == '5') {
if ($current_time['0'] > strtotime('7:00am') && $current_time < strtotime('11:59am')) {
$data['workperiod'] = 'stdb';
} else if ($current_time['0'] > strtotime('1:01am') && $current_time < strtotime('11:59pm')) {
$data['workperiod'] = 'otb';
}
} else if ($current_time['wday'] == '6') {
$data['workperiod'] = 'otc';
} else if ($current_time['wday'] == '0') {
$data['workperiod'] = 'dtc';
}
if ($data['status'] == 1) {
//MAKE TIME
$now = time();
$data['time'] = elapsed_time($data['timest'], $now);
$data['entrydate'] = timestamp_to_mysqldatetime($now);
$data['activitydate'] = timestamp_to_mysqldatetime($data['timest']);
$this -> db -> insert('time', $data);
}
endforeach;
}
如果我读得正确,$data包含每个打孔的详细信息,包括$data['id'],该打孔的唯一id。由于从未从$data中删除$data['id']字段,因此在将$data作为源项插入时间数据库时,您还指定新条目的id与从中提取的冲孔相同。一旦您尝试运行两次,您将插入两个具有相同id的行,并且从错误中可以看出,您将时间表上的id字段设置为主字段,这意味着它不能有任何重复项
我认为,如果我正确理解了您的代码和数据结构,解决方案是在运行插入之前取消设置$data['id'.如果您试图更新插入的同一id的数据时间、entrydate、activitydate,我认为如果您只将数据放在一个新数组中会更好,例如:
if ($data['status'] == 1) {
//MAKE TIME
$now = time();
$newdata['time'] = elapsed_time($data['timest'], $now);
$newdata['entrydate'] = timestamp_to_mysqldatetime($now);
$newdata['activitydate'] = timestamp_to_mysqldatetime($data['timest']);
$this -> db -> where('id',$data['id']);
$this -> db -> update('time', $newdata);
}
或者,如果试图向数据库中插入新记录,只需更改尝试插入的数组名称:
if ($data['status'] == 1) {
//MAKE TIME
$now = time();
$newdata['time'] = elapsed_time($data['timest'], $now);
$newdata['entrydate'] = timestamp_to_mysqldatetime($now);
$newdata['activitydate'] = timestamp_to_mysqldatetime($data['timest']);
$this -> db -> insert('time', $newdata);
}
在这种编码方式中,这可能避免将来出现更多错误,并可能节省时间
干杯