Значение поля формы FuelPHP преобразует некоторые символы в объекты HTML

У меня странное поведение в 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']). Profile_fields — это стандартное текстовое поле MySQL в пользовательской таблице, используемое драйвером SimpleAuth. Это поле содержит сериализованные пары ключ => значение информации о пользователе, такие как имя, фамилия, адрес и т. д. Если я прочитаю одно и то же значение из несериализованного поля в БД и создам поле формы с этим значением, тогда оно будет отображаться правильно .

Я использую сопоставление и кодировку 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 использует его при создании поля формы и является причиной преобразования некоторых символов в объекты HTML.

выход:

введите здесь описание изображения

Эта проблема в DB, ​​PHP, FuelPHP... Я здесь совершенно потерялся!


person Primoz Rome    schedule 24.04.2012    source источник


Ответы (2)


Вы должны очень четко смотреть на то, что вы делаете.

FuelPHP по умолчанию кодирует на выходе, что означает, что все данные, которые вы отправляете в представление, будут закодированы в формате html. В этом случае $user, который отправляется из контроллера в представление, будет закодирован.

Ваш массив $test2 создается ВНУТРИ представления и поэтому не будет закодирован.

Теперь, когда вы используете значение $user в Form::input(), значение будет предварительно подготовлено (как правильно заметил Фрэнк), которое снова будет кодироваться. Например, "" будет преобразовано в "amp;" и приведет к описанному вами поведению. То же самое, если вы вручную кодируете значение из $user, как показывает ваш пример.

So:

  • передать переменную в представление без кодирования (может быть опасно!)
  • отключить подготовку, как описал Фрэнк
  • обновиться до последней ветки 1.1/develop, в которой по умолчанию отключено двойное кодирование
person WanWizard    schedule 25.04.2012

Обычно специальные символы кодируются на выходе из соображений безопасности. Вы можете отключить это, если установите для параметра формы prep_value значение false или укажите в поле ввода атрибут "dont_prep" => true.

person Frank de Jonge    schedule 24.04.2012
comment
да, я знаю это, но для всех других форм, где я читаю значения из базы данных из несериализованных полей, они отображают ОК, и у меня нет этой проблемы. Это проблема только при чтении и установке значений формы из поля profile_fields пользовательской таблицы, где данные сериализуются! - person Primoz Rome; 25.04.2012