2010-08-18 70 views
0

我试图从CakePHP中的窗体中将一些值保存到MySQL数据库中,并且当值进入数据库时​​,它们将获得HTML编码。CakePHP将值作为HTML编码值保存到MySQL数据库

因此,像(#45)这样的东西被存储在数据库中作为(#45 )然后当有人试图返回并编辑表单时,他们会看到所有额外的字符。

我已经尝试设置数据库连接上的编码为utf8这样的:

private $production = array(
    'driver' => 'mysql', 
    'persistent' => true, 
    'host' => 'localhost:3306', 
    'login' => '', 
    'password' => '', 
    'database' => 'db', 
    'prefix' => '', 
    'encoding' => 'utf8' 
); 

和我的配置有这一套:

Configure::write('App.encoding', 'UTF-8'); 

,也添加到了我的默认布局:

echo $html->charset(); 

任何想法?

+1

什么是喜欢当值你在发布的数据上做一个print_r?它们在到达您的应用程序之前或之后是否会发生变化?我的猜测是,你可以抛出一个HTML解码方法来解决这个问题,但我不是100%。 – 2010-08-18 21:51:37

+0

不幸的是,发布的数据是通过没有html编码,它必须在更远的地方。 – Nick 2010-08-18 22:01:18

+0

你尝试过'html_entity_decode()' – 2010-08-19 12:40:49

回答

1

我发现编码发生在哪里。在AppModel类它调用::消毒不干净的“编码”设置为false

function beforeSave() { 
    if (!empty($this->data)) { 
     $this->data = Sanitize::clean($this->data, array('escape' => false, 'carriage' => true)); 
    }  
    return parent::beforeSave(); 
} 

一旦我设定编码为false,干净的方法,它的工作正确

function beforeSave() { 
    if (!empty($this->data)) { 
     $this->data = Sanitize::clean($this->data, array('escape' => false, 'carriage' => true, 'encode' => false)); 
    }  
    return parent::beforeSave(); 
} 
1

由于它是更进一步的下线,这应该很容易找出它发生的地方。调试PHP的一站式懒惰解决方案:

print_r($data); die; 

但是您可能已经这么做了。

+1

在Cake中你可以使用'pr($ data);' – NullUserException 2010-08-23 17:12:26

0

是UTF-8中的mysql本身吗?做一个MySQL的导出/转储,看看它在每个表后面说了什么!

1

我已经证实,到目前为止所做的所有设置(database.php,core.php,default.ctp)与我的完全相同(除非使用persistent = true,但这应该不是问题) 。将数据库以及每个表手动设置为utf8_unicode_ci(通过PHPmyAdmin)是我除此之外唯一完成的工作。
我认为后面的步骤甚至没有必要,因为表是根据db的编码创建的。 确保数据库和表格编码正确,然后确保您实际使用此设置,以防您定义了多个数据库连接。