здесь мой код
$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
на экране.
Вы можете либо сериализовать массив, либо использовать множество скрытых полей. Кроме того, сохраните это в сеансе.
Для сериализации вы будете использовать только одно скрытое поле. Это полезный метод, если ваш массив содержит нескалярные данные.
$data=serialize($order); $encoded=htmlentities($data); echo '<input type="hidden" name="order" value="'.$encoded.'">';
Когда это значение вернется, вам нужно неэтериализовать его, чтобы вернуть ваш массив. В то время как легко, я бы не рекомендовал это, если у вас нет какого-либо дополнительного механизма для предотвращения несанкционированного доступа, например, хэша безопасности, иначе любой может внедрить любую структуру данных 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-функций кодирования / декодирования PHP будет более уместным.
Предполагая простой массив, состоящий из скалярных значений, вы можете использовать множество скрытых полей
foreach($order as $idx=>$value) { $name=htmlentities('order['.$idx.']'); $value=htmlentities($val); echo '<input type="hidden" name="'.$name.'" value="'.$value.'">'; }
Это имеет то преимущество, что PHP автоматически воссоздает это как массив для вас.
Поскольку ваш массив 2-мерный, для использования этой техники вам понадобится внутренний цикл для второго измерения. Упражнение для читателя ….
Возможно, самый легкий из трех …
session_start(); $_SESSION['order']=$order;
После установки массив доступен после вызова session_start (). Это имеет то преимущество, что он никогда не покидает сервер, но, конечно, исчезнет после периода бездействия (24 минуты по умолчанию)
Альтернативным решением для сериализации в одном поле является сериализация нескольких скрытых полей. Я написал общую функцию для этого. Эта функция и примеры управляются в GistHub's 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.
Случай использования:
<?php $arr = unserialize($_REQUEST['arr']); ?> <input type="hidden" name="arr" value="<?php echo htmlentities(serialize($arr)); ?>" />
Куда идет эта форма и зачем нужен многомерный массив, который должен быть передан как часть формы?
Как вы это сделаете, зависит от того, управляете ли вы страницей, получающей форму. Если вы это сделаете, у вас есть пара вариантов:
1) Сериализуйте массив в строку с помощью функции serialize
PHP, затем unserialize
$ _POST ['order'], чтобы вернуть исходный массив
2) Передайте его через массив полей формы, которые вам нужно будет генерировать
<input type="hidden" name="hdnOrder[0][0]" value="Something" /> <input type="hidden" name="hdnOrder[0][1]" value="Something else" />
Если вы не контролируете форму, то все, что вы отправляете, вероятно, ожидает что-то конкретное в hdnOrder … что это?
По звукам вы просто хотите передать данные с одной страницы формы на другую. Если это так, используйте сеанс PHP. Это намного проще реализовать, более эффективно и безопаснее.