0

我在 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_fieldsDB 字段读取值的表单字段中。是 SimpleAuth 驱动程序使用的用户表中的标准 MySQL 文本字段。该字段包含用户信息的序列化键=>值对,例如名字,姓氏,地址等...如果我从数据库中的非序列化字段中读取相同的值并使用该值创建表单字段,那么它将正确显示.$user->profile_fields['firstname']Profile_fields

我在我的数据库设置中使用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 中是否存在这个问题……我完全迷失了!

4

2 回答 2

2

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

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

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

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

所以:

  • 将变量传递给视图而不进行编码(可能很危险!)
  • 按照弗兰克的描述禁用准备
  • 升级到最新的 1.1/develop 分支,默认禁用双重编码
于 2012-04-25T20:24:42.450 回答
0

出于安全原因,通常在输出时对特殊字符进行编码。如果您将表单 condig 参数设置prep_valuefalse或为输入字段提供 attr ,则可以将其关闭"dont_prep" => true

于 2012-04-24T21:38:12.373 回答