2012-04-24 102 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

相关问题