HTML 양식 숨겨진 요소를 사용하여 배열 전달


80

숨겨진 필드에 배열을 게시하려고하는데 PHP에서 양식을 제출 한 후 해당 배열을 검색하고 싶습니다.

$postvalue = array("a", "b", "c");
<input type="hidden" name="result" value="<?php echo $postvalue; ?>">

하지만 게시 된 값을 인쇄 한 후 배열 문자열 만 얻습니다. 그렇다면 어떻게 해결할 수 있습니까?


1
어떤 식 으로든 직렬화해야합니다. serialize 및 json_encode 함수를 확인하십시오. json_encode를 사용하는 것이 좋습니다.
Gazler 2011-07-01

답변:


119

사용하다:

$postvalue = array("a", "b", "c");
foreach($postvalue as $value)
{
    echo '<input type="hidden" name="result[]" value="'. $value. '">';
}

그리고 당신은 $_POST['result']배열로 얻을 것 입니다.

print_r($_POST['result']);

따라서 배열 배열의 경우 이름이 name = "result [[]]"처럼 보일까요?
사무엘 Giftson

1
어쩌면이 같은 @SamuelGiftson name="result[][]"
Nurkartiko

38

이를 달성하는 데는 주로 두 가지 가능한 방법이 있습니다.

  1. 어떤 방식 으로든 데이터를 직렬화합니다.

    $postvalue = serialize($array); // Client side
    
    $array = unserialize($_POST['result']; // Server side
    

그런 다음 게시 된 값을 unserialize($postvalue). 이에 대한 자세한 정보는 여기 PHP 매뉴얼에 있습니다.

또는 json_encode()json_decode()함수를 사용하여 JSON 형식의 직렬화 된 문자열을 가져올 수 있습니다 . 전송 된 데이터를 축소 gzcompress()(성능 집약적 임)하고 전송 된 데이터를 보호 base64_encode()할 수 있습니다 (데이터가 8 비트가 아닌 깨끗한 전송 계층에서 유지되도록). 이것은 다음과 같이 보일 수 있습니다.

    $postvalue = base64_encode(json_encode($array)); // Client side

    $array = json_decode(base64_decode($_POST['result'])); // Server side

데이터를 직렬화하는 권장되지 않는 방법 (하지만 성능이 매우 저렴함)은 단순히 implode()배열에서 사용 하여 지정된 문자로 구분 된 모든 값이있는 문자열을 가져 오는 것입니다. 서버 측에서 배열을 검색 할 수 있습니다 explode(). 그러나 배열 값에서 발생하는 분리 (또는 이스케이프)에 문자를 사용해서는 안되며이 메서드로 배열 키를 전송할 수 없습니다.

  1. 명명 된 특수 입력 요소의 속성을 사용합니다.

    $postvalue = "";
    foreach ($array as $v) {
      $postvalue .= '<input type="hidden" name="result[]" value="' .$v. '" />';
    }
    

    이와 같이 $_POST['result']양식이 전송되면 변수에 전체 배열을 가져옵니다 . 이것은 배열 키를 전송하지 않습니다. 그러나 result[$key]각 필드의 이름 으로 사용하여이를 달성 할 수 있습니다 .

이 모든 방법에는 고유 한 장점과 단점이 있습니다. 이 모든 방법을 사용하여 최소한의 데이터를 보내야하기 때문에 사용하는 것은 주로 배열의 크기에 따라 다릅니다.

이를 달성하는 또 다른 방법은 어레이를 클라이언트 측에서 전송하는 대신 서버 측 세션에 저장하는 것입니다. 이와 같이 $_SESSION변수를 통해 배열에 액세스 할 수 있으며 양식을 통해 아무것도 전송할 필요가 없습니다. 이를 위해 php.net 세션의 기본 사용 예를 살펴보십시오 .


1
value속성 주위에 작은 따옴표를 사용해야했습니다 . 그렇지 않으면 직렬화 된 버전의 첫 번째 큰 따옴표에서 데이터가 잘 렸습니다.
VeeK

나는 json_encode를 사용하여 이것을했다. json_decode 의 두 번째 인수 는 제 경우에 참이어야했습니다 (StdClass 대신 연관 배열을 기본값으로 반환하기 위해)
jamil

22

클라이언트 측에서 serialize 및 base64_encode를 사용할 수 있습니다. 그런 다음 서버 측에서 unserialize 및 base64_decode를 사용하십시오.

처럼:

클라이언트 측에서 다음을 사용하십시오.

    $postvalue = array("a", "b", "c");
    $postvalue = base64_encode(serialize($array));

   // Your form hidden input
   <input type="hidden" name="result" value="<?php echo $postvalue; ?>">

서버 측에서 다음을 사용하십시오.

    $postvalue = unserialize(base64_decode($_POST['result']));
    print_r($postvalue) // Your desired array data will be printed here

이것은 더 나은 사용 foreach는 것보다, 당신은 배열로 객체, 다단계 배열을 전달할 수 있습니다, 정확한 답해야한다
레오나르도 Sapuy

이 답변은 충분한 신용을 얻지 못합니다. 다만 대부분의 사람들이 시도하고 그들이 여기 얻을 때까지는 인용 부호에 기초 실패 실현 한 것들)는 직렬화 () 또는로 json_encode을 (되어 사용. 이 답변은 한 단계 더 나아가 해당 문제를 우아한 방식으로 관련이 없게 만드는 방식으로 인코딩합니다. 브라보!
Kaji

감사합니다. 이것이 제가 찾던 것입니다. 작은 발언 하나. $ postvalue = base64_encode (serialize ($ array)); $ postvalue = base64_encode (serialize ($ postvalue));
anatak

9

직렬화 :

$postvalue=array("a","b","c");
<input type="hidden" name="result" value="<?php echo serialize($postvalue); ?>">

수신시 : unserialize($_POST['result'])

또는 내파 :

$postvalue=array("a","b","c");
<input type="hidden" name="result" value="<?php echo implode(',', $postvalue); ?>">

수신시 : explode(',', $_POST['result'])


1
직렬화 캔 당신의 따옴표 나 괄호까지 혼란과 HTML을 섞어은 .. 내가 허용 대답 사용합니다
zachu

1

배열을 게시하려면 다른 표기법을 사용해야합니다.

foreach ($postvalue as $value){
<input type="hidden" name="result[]" value="$value.">
}

이런 식으로 result []라는 이름의 입력 필드가 3 개 $_POST['result']있고 게시 되면 배열이됩니다.


1
<input type="hidden" name="item[]" value="[anyvalue]">

반복 모드로두면이 요소를 양식에 배열로 게시하고

print_r($_POST['item'])

항목을 검색하려면


1

먼저 JSON 문자열로 인코딩 한 다음 Base64로 인코딩하는 것이 좋습니다 (예 : 서버 측에서 역순). 먼저 base64_decode 함수를 사용한 다음 json_decode 함수를 사용합니다. 따라서 PHP 배열을 복원합니다.


-1

다음과 같이 할 수 있습니다.

<input type="hidden" name="result" value="<?php foreach($postvalue as $value) echo $postvalue.","; ?>">
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.