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_fields最も奇妙なことは、これがユーザー テーブルの DB フィールドから値が読み取られるフォーム フィールドでのみ発生することです( $user->profile_fields['firstname'])。Profile_fieldsSimpleAuth ドライバーが使用するユーザー テーブルの標準の MySQL テキスト フィールドです。このフィールドには、名、姓、住所などのユーザー情報のシリアル化されたキー=>値のペアが保持されます... DBのシリアル化されていないフィールドから同じ値を読み取り、この値でフォームフィールドを作成すると、正しく表示されます.

utf8_unicode_ciDBセットアップで照合とエンコーディングを使用し、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

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

于 2012-04-24T21:38:12.373 に答える