使用带有重音字符的学说保存字符串的安全方法

时间:2014-05-19 15:51:07

标签: codeigniter doctrine non-ascii-characters

我在一个用codeigniter + doctrine构建的简单webapp中有一个奇怪的(对我来说)行为。

我有一个本地apache服务器,我使用相同的代码共享托管,并且两个应用程序都连接到同一个数据库(托管在共享托管中)

此数据库具有UTF-8 Unicode字符集和utf8_general_ci排序规则。

所有表单和页面都有这样的元字符集。

<!DOCTYPE html>
<html lang="es" xml:lang="es">
<head>
    <meta charset="utf-8">

事情是,在一个服务器(让我们说本地)我放了类似“institució”的东西,我保存它,我可以看到它很好,但是,在另一台服务器(远程的)上,我看到像“instituci”这样的东西“

然后我去共享主机,我把这个词修改为“institució”然后我在本地服务器上看到这个单词显示为“institució”

我不能使用“utf8_decode”或“utf8_encode”,因为根据我保存此字符串的位置,我必须进行解码或编码。

我确定我错过了一些配置,但我不知道从哪里开始。

本地我已经安装了Mavericks的默认apache2服务器。

我检索帖子数据并将其保存到学说对象中,如下所示:

$question->setQuestion($this->input->post('question'));

我认为codeigniter和doctrine负责这一点。

谢谢!

1 个答案:

答案 0 :(得分:0)

解决!

我应该有更多的人。解决方案是为位于application / libraries / Doctrine / doctrine.php中的connectionOptions数组添加一个新选项

新选项名为driverOptions,它看起来像这样:

        'driverOptions' => array(
            1002=>'SET NAMES utf8'
        )

所以整个connectionOptions是这样的:

    // Database connection information
    $connectionOptions = array(
        'driver' => 'pdo_mysql',
        'user' => $db['default']['username'],
        'password' => $db['default']['password'],
        'host' => $db['default']['hostname'],
        'dbname' => $db['default']['database'],
        'charset' => 'utf8',
        'driverOptions' => array(
            1002=>'SET NAMES utf8'
        )
    );

这个新选项解决了我根据服务器具有不同行为的问题。

希望它可以帮助别人!