Codeigniter:活动记录插入唯一值

时间:2013-04-23 00:23:03

标签: php codeigniter

我正在从Google API导入GMail联系人,只想将唯一的电子邮件ID保存到数据库中。 是否可以使用codeigniter的Active Record插入唯一记录? CodeIgniter是否提供开箱即用的功能?
如果我使列唯一,则查询将抛出异常。在深入研究文档后,我了解CodeIgniter不提供try catch块。

3 个答案:

答案 0 :(得分: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时,将调整无效值   到最接近的值并插入;警告产生但是   声明不会中止。

MySQL INSERT syntax

CI Database Helper

答案 1 :(得分:1)

您可以创建基本模型(application / core / MY_Model.php)并实现一个save函数,以便在new和update(如果存在)时插入。从中扩展您的模型。

这是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();

}

答案 2 :(得分:1)

如果您的数据来自from,则CI提供了一个form_validation类,可以在服务器端验证您的表单。通过form_validation有一个名为is_unique的规则,它会检查给定的值是否已经存在在数据库上与否。您可以看到完整而清晰的解释here

或者,您可以在将该电子邮件插入该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.
}