2013-03-26 2 views
1

Я пытаюсь импортировать некоторые данные с помощью codeigniter, используя activerecord. Я получаю эту ошибку, которая не имеет никакого смысла для меняMysql Duplicate Entry Before Apostrophe

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

У меня есть 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; 
    } 
} 
+2

Является ли столбец обозначенным как varchar (2) или что-то подобное? – Joni

+0

Столбец «бренд» установлен на varchar (150) – Gorving

+0

Является ли ключевой 'бренд' определяемым длиной 2? – Joni

ответ

0

Спасибо за помощь!

Совместный разработчик выполнил этот скрипт perl против набора данных. Я предполагаю, что апостроф был «умной цитатой». Этот скрипт удаляет все символы, отличные от ascii, и после этого он работал. Может быть, это поможет кому-то другому.

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

Это сделало бы это, нестандартный символ ... проблема решена! –

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
Там могут быть и другие вещи, происходящие в зависимости от последовательности событий, приводящих к вызывая ваши функции, но это очевидно, ошибка должна быть исправлена, прежде чем искать другие, более тонкие проблемы.

+0

Хорошая добыча! Тем не менее, с тех пор я изменил проверку наличия в функции add для использования $ data ['brand'], но она по-прежнему вызывает ту же ошибку. – Gorving

+0

Просто чтобы убедиться, что в качестве теста вы пытаетесь вставить уже существующую запись, это база данных. Вы тестировали функцию 'exist' независимо от функции' add'? –

+0

Кстати, как выглядят значения из '$ query-> row() -> id'? –