Codeigniter 仅更新第一行
Posted
技术标签:
【中文标题】Codeigniter 仅更新第一行【英文标题】:Codeigniter update only the first row 【发布时间】:2014-09-09 14:23:11 【问题描述】:我正在尝试使用 CodeIgniter 的“更新”活动记录来更新 mysql 表中的列。但是,我只能更新我放入的数组的第一行。我做错了什么?
代码:
$invalid_email_raw='raphael@live.com;
fadfds@qq.com;
fsd@qq.com;
df@qq.com';
$invalid_email=explode(';', $invalid_email_raw);
foreach ($invalid_email as $email):
$data=array(
'status'=>'unsubscribed'
);
$this->db->where('email', $email);
$this->db->update('user', $data);
endforeach;
本质上,代码将 4 封邮件分解为一个数组,并使用 foreach 更新找到该邮件的相应状态。
但是,只有“raphael@live.com”的状态会更新。其他 3 个不变。
我做错了什么?
【问题讨论】:
你为什么不做一个查询呢? 不知道该怎么做...介意举个例子吗? 在单个查询中,您可以使用批量更新$this->db->update_batch(); 谢谢,但由于我的技能有限,我仍然无法弄清楚确切的方法。非常感谢用这种方法回答我的问题! 请参阅下面的Parag Tyagi
答案。这就是你的做法。它的执行速度也更快。
【参考方案1】:
因为您的更新查询在循环中,并且如果每个时间条件都满足,所以它会更新所有四个的状态。
【讨论】:
但现在它只更新第一个,而不是全部 4 个【参考方案2】:您正在使用换行符,爆炸后您有:
raphael@live.com
\nfadfds@qq.com
\nfsd@qq.com
\ndf@qq.com
\n
是新行。因此,在该更新中仅匹配第一封电子邮件。
【讨论】:
使用 print_r($invalid_email) 我得到: Array ( [0] => raphael@live.com [1] => fadfds@qq.com [2] => fsd@qq.com [ 3] => df@qq.com)。那还是换行符吗? 是的。检查View Page Source
,你会看到this。【参考方案3】:
使用 update_batch()
,也可以使用 array_map()
修剪您的数组值。试试下面的代码,
$invalid_email_raw = 'raphael@live.com;
fadfds@qq.com;
fsd@qq.com;
df@qq.com';
$invalid_email = array_map('trim', explode(';', $invalid_email_raw));
$data = array();
foreach($invalid_email as $email)
$data[] = array(
"email" => $email,
"status" => "unsubscribed"
);
if(!empty($data))
$this->db->update_batch('user', $data, 'email');
【讨论】:
请将$this->db->update_batch('user', $data, 'email');
包裹在if (!empty($data))
中,否则如果$invalid_email
列表中没有电子邮件,他可能会收到错误消息。以上是关于Codeigniter 仅更新第一行的主要内容,如果未能解决你的问题,请参考以下文章
插入批处理,如果在Codeigniter 3 HMVC中有重复的密钥更新