ここに私のコード
_$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
のみを印刷します。
配列をシリアル化するか、多くの隠しフィールドを使用できます。または、これをセッションに保存します。
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分がデフォルトです)
単一フィールドへのシリアル化の代替ソリューションは、複数の非表示フィールドへのシリアル化です。これを行う汎用関数を作成しました。この関数と例は 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]">
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セッション で簡単にサーバー側に保持できます。
非スカラー値がある場合は、それらをシリアル化および非シリアル化する必要があります。複数のオプションがあります:
一般的なルールとして、HTMLに値を入力する場合は、HTMLの特殊文字 encode を使用する必要があります。
使用事例:
<?php
$arr = unserialize($_REQUEST['arr']);
?>
<input type="hidden" name="arr" value="<?php echo htmlentities(serialize($arr)); ?>" />
このフォームはどこに行くのですか?なぜフォームの一部として多次元配列を渡す必要があるのですか?
これを行う方法は、フォームを受け取るページを制御するかどうかによって異なります。その場合、いくつかのオプションがあります。
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で特定の何かを期待しています...それは何ですか?