Php Mysql撇号前的重复条目

Php Mysql撇号前的重复条目,php,mysql,codeigniter,activerecord,Php,Mysql,Codeigniter,Activerecord,我正在尝试使用activerecord使用codeigniter导入一些数据。我发现这个错误对我来说毫无意义 <p>Error Number: 1062</p> <p>Duplicate entry 'L'' for key 'brand'</p> <p>INSERT INTO `brands` (`brand`) VALUES ('L\'awlek')</p> 我认为您正在将数组$data传递到函数add中 在add中,

我正在尝试使用activerecord使用codeigniter导入一些数据。我发现这个错误对我来说毫无意义

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

我认为您正在将数组
$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;
    }
}
更详细一点
在下面的语句中,if
$value
是一个数组

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

$query = $this->db->get_where( TABLE , array('brand'=>'Array'));
这就是为什么查询返回false,因为“Array”不是表中的品牌

PS

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

我认为您正在将数组
$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;
    }
}
更详细一点
在下面的语句中,if
$value
是一个数组

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

$query = $this->db->get_where( TABLE , array('brand'=>'Array'));
这就是为什么查询返回false,因为“Array”不是表中的品牌

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

谢谢您的帮助

另一位开发人员针对数据集运行了此perl脚本。我认为撇号是一个“聪明的引语”。这个脚本删除了所有非ascii字符,之后就可以工作了。也许它会帮助其他人

perl -i.bak -pe 's/[^[:ascii:]]//g' data.sql
谢谢你的帮助

另一位开发人员针对数据集运行了此perl脚本。我认为撇号是一个“聪明的引语”。这个脚本删除了所有非ascii字符,之后就可以工作了。也许它会帮助其他人

perl -i.bak -pe 's/[^[:ascii:]]//g' data.sql


该列定义为varchar(2)还是类似的?将“brand”列设置为varchar(150)键
brand
是否定义为长度2?如何检查键长度?我使用SQLYG创建了这个表,刚刚为品牌表中品牌的itkey_len分配了一个唯一的索引是752是定义为varchar(2)的列还是类似的?将“brand”列设置为varchar(150)是长度为2定义的键
品牌
?如何检查键长度?我使用SQLYog创建了这个表,并为itkey_len分配了一个唯一的索引,因为brands表中的brand是752Good catch!但是,我已经将add函数中的exists检查更改为使用$data['brand'],但它仍然抛出相同的错误。只是为了确保,作为测试,您正在尝试插入数据库中已经存在的记录。您是否测试了独立于
add
函数的
exists
函数?顺便问一下,
$query->row()->id
中的值是什么样子的?它与直接插入到表中的L'awlek一起工作。但是,如果插入了L'awlek,则当L'awlek或L'awlek作为参数传入时,exists返回false。$query->row()->id值是整数,它在打破这条记录之前通过了数千条记录,并且有几条非问题记录中包含了。捕捉得好!但是,我已经将add函数中的exists检查更改为使用$data['brand'],但它仍然抛出相同的错误。只是为了确保,作为测试,您正在尝试插入数据库中已经存在的记录。您是否测试了独立于
add
函数的
exists
函数?顺便问一下,
$query->row()->id
中的值是什么样子的?它与直接插入到表中的L'awlek一起工作。但是如果插入了L'awlek,则当L'awlek或L'awlek作为参数传入时,exists返回false。$query->row()->id值是整数,它在打破这条记录之前通过了数千条记录,并且有几条非问题记录中包含了。这样做,一个非标准字符。。。问题解决了!那就行了,一个非标准的角色。。。问题解决了!