web-dev-qa-db-ja.com

隠しフィールドを介して配列を渡す方法

ここに私のコード

_$order[$j][0]="Euclidean Geomethiyil Kodpagugal";
$order[$j][1]=$q16;
$j++;
_

隠しフィールド

_<input type="hidden" name="hdnTotal" value="<?php echo $gtot; ?>">
<input type="hidden" name="hdnOrder" value="<?php echo $order; ?>">
<input type="submit" value="Place Order">
_

hdnTotal値は次のページに表示されますが、hdnOrderは表示されません。 print($_POST['hdnOrder'])画面にArrayのみを印刷します。

19
ppp

配列をシリアル化するか、多くの隠しフィールドを使用できます。または、これをセッションに保存します。

アレイのシリアル化

serialize には、1つの非表示フィールドのみを使用します。これは、配列に非スカラーデータが含まれる場合に便利な手法です。

 $data=serialize($order); 
 $encoded=htmlentities($data);
 echo '<input type="hidden" name="order" value="'.$encoded.'">';

この値が戻ってきたら、配列を元に戻すために nserialize にする必要があります。簡単ですが、セキュリティハッシュなど、改ざんを防ぐための追加のメカニズムがない限り、これはお勧めしません。そうでなければ、誰でも好きなPHPデータ構造を挿入できます!

ハッシュは次のように実行できます。

 $data=serialize($order); 
 $encoded=htmlentities($data);
 $hash=md5($encoded.'SecretStringHere');
 echo '<input type="hidden" name="order" value="'.$encoded.'">';
 echo '<input type="hidden" name="order_hash" value="'.$hash.'">';

ここで、データが戻ってきたら、シリアル化を解除する前に、ハッシュを再度生成し、フォームのハッシュ値と一致することを確認します。一致しない場合、誰かがデータを改ざんしました。一致する場合、データを生成したものは何でもあなたの秘密の文字列を知っていることを知っています。あなただけのはずです!

最後に、Javascriptが配列データを理解するのに役立つ場合は、JSONを使用してください encode /- decode PHP適切な。

複数の非表示フィールド

スカラー値で構成される単純な配列を想定すると、多くの隠しフィールドを使用できます

 foreach($order as $idx=>$value)
 {
      $name=htmlentities('order['.$idx.']');
      $value=htmlentities($val);
      echo '<input type="hidden" name="'.$name.'" value="'.$value.'">';

 }

これには、PHPが これを配列として自動的に再作成 するという利点があります。

配列は2次元であるため、この手法を使用するには、2次元目の内部ループが必要です。読者のための演習....

セッションを使用する

おそらく、3つの中で最も簡単です。..

session_start();

$_SESSION['order']=$order;

設定すると、session_start()を呼び出した後に配列が使用可能になります。これには、サーバーから離れることはないという利点がありますが、もちろん一定期間非アクティブになると消えます(24分がデフォルトです)

42
Paul Dixon

単一フィールドへのシリアル化の代替ソリューションは、複数の非表示フィールドへのシリアル化です。これを行う汎用関数を作成しました。この関数と例は GistHubのGistサービス で管理されています。そこで最新バージョンを確認しますが、便宜上ここにコピーします。

<?php
# https://Gist.github.com/eric1234/5802030

function array_to_input($array, $prefix='') {
  if( (bool)count(array_filter(array_keys($array), 'is_string')) ) {
    foreach($array as $key => $value) {
      if( empty($prefix) ) {
        $name = $key;
      } else {
        $name = $prefix.'['.$key.']';
      }
      if( is_array($value) ) {
        array_to_input($value, $name);
      } else { ?>
        <input type="hidden" value="<?php echo $value ?>" name="<?php echo $name?>">
      <?php }
    }
  } else {
    foreach($array as $item) {
      if( is_array($item) ) {
        array_to_input($item, $prefix.'[]');
      } else { ?>
        <input type="hidden" name="<?php echo $prefix ?>[]" value="<?php echo $item ?>">
      <?php }
    }
  }
}

以下に使用例を示します。

基本的な連想配列

echo array_to_input(array('foo' => 'bar', 'cat' => 'dog'));

出力されます:

<input type="hidden" value="bar" name="foo">
<input type="hidden" value="dog" name="cat">

ネストされたインデックス付き配列を持つ連想配列

echo array_to_input(array('foo' => 'bar', 'cat' => 'dog', 'list' => array('a', 'b', 'c')));

出力されます:

<input type="hidden" value="bar" name="foo">
<input type="hidden" value="dog" name="cat">
<input type="hidden" name="list[]" value="a">
<input type="hidden" name="list[]" value="b">
<input type="hidden" name="list[]" value="c">

ネストされた連想配列を持つ連想配列

echo array_to_input(array('foo' => array('bar' => 'baz', 'a' => 'b'), 'cat' => 'dog'));

出力されます:

<input type="hidden" value="baz" name="foo[bar]">
<input type="hidden" value="b" name="foo[a]">
<input type="hidden" value="dog" name="cat">

夢中になる

echo array_to_input(array('a' => array('b' => array('c' => array('d' => 'e')))));

出力されます:

<input type="hidden" value="e" name="a[b][c][d]">
10
Eric Anderson

json_encode を試してください:

<input type="hidden" name="hdnTotal" value="<?php echo htmlspecialchars(json_encode($gtot)); ?>">
<input type="hidden" name="hdnOrder" value="<?php echo htmlspecialchars(json_encode($order)); ?>">
<input type="submit" value="Place Order">

そしてそれを取り戻すには、 json_decode

print(json_decode($_POST['hdnOrder']));

このソリューションの利点は、JavaScriptを使用してクライアント側でアレイを簡単に操作できることです。

しかし、なぜそれをしたいのですか?

クライアント側でデータを操作するためではない場合は、データの不要なラウンドトリップを作成します。これは、 PHPセッション で簡単にサーバー側に保持できます。

8
Pascal Qyy

非スカラー値がある場合は、それらをシリアル化および非シリアル化する必要があります。複数のオプションがあります:

  1. PHPの serialize および nserialize
  2. JSON エンコード および デコード

一般的なルールとして、HTMLに値を入力する場合は、HTMLの特殊文字 encode を使用する必要があります。

使用事例:

<?php
$arr = unserialize($_REQUEST['arr']);
?>
<input type="hidden" name="arr" value="<?php echo htmlentities(serialize($arr)); ?>" />
4
Alin Purcaru

このフォームはどこに行くのですか?なぜフォームの一部として多次元配列を渡す必要があるのですか?

これを行う方法は、フォームを受け取るページを制御するかどうかによって異なります。その場合、いくつかのオプションがあります。

1)PHPのserialize関数を使用して配列を文字列にシリアル化し、次にunserialize $ _POST ['order']を使用して元の配列を取得します

2)生成する必要があるフォームフィールドの配列に渡します

<input type="hidden" name="hdnOrder[0][0]" value="Something" />
<input type="hidden" name="hdnOrder[0][1]" value="Something else" />

フォームを制御しない場合、送信しようとしているものは、おそらくhdnOrderで特定の何かを期待しています...それは何ですか?

1
Dan Grossman