2013-03-26 66 views
1

我正在嘗試導入一些數據與codeigniter使用activerecord。我得到這個錯誤,因爲我不想重複這沒有任何意義,我Mysql重複輸入之前撇號

<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; 
    } 
} 
+2

該列是否定義爲varchar(2)或類似的東西? – Joni 2013-03-26 16:36:21

+0

「品牌」列設置爲varchar(150) – Gorving 2013-03-26 16:37:59

+0

是否定義了長度爲2的關鍵「品牌」? – Joni 2013-03-26 16:39:53

回答

0

感謝您的幫助!

一位開發人員針對數據集運行了這個perl腳本。我假設撇號是一個'聰明的報價'。該腳本刪除所有非ASCII字符,並在事後處理。也許它會幫助別人。

​​
+1

這樣做,一個非標準的人物......問題解決了! – 2013-03-27 15:51:50

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')); 

這就是爲什麼你的查詢返回,因爲「陣」假是不是在你的表的一個品牌。

PS
有可能是其他的東西去上取決於事件導致到您的通話功能的序列,但是這個明顯的bug應該尋找其他更微妙的問題之前確定。

+0

好趕上!不過,我已經改變了添加函數中的存在檢查以使用$ data ['brand'],但它仍然拋出相同的錯誤。 – Gorving 2013-03-26 17:23:46

+0

只是爲了確保,作爲測試,您試圖插入已存在的記錄就是數據庫。你是否獨立於'add'函數測試了'exists'函數? – 2013-03-26 17:59:32

+0

順便問一下,$ query-> row() - > id'的值是什麼樣的? – 2013-03-26 18:07:44