0

Kohana で ORM を使用する際に問題が発生しています。特に、データベースに特殊文字 (スペイン語のアクセント) を含むデータを挿入/更新しようとしている場合に発生します。

注: 私の DB は UTF-8 文字セットに設定されていますが、これは問題ではありません。読み続けてください:

これは、モデルにデータを保存するために使用している関数です。

class Model_Colaborador extends ORM {

    protected $_table_name = 'colaboradores';

    public function save_data($data, $id = 0)
    {
        if (empty($data))
            exit();

        $date = Date::formatted_time();

        $data['fecha_actualizacion'] = $date;

        if (empty($id))
            $data['fecha_creacion'] = $date;

        $data['estatus'] = 'active';

        if ( ! empty($id))
        {
            $this->where($this->_primary_key, '=', $id)->find();
            if ( ! $this->loaded())
                exit();
        }

        return $this->values($data)->save();

    }

}

コントローラーでデータを保存/更新するには、これを使用します。

public function action_save()
{
     $id = $this->request->param('id');
     $data = $this->request->post();     // From the form

     Model::factory('colaborador')->save_data($data, $id);
}

すべてうまく機能しますが、大きな問題は、一部のフィールドにアクセントが付いている場合です。たとえば、Mamá (私のテーブルでは、単語の末尾にある 2 つの疑問符を含めて、Mam?? のみを保存します)。

今、DB クラスを使用している場合は完璧に動作します。例えば:

class Model_Colaborador extends ORM {

    protected $_table_name = 'colaboradores';

    public function save_data($data, $id = 0)
    {
        if (empty($data))
            exit();

        $date = Date::formatted_time();

        $data['fecha_actualizacion'] = $date;

        if (empty($id))
            $data['fecha_creacion'] = $date;

        $data['estatus'] = 'active';

        // Only an Insert for the example
        DB::insert($this->_table_name, array_keys($data))->values($data)->execute();

    }

}

現在、データは正しい形式で保存されています。たとえば、Mamá (スペイン語のアクセントを含む) です。


さて、私はこれに対して「解決策」を実行しましたが、私の問題を解決する方法があると信じています (これが私がここにいる理由です)。モデルにフィルターを追加して、DB に保存する前にすべてのデータを修正しました。次に例を示します。

public function filters()
{
        return array(
            TRUE => array(
                array('trim'),
                array(array($this, 'encoding'))
            ),
        );
}

カスタム フィルターのコールバックは次のとおりです。

public function encoding($value)
{
        return mb_convert_encoding($value, 'HTML-ENTITIES', 'UTF-8');  // Using mbstring
}

そして、データは次のように私のデータベースに保存されます: Mam & eacute ; (スペースがなければ、stackoverflow で変換します)。

私がやろうとしていることを理解していただければ幸いです。私は狂ったように検索しましたが、このケースはかなり奇妙です....

これを読んでくれてありがとう。

良い1日を。

4

2 に答える 2

0

ユーザー入力が UTF-8 であることを確認しましたか? ブラウザは、受信する準備ができていない形式でエンコードされたデータを送信する場合があります。

于 2012-09-06T17:39:30.783 に答える
0

values以下によって挿入された ORM オブジェクトを検査します。

$this->values($data);

var_dump($this);

それはあなたの方法の終わりにありますsave_data$_objectORM オブジェクトのプライベート プロパティに、割り当てられた (まだ保存されていない) データが表示されます。

于 2012-09-03T06:32:14.320 に答える