2012-03-17 2 views
1

저는 PHP를 처음 사용하여 양식에서 제출 한 체크 박스를 읽는 데 문제가 있습니다. 그것을 설명하기 전에 나는 훨씬 더 큰 응용 프로그램을 편집하려고하는데 데이터가 다른 어떤 방법으로도 전송 될 수 없다는 것을 언급하고자합니다. 전송되는 내용을 읽는 좋은 방법을 찾는 것입니다. 통상의 텍스트 입력이 전송PHP의 다차원 배열 (체크 박스가있는 양식 데이터)

폼이 배치 될 다음

custom[0][type]="text" 
custom[0][name]="VariableName" 
custom[0][value]="VariableName" 

기본적 여러 요소가 주 "사용자"다차원 배열 (0, 1, 2, 3 등)가있다 각 요소에는 이름과 값이 있습니다. 요소 중 하나가 체크 박스 인 경우

그러나, 다음과 같은 재료가 게시됩니다 :

custom[1][type]="list" 
custom[1][name]="SelectedOptions" 
custom[1][value]="Value1" 
custom[1][value]="Value3" 
custom[1][value]="Value5" 

사물의 PHP 측에 도착,이 난에 의해 전송 된 데이터를 읽기 위해 사용하고 코드입니다 형태. 아래의 코드는 시나리오 1 (텍스트 기반 입력)에서 제대로 작동하지만 목록 유형 사용자 정의 데이터가있을 때만 하나의 값을 읽습니다.

foreach($_POST['custom'] as $item){ 
    if($item['value'] != "") echo $item['name'].'='.$item['value'] 
} 

문제는 $ 항목 [ '값']은 값이 아니라 내가 변수에 3 개 값을 얻을 수있는 방법은 모두 3 중 하나 읽입니까? 아마

(이 그것이 (3 개 확인란이 Variable2에 대한 체크)

custom[0][name] Variable1 
custom[0][type] text 
custom[0][value] ValueForVariable1 
custom[1][name] Variable2 
custom[1][type] checkbox 
custom[1][value] Value1 
custom[1][value] Value3 
custom[1][value] Value5 

을 POST로 전송되는 것입니다 그리고 이것은 무엇 인 print_r, 그것은 모두가 함께 넣으려면 ... 아주 쉬운 일입니다 $ _POST)

[custom] => Array ( [0] => Array ( [value] => ValueForVariable1 [name] => Variable1 [type] => text ) [1] => Array ( [value] => Value1 [name] => Variable2 [type] => checkbox ) 

위의 게시 된 데이터에 대한
쇼 그냥 우리가 같은 페이지에, 실제 데이터가 더 복잡한 시스템에 의해 생성하고 확인하기 위해 우리는 정말 변경할 수 없습니다. POST에서 전송되는 Variable2의 3 가지 값을 모두 읽는 방법에 관심이 있습니다.

감사합니다.

+1

'print_r ($ _ POST)'는 정확히 무엇을 생산합니까? (단지이 청크에 대한 것입니다.) – jcmeloni

+0

정확한 이름 지정을 이해하면 체크 박스 이름이 정확하지 않을 수 있습니다. 확인란 이름은 맞춤 [1] [값] []이어야합니다. 그렇지 않으면 값을 마지막으로 덮어 씁니다. – Rufinus

+0

@jcmeloni - 질문을 편집하고 print_r 데이터를 추가했습니다. – Cornel

답변

2

EDIT : 제공하신 추가 정보를 통해 본인은 원래 문제를 오해 한 것으로 봅니다.

PHP 스크립트로 데이터를 전송하는 양식을 제어 할 권한이 없기 때문에 나중에 같은 이름의 확인란이 이전의 확인란을 덮어 쓰지 않도록 변경할 수 없습니다. 원시 포스트 데이터 자체에 액세스하여 처리합니다.

$postdata = file_get_contents("php://input"); 
echo $postdata; 

...가 출력 단 GET의 쿼리 스트링 같은 POSTDATA : ㅋ = 1 & ㅋ = 2 & ㅋ = 3 (ㅋ 동일한 이름 ㅋ 3 개 양식 필드 될 제 중 두 개를 나타낸다 $ _POST [ 'blah'] = 3)을 남기고 $ _POST에 덮어 씁니다. &에 약간의 폭발이있는 과 문제의 변수 또는 충돌하는 변수를 찾는 루핑 및 구문 분석을 통해 이동하려는 위치로 이동하게됩니다.


원래 답변 :

HTML 양식은 확인 된 체크 박스 (또는 라디오 버튼)를 제출합니다.확인되지 않은 경우 브라우저는 데이터를 다시 서버로 보내지 않습니다.

이 문제를 해결하는 주요 방법은 당신이 만약 정말로 즉 경우 (는 isset ($ _ POST [ 'checkboxname'])).

(그것을위한 백 엔드 및 테스트에 무엇을 찾고 있는지 알고있다 동적으로 모든 체크 박스 요소를 통합 할 일반적인 목적의 백엔드가 필요합니다. 예를 들어서 제가 이것을 해결 한 방법은 자바 스크립트를 사용하여 페이지의 모든 폼 요소를 기록하고 폼의 나머지 부분과 함께 정보를 제출하는 것입니다. 그리고, 내 경우에는, 또한 필드) 변경 여부되었는지 여부를 제출합니다. 여기


당신이 POST를 처리하는 스크립트의 상단에 실행할 수있는 기능입니다 당신이 당신의 ASP 배경에서 대우 받길 기대하는 방식 :

function post_process() { 
    $rawpostdata = file_get_contents('php://input'); 
    if (!$rawpostdata) return; 
    $fields = explode('&', $rawpostdata); 
    $post = array(); 
    foreach ($fields as $field) { 
     list($key, $val) = explode('=', $field); 
     if (isset($post[$key])) $post[$key] .= ','.$val; 
     else $post[$key] = $val; 
    } 
    $_POST = $post; 
} 
+0

처럼 버킷이 없거나 세계에서 가장 오래된 트릭을 사용하기 때문에 값을 덮어 씁니다. value = "0"(체크 된 값이 1 인 경우)과 같은 이름의 숨겨진 필드를 추가하여 항상 모든 필드를 가져오고, 라디오/체크 박스가 선택되면 0 값을 덮어 씁니다. – Rufinus

+0

@ Jason 게시 된 데이터에서 볼 수 있듯이 3 개의 값이 게시됩니다. 이는 3 개의 체크 박스가 양식 페이지에서 선택되었음을 의미합니다. – Cornel

+0

필자의 특별한 시나리오에서 @Rufinus 필자는 존재하는 모든 단일 필드에 대해 숨겨진 필드를 추가 (또는 변경)하지 않아도되는 동일한 코드에 항상 프리미엄을 적용했습니다 (수백 개의 필드가있는 인트라넷 데이터베이스 응용 프로그램 수십 페이지에 걸쳐),하지만 당신이 옳다면, 더 제한적이고 (그리고보다 보편적 인) 어플리케이션에서는 더 견딜 수 있습니다. – Jason