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日を。