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

$data配列を関数に渡していると思いますadd

で、配列を関数にadd渡します。$dataexists

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

'Array'はテーブル内のブランドではないため、クエリがfalseを返すのはこのためです。

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 に答える