我在Kohana中使用ORM时遇到了一些问题,特别是当我在我的数据库中尝试使用特殊字符(西班牙语重音符)插入/更新数据时。
注意:我的数据库设置为UTF-8 Charset,这不是问题,请继续阅读:
这是我用来在我的模型中保存数据的功能:
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á(只保存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á(包括西班牙语重音)。
现在,我为此做了一个“解决方案”,但是,我相信有一种方法可以解决我的问题(这就是我在这里的原因)。我在模型中添加了一个过滤器来修复所有数据,然后将其保存到数据库中,例如:
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转换它)。
希望你明白我要做的事情。我疯狂地搜索,这个案子很奇怪......
非常感谢您阅读本文。
度过愉快的一天。
答案 0 :(得分:0)
通过以下方式检查插入values
的ORM对象:
$this->values($data);
var_dump($this);
这是save_data
方法的结尾。您应该在ORM对象的私有$_object
属性中看到已分配的(尚未保存的数据)。
答案 1 :(得分:0)
您是否验证过用户输入是UTF-8?有时浏览器会发送以您尚未准备接收的格式编码的数据。