我正在从 Google API 导入 GMail 联系人,只想将唯一的电子邮件 ID 保存到数据库中。是否可以使用 codeigniter 的 Active Record 插入唯一记录?CodeIgniter 是否提供开箱即用的功能?
如果我使列唯一,则查询将引发异常。在深入研究文档后,我了解到 CodeIgniter 不提供try catch
块。
问问题
6332 次
3 回答
2
您的电子邮件字段在表索引中必须是唯一的。
$query_string = $this->db->insert_string('table', $data);
$query_string = str_replace('INSERT INTO', 'INSERT IGNORE INTO', $query_string);
$req = $this->db->query($query_string);
if($req->affected_rows() == 1) {
//data inserted
} else {
//email exists already
}
如果使用 IGNORE 关键字,则执行 INSERT 语句时发生的错误将被视为警告。例如,如果没有 IGNORE,复制表中现有 UNIQUE 索引或 PRIMARY KEY 值的行会导致重复键错误并且语句被中止。使用 IGNORE,行仍然没有插入,但不会发出错误。如果未指定 IGNORE,将触发错误的数据转换将中止语句。使用 IGNORE,将无效值调整为最接近的值并插入;会产生警告,但语句不会中止。
于 2013-04-23T14:42:23.757 回答
1
您可以创建一个基本模型(application/core/MY_Model.php)并实现一个保存功能,如果新就插入,如果存在则更新。从中扩展您的模型。
这是来自http://thephpcode.com/blog/codeigniter/a-smart-codeigniter-model的摘录
public function save($data,$tablename="")
{
if($tablename=="")
{
$tablename = $this->table;
}
$op = 'update';
$keyExists = FALSE;
$fields = $this->db->field_data($tablename);
foreach ($fields as $field)
{
if($field->primary_key==1)
{
$keyExists = TRUE;
if(isset($data[$field->name]))
{
$this->db->where($field->name, $data[$field->name]);
}
else
{
$op = 'insert';
}
}
}
if($keyExists && $op=='update')
{
$this->db->set($data);
$this->db->update($tablename);
if($this->db->affected_rows()==1)
{
return $this->db->affected_rows();
}
}
$this->db->insert($tablename,$data);
return $this->db->affected_rows();
}
于 2013-04-23T05:16:26.913 回答
1
如果您的数据来自 from,CI 提供了一个form_validation
可以在服务器端验证您的表单的类。通过 form_validation 有一个称为is_unique
检查给定值是否已存在于数据库中的规则。你可以在这里看到完整而清晰的解释
或者,您可以在将电子邮件插入该 unqiue 列之前手动检查它。
$this->db->select('email');
$this->db->where(array('email'=>$email));
$query = $this->db->get('yourtable');
if($query->num_rows() > 0){
// the query returned data, so the email already exist.
}else{
// the email not exists, so you can insert it.
}
于 2013-04-23T05:20:03.080 回答