0

我在 Kohana 中使用 ORM 时遇到了一些问题,特别是当我尝试在我的数据库中插入/更新具有特殊字符(西班牙口音)的数据时。

注意:我的数据库设置为 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);
}

一切都很好,但是,最大的问题是当某些字段带有重音符号时,例如:妈妈只保存妈妈??在我的桌子上,包括单词末尾的两个问号)。

现在,如果我使用的是 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 转换它)。

希望你明白我想要做什么。我疯狂地搜索,这个案子很奇怪......

非常感谢您阅读本文。

祝你今天过得愉快。

4

2 回答 2

0

检查通过以下方式插入的 ORM 对象values

$this->values($data);

var_dump($this);

它在你的save_data方法的最后。$_object您应该在ORM 对象的私有属性中看到您分配的(尚未保存的数据) 。

于 2012-09-03T06:32:14.320 回答
0

您是否验证了用户输入是 UTF-8 格式的?有时浏览器会发送以您尚未准备好接收的格式编码的数据。

于 2012-09-06T17:39:30.783 回答