Подтвердить что ты не робот

Как передать массив через скрытое поле

здесь мой код

$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 на экране.

4b9b3361

Ответ 1

Вы можете либо сериализовать массив, либо использовать множество скрытых полей. Кроме того, сохраните это в сеансе.

Сериализация массива

В serialize вы будете использовать только одно скрытое поле. Это полезный метод, если ваш массив содержит нескалярные данные.

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

Когда это значение вернется, вам нужно unserialize его вернуть ваш массив. Хотя я просто не рекомендую это, если у вас нет дополнительного механизма для предотвращения несанкционированного доступа, например, хэша безопасности, иначе любой может внедрить любую структуру данных 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-мерный, для использования этой техники вам понадобится внутренний цикл для второго измерения. Упражнение для читателя....

Использование сеанса

Возможно, самый простой из трех....

session_start();

$_SESSION['order']=$order;

После установки массив доступен после вызова session_start(). Преимущество этого заключается в том, что он никогда не покидает сервер, но, конечно, исчезнет после периода бездействия (24 минуты по умолчанию)

Ответ 2

Альтернативным решением для сериализации в одном поле является сериализация нескольких скрытых полей. Я написал общую функцию для этого. Эта функция и примеры управляются в службе 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">

Перейти Crazy

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

Будет выводиться:

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

Ответ 3

Попробуйте 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-сессии.

Ответ 4

Если у вас есть нескалярные значения, вы должны сериализовать и неэтериализовать их. У вас есть несколько вариантов:

Как правило, если вы помещаете какое-либо значение в HTML, вам нужно кодировать свои специальные символы HTML.

Случай использования:

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

Ответ 5

Где эта форма идет и зачем нужен многомерный массив, который должен быть передан как часть формы?

Как вы это сделаете, зависит от того, управляете ли вы страницей, получающей форму. Если вы это сделаете, у вас есть пара вариантов:

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... что это такое?

Ответ 6

Из звуков вы просто хотите передать данные с одной страницы формы на другую. Если это так, используйте сеанс PHP. Это намного проще реализовать, более эффективно и безопаснее.