我在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'] : '')); ?>
最奇怪的是,这只发生在表单字段中,其中值是从用户表(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实体的原因。
输出:
这是DB,PHP,FuelPHP中的问题......我在这里完全迷失了!
答案 0 :(得分:2)
你必须非常清楚地看到你在做什么。
默认情况下,FuelPHP在输出上进行编码,这意味着您发送到视图的所有数据都将进行html编码。在这种情况下,将从控制器发送到视图的$ user将被编码。
您的$ test2数组是在视图内创建的,因此不会被编码。
现在,当你在Form :: input()中使用$ user的值时,该值将被准备好(正如Frank正确提到的那样),它将再次编码。例如,“&amp; amp;”将被转换为“&amp; amp; amp;”,并将导致您描述的行为。如果您手动编码来自$ user的值,则相同,如示例所示。
所以:
答案 1 :(得分:0)
出于安全原因,通常在输出上编码特殊字符。如果您将表单condig param prep_value
设置为false
,或者为输入字段提供"dont_prep" => true
的attr,则可以将其关闭。