2012-04-24 100 views
0

我在FuelPHP奇怪的行爲。我用FuelPHP Form :: input()方法生成表單域。問題是有些字符被轉換成HTML實體。例如,字符š被轉換爲š。表單字段生成代碼可以在下面看到,輸出可以在圖片上看到(第一個輸出只是純HTML文本)。FuelPHP表單字段值某些字符轉換成HTML實體

<?php echo $user->profile_fields['firstname']; ?> 
<?php echo Form::input('firstname', Input::post('firstname', isset($user->profile_fields['firstname']) ? $user->profile_fields['firstname'] : '')); ?> 

enter image description here

最奇怪的是這只是發生在所述值是從在用戶表profile_fields DB字段($user->profile_fields['firstname'])讀出的表單字段。 Profile_fields是SimpleAuth驅動程序使用的用戶表中的標準MySQL文本字段。這個字段保存序列化的key =>值對,如名字,姓氏,地址等用戶信息...如果我從DB中的非序列化字段讀取相同的值並使用此值創建表單字段,則它將正確顯示。

我用utf8_unicode_ci整理和編碼在我的數據庫設置,FuelPHP語言環境和編碼也正確設置爲UTF-8

UPDATE1: 看看這個:

//values read from MySQL DB, via FuelPHP orm, unserialized 
echo $user->profile_fields['firstname'] . ' ' . $user->profile_fields['lastname']; 
echo '<br>'; 

//same values serialized and assigned to PHP array var 
$test = serialize(array('firstname'=>'Urška', 'lastname'=>'Neumüller')); 
var_dump($test); 

echo '<br>'; 
$test2 = unserialize($test); 
var_dump($test2); 

echo '<br>'; 
echo '<input type="text" value="'.$test2['firstname'].'">'; 
echo '<input type="text" value="'.$test2['lastname'].'">'; 

echo '<br>'; 
echo '<input type="text" value="'.htmlspecialchars($test2['firstname']).'">'; 
echo '<input type="text" value="'.htmlspecialchars($test2['lastname']).'">'; 

echo '<br>'; 
echo '<input type="text" value="'.$user->profile_fields['firstname'].'">'; 
echo '<input type="text" value="'.$user->profile_fields['lastname'].'">'; 

echo '<br>'; 
echo '<input type="text" value="'.htmlspecialchars($user->profile_fields['firstname']).'">'; 
echo '<input type="text" value="'.htmlspecialchars($user->profile_fields['lastname']).'">'; 

htmlspecialchars在這裏使用,因爲FuelPHP Form類生成表單字段,並轉換成HTML實體某些字符的原因時使用它。

輸出:

enter image description here

是在DB,PHP,FuelPHP這個問題......我完全失去了這裏!

回答

2

你必須在你在做什麼很清楚的樣子。

FuelPHP默認編碼輸出,這意味着你發送到一個視圖中的所有數據都將HTML編碼。在這種情況下,從控制器發送到視圖的$ user將被編碼。

你$ TEST2陣列內部的視圖創建的,因此將不進行編碼。

現在,當您在Form :: input()中使用$ user的值時,該值將被準備好(正如Frank正確提到的),該值將再次編碼。例如,「& amp;」將被轉換爲「& amp;」,並且會導致你描述的行爲。如果您手動對來自$ user的值進行編碼,如您的示例所示。

所以:

  • 變量傳遞給視圖不編碼(可能是危險的!)
  • 禁用躍躍欲試弗蘭克描述
  • 升級到最新1。1 /開發分支,它在默認情況下禁用
0

正常情況下的特殊字符編碼輸出,出於安全原因。如果設置形式condig PARAM prep_valuefalse或提供輸入字段的"dont_prep" => true生成的attr你可以把它們關掉。

+0

是的,我知道這一點,但對於所有其他形式的,我從非序列化字段數據庫中讀取的值,然後他們顯示OK,我沒有雙重編碼這個問題。從用戶表profile_fields字段中讀取和設置表單值時,這只是問題,數據正在被序列化! – 2012-04-25 10:09:28

相關問題