FuelPHP表单字段值将某些字符转换为HTML实体

时间:2012-04-24 14:41:30

标签: forms encoding html-entities fuelphp

我在FuelPHP中有奇怪的行为。我使用FuelPHP Form :: input()方法生成表单字段。问题是某些字符会转换为HTML实体。例如,字符š会转换为š。表单字段生成代码可以在下面看到,输出可以在图片上看到(第一个输出只是普通的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)中的$user->profile_fields['firstname'] DB字段读取的。 Profile_fields是SimpleAuth驱动程序使用的用户表中的标准MySQL文本字段。此字段包含序列化的key =&gt;值对,如firstname,lastname,address等用户信息...如果我从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 个答案:

答案 0 :(得分:2)

你必须非常清楚地看到你在做什么。

默认情况下,FuelPHP在输出上进行编码,这意味着您发送到视图的所有数据都将进行html编码。在这种情况下,将从控制器发送到视图的$ user将被编码。

您的$ test2数组是在视图内创建的,因此不会被编码。

现在,当你在Form :: input()中使用$ user的值时,该值将被准备好(正如Frank正确提到的那样),它将再次编码。例如,“&amp; amp;”将被转换为“&amp; amp; amp;”,并将导致您描述的行为。如果您手动编码来自$ user的值,则相同,如示例所示。

所以:

  • 将变量传递给视图而不进行编码(可能很危险!)
  • 如弗兰克描述的那样禁用预备
  • 升级到最新的1.1 / develop分支,默认情况下禁用双重编码

答案 1 :(得分:0)

出于安全原因,通常在输出上编码特殊字符。如果您将表单condig param prep_value设置为false,或者为输入字段提供"dont_prep" => true的attr,则可以将其关闭。