2010-08-18 118 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的編碼創建的。 確保數據庫和表格編碼正確,然後確保您實際使用此設置,以防您定義了多個數據庫連接。