我尝试使用activerecord使用codeigniter导入一些数据。我收到这个对我没有任何意义的错误
<p>Error Number: 1062</p>
<p>Duplicate entry 'L'' for key 'brand'</p>
<p>INSERT INTO `brands` (`brand`) VALUES ('L\'awlek')</p>
我对品牌表有一个独特的约束,因为我不想要重复。我的问题是,为什么它会在第一个撇号处削减价值,并声称这是关键?
相关守则:
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;
}
}
答案 0 :(得分:1)
我认为您将数组$data
传递给函数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;
}
}
更多细节
在以下语句中,如果$value
是一个数组。
$query = $this->db->get_where( TABLE , array('brand'=>$value));
将评估为:
$query = $this->db->get_where( TABLE , array('brand'=>'Array'));
这就是为什么您的查询返回false,因为'Array'不是您表中的品牌。
<强> PS 强>
根据导致调用函数的事件顺序,可能会有其他事情发生,但是在寻找其他更微妙的问题之前,应该修复这个明显的错误。
答案 1 :(得分:0)
感谢您的帮助!
一位开发人员针对数据集运行了这个perl脚本。我假设撇号是一个“聪明的引用”。此脚本将删除所有非ascii字符,之后它会起作用。也许它会帮助那里的其他人。
perl -i.bak -pe 's/[^[:ascii:]]//g' data.sql