【问题标题】:Codeigniter: Active Records Insert Unique valuesCodeigniter:活动记录插入唯一值
【发布时间】:2013-04-23 00:23:03
【问题描述】:

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

【问题讨论】:

  • 你能举个例子说明你想要达到的目标吗?
  • 在插入数据库之前尝试搜索电子邮件,如果存在,则跳过新记录,如果没有,插入它。或者,您可以在 Active Record 中实现 REPLACE 方法,并在电子邮件字段上放置唯一索引

标签: php codeigniter


【解决方案1】:

您的电子邮件字段在表索引中必须是唯一的。

$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

【讨论】:

  • 这似乎是一个不错的解决方案,但这是不好的做法吗?毕竟是在报错……
  • IGNORE 关键字是不好的做法吗?好吧,我会说不。如果您担心查询中可能存在错误数据,并且不会引发错误。所以你的问题是当你检查这些数据时。您不能让 mysql 为您检查它们。这是不好的做法。
【解决方案2】:

您可以创建一个基本模型(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();

}

【讨论】:

    【解决方案3】:

    如果你的数据来自一个 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.
    }
    

    【讨论】:

      猜你喜欢
      • 2011-09-28
      • 1970-01-01
      • 2014-12-15
      • 2023-03-06
      • 1970-01-01
      • 1970-01-01
      • 2023-03-14
      • 2012-12-06
      • 2012-07-09
      相关资源
      最近更新 更多