我正在解析CSV文件以将recrods添加到表中。我就是这样做的。
foreach($csvData as $key => $row) {
$data_n[$key] = array(
'mf_date' => $row['mf_date'],
'mf_work_id' => $row['mf_work_id'],
'mf_sender' => $row['mf_sender'],
'mf_amount' => $row['mf_amount'],
'mf_trx_id' => $row['mf_trx_id'],
);
$this->db->insert('monthly_fee', $data_n[$key]);
}
我有另一个名为monthly_due
的表,其中有三列
1)md_work_id
2)md_ue
3)md_paid
我想用此操作更新该表的两列。其中mf_work_id与md_work_id匹配想要更新为
$md_due = $md_due - $row['mf_amount'];
md_paid = $md_paid + $row['mf_amount'];
我该怎么做?
答案 0 :(得分:1)
首先,我想你正在使用你的应用程序模型。我想你想要以安全模式实现它,我的意思是,只有当两个查询都成功插入+更新,并且完全确定如果由于数据库问题而没有执行更新,那么你的插入就会被滚动返回,没有插入数据。
嗯,最安全的方法是使用事务:考虑到数据库的表支持事务(假设MySQL RMDB上的innodb表),这应该是有用的:
foreach($csvData as $key => $row) {
$this->db->trans_start();
$data_n[$key] = array(
'mf_date' => $row['mf_date'],
'mf_work_id' => $row['mf_work_id'],
'mf_sender' => $row['mf_sender'],
'mf_amount' => $row['mf_amount'],
'mf_trx_id' => $row['mf_trx_id'],
);
$this->db->insert('monthly_fee', $data_n[$key]);
// Now, you should check in the Database for the data
$updData = array(
'md_due' => 'md_due + ' . $row['mf_amount']
, 'md_paid' => 'md_paid + ' . $row['mf_amount'] )
$this->db->query("
UPDATE monthly_due
SET md_due = md_due - $row['mf_amount']
, md_paid = md_paid + $row['mf_amount']
WHERE md_work_id = $row['mf_work_id']
");
$this->db->trans_complete();
}
如果您不需要交易或您的表不支持,则不必使用$this->db->trans_*
功能。
最后,你的代码中唯一的修改是添加更新语句,在SQL中它是(用于替换PHP值的数字):
UPDATE monthly_due
SET md_due = md_due - 23
, md_paid = md_paid + 23
WHERE md_work_id = 45
使用具有活动记录的Codeigniter应该是上面写的句子。
答案 1 :(得分:-1)
希望这有帮助
foreach($csvData as $key => $row) {
$data_n[$key] = array(
'mf_date' => $row['mf_date'],
'mf_work_id' => $row['mf_work_id'],
'mf_sender' => $row['mf_sender'],
'mf_amount' => $row['mf_amount'],
'mf_trx_id' => $row['mf_trx_id'],
);
if($this->db->insert('monthly_fee', $data_n[$key]))
{
$md_due = $md_due - $row['mf_amount'];
$md_paid = $md_paid + $row['mf_amount'];
$this->db->query("UPDATE monthly_due SET md_due='$md_due',md_paid='$md_paid' WHERE md_work_id = '$row['mf_work_id']'");
}
}