【问题标题】:FuelPHP form field value converts some character into HTML entitiesFuelPHP 表单字段值将某些字符转换为 HTML 实体
【发布时间】:2012-04-24 14:41:29
【问题描述】:

我在 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'] : '')); ?> 

最奇怪的是,这只发生在从用户表 ($user-&gt;profile_fields['firstname']) 中的profile_fields DB 字段读取值的表单字段中。 Profile_fields 是 SimpleAuth 驱动程序使用的用户表中的标准 MySQL 文本字段。该字段包含用户信息的序列化键=>值对,例如名字,姓氏,地址等...如果我从数据库中的非序列化字段中读取相同的值并使用该值创建表单字段,那么它将正确显示.

我在我的数据库设置中使用utf8_unicode_ci 排序规则和编码,并且FuelPHP 语言环境和编码也正确设置为UTF-8

更新1: 看看这个:

//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 有这个问题吗……我完全迷路了!

【问题讨论】:

    标签: forms encoding html-entities fuelphp


    【解决方案1】:

    你必须非常清楚自己在做什么。

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

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

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

    所以:

    • 将变量传递给视图而不进行编码(可能很危险!)
    • 按照 Frank 的描述禁用准备
    • 升级到最新的 1.1/develop 分支,默认禁用双重编码

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 是的,我知道,但是对于我从非序列化字段中从数据库中读取值的所有其他形式,它们显示正常,我没有这个问题。这只是从用户表 profile_fields 字段读取和设置表单值时的问题,其中数据正在被序列化!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-30
      • 2017-07-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多