0

ビュー$all_setにいくつかの ids を含む配列があります。今、フォーム submit.for を使用してこの配列をコントローラーに渡したいと思います。

私の見解では:

<?php $all_set=json_encode($all_set); ?>

<input type="hidden" name="all_set" value="<?php echo serialize($all_set); ?>">

上記の値には次が含まれます(ページソースで見たように):

<input type="hidden" name="all_set" value="s:26:"{"0":"1","5":"2","13":"3"}";">

今コントローラーで:

$result=$this->input->post('all_set');

           $result= unserialize($result);
           $result=json_decode($result);
           print_r($result); die;

これによりエラーが発生し、コントローラーで配列を取得できません。エラー:

Message: unserialize() [function.unserialize]: Error at offset 0 of 5 bytes

これはなぜですか?助けてください。

4

2 に答える 2

5

htmlspecialchars()シリアライズに追加する必要があります。

<input type="hidden" name="all_set" value="<?php echo htmlspecialchars(serialize($all_set)); ?>">

編集

なぜこれで問題が解決するのですか?最初に OP の引用された出力を見てみましょう。

value="s:26:"{"0":"1","5":"2","13":"3"}";">
      ^     ^

問題の原因をマークするために追加しまし^た-値には引用符が含まれていたため、ブラウザーはこの入力を次のように表示しなくなりました。

value="s:26:" {"0" "1" , "5" : "2","13":"3"}";">

一致する文字列が見つかったら、単純に文字列を閉じました"<HTML には、>&、などの特殊文字があり、"文字どおりに渡されることが予想される場合はエンティティに変換する必要があります。を呼び出すhtmlspecialchars()ことで、これらすべての文字を変換すると、マークアップは次のようになります。

value="s:26:&quot;{&quot;0&quot;:&quot;1&quot;,&quot;5&quot;.....

ブラウザはそれを正しく解釈し、正しく表示し、正しく送り返しますが、マークアップの一部としては扱いません。

編集2

実際、シリアル化を解除することは、コードではまったく役に立ちません。serialize()/を完全に削除します。jsonunserialize()でエンコードされたデータは純粋な文字列なので、必要なのはhtmlspecialchars().

于 2012-11-21T14:57:57.017 に答える
1

試す

<input type="hidden" name="all_set" value="<?php echo base64_encode($all_set); ?>">

$result= base64_decode($result);
$result=json_decode($result);
于 2012-11-21T15:01:01.653 に答える