1

我正在尝试使用 activerecord 使用 codeigniter 导入一些数据。我收到这个错误,对我来说没有任何意义

<p>Error Number: 1062</p>
<p>Duplicate entry 'L'' for key 'brand'</p>
<p>INSERT INTO `brands` (`brand`) VALUES ('L\'awlek')</p>

我对brands 表有一个UNIQUE 约束,因为我不想重复。我的问题是,为什么它会在第一个撇号处切断价值并声称这是关键?

相关代码:

define('TABLE','brands');

function add( $data ){
    $exists = $this->exists( $data['brand'] );
    if( ! $exists )
        $query = $this->db->insert( TABLE , $data);

    return ! $exists ? $this->db->insert_id() : $exists;
}

function exists( $value ){

    $query = $this->db->get_where( TABLE , array('brand'=>$value));

    if( $query && $query->num_rows() > 0 ){
        return $query->row()->id;
    } else {
        return false;
    }
}
4

2 回答 2

1

我认为您正在将数组传递给$datafunction add

add中,您将$data数组传递给函数exists

exists中,您将数组视为变量,这意味着您的 SQL 语句不是您所期望的。结果,您找不到先前存在的记录,因此找不到重复的关键消息。

一个简单的修复可能是这样的:

function exists( $data ){

    $query = $this->db->get_where( TABLE , $data);

    if( $query && $query->num_rows() > 0 ){
        return $query->row()->id;
    } else {
        return false;
    }
}

更多细节
在下面的语句中,if$value是一个数组。

$query = $this->db->get_where( TABLE , array('brand'=>$value));

将评估为:

$query = $this->db->get_where( TABLE , array('brand'=>'Array'));

这就是您的查询返回 false 的原因,因为 'Array' 不是您表中的品牌。

PS
根据导致调用函数的事件顺序,可能还会发生其他事情,但是在寻找其他更微妙的问题之前,应该修复这个明显的错误。

于 2013-03-26T16:51:45.630 回答
0

谢谢您的帮助!

一位开发人员针对数据集运行了这个 perl 脚本。我假设撇号是一个“聪明的报价”。该脚本删除了所有非 ascii 字符,并在之后工作。也许它会帮助那里的其他人。

perl -i.bak -pe 's/[^[:ascii:]]//g' data.sql
于 2013-03-27T14:37:26.393 回答