2012-04-24 7 views
0

FuelPHPで奇妙な動作があります。 FuelPHP Form :: input()メソッドでフォームフィールドを生成します。問題は、一部の文字がHTMLエンティティに変換されることです。たとえば、文字ššに変換されます。フォームフィールド生成コードは下にあり、出力は画像上で見ることができます(最初の出力は単純なhtmlテキストです)。FuelPHPフォームのフィールド値が一部の文字を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 DBフィールドから読み出されたフォームフィールド($user->profile_fields['firstname'])で行われています。 Profile_fieldsは、SimpleAuthドライバで使用されるユーザテーブルの標準MySQLテキストフィールドです。このフィールドは、firstname、lastname、addressなどのユーザー情報のシリアル化されたkey => valueのペアを保持します... DB内の非シリアル化フィールドから同じ値を読み取り、この値を持つフォームフィールドを作成すると、正しく表示されます。

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

あなたは何をしているのかをはっきりと見なければなりません。

FuelPHPはデフォルトで出力にエンコードされます。つまり、ビューに送信するすべてのデータはhtmlエンコードされます。この場合、コントローラからビューに送信される$ userがエンコードされます。

$ test2配列がビューの内側に作成されるため、エンコードされません。

これで、Form :: input()で$ userの値を使用すると、その値は(Frankが正しく言及したように)準備され、再度エンコードされます。一例として、 "& amp;" 「& amp; amp;」に変換され、あなたが記述した動作につながります。例のように、$ userの値を手動でエンコードする場合と同じです。

だから:

  • はエンコードせずにビューに変数を渡す(危険なことかもしれません!)フランクとして準備中
  • 無効には、最新の1に
  • アップグレードを説明しました。1/2つのエンコーディングがデフォルトで無効になっているブランチを展開する
0

通常、セキュリティ上の理由から、特殊文字は出力時にエンコードされます。 condigパラメータのフォームをprep_valueに設定してfalseに設定するか、または入力フィールドのattrに"dont_prep" => trueを指定すると、これをオフにすることができます。

+0

はい私は知っていますが、他のすべてのフォームでは、非シリアル化フィールドからデータベースから値を読み込み、OKと表示しません。この問題。これは、データがシリアル化されているユーザーテーブルのprofile_fieldsフィールドからフォームの値を読み取り設定する場合にのみ問題になります。 –

関連する問題