신비하게 비어있는 $ _POST 배열


21

다음 HTML / PHP 페이지가 있습니다.

<?php
if(empty($_SERVER['CONTENT_TYPE'])) {
    $type = "application/x-www-form-urlencoded";
    $_SERVER['CONTENT_TYPE'] = $type;
}

echo "<pre>";
var_dump($_POST);
var_dump(file_get_contents("php://input"));
echo "</pre>";
?>

<form method="post" action="test.php">
<input type="text" name="test[1]" />
<input type="text" name="test[2]" />
<input type="text" name="test[3]" />
<input type="submit" name="action" value="Go" />
</form>

보시다시피, 양식이 제출되고 예상 출력은 채워진 값을 포함하는 하나의 배열과 값 "Go"(단추)가있는 "action"항목이있는 POST 배열입니다. 그러나 필드에 어떤 값을 입력하더라도 결과는 항상 :

array(2) {
  ["test"]=>
  string(0) ""
  ["action"]=>
  string(2) "Go"
}
string(16) "test=&action=Go&"

어쨌든 test라는 배열이 비워지고 "action"변수가이를 통과시킵니다.

Firefox 용 Live HTTP 헤더 확장을 사용하여 POST 필드가 제출되는지 여부를 확인했습니다. 라이브 HTTP 헤더의 관련 정보 (텍스트 상자의 값으로 a, b 및 c가 채워짐) :

Content-Type: application/x-www-form-urlencoded
Content-Length: 51
test%5B1%5D=a&test%5B2%5D=b&test%5B3%5D=c&action=Go

왜 이런 일이 일어나고 있는지 아는 사람이 있습니까? 나는 이것에 대해 깜짝 놀랐다. 그것은 이미 너무 많은 시간이 들었다.

최신 정보:

우리는 다른 서버, Windows 상자에서 작동하지만 PHP 버전 5.2.4 (수호신 포함)의 Ubuntu 서버에서는 작동하지 않습니다. 심지어 Ubuntu 및 동일한 PHP 버전과 Suhosin이 설치된 다른 서버에서도 작동합니다.

두 파일을 비교했습니다.이 출력 ( diff php.ini phps.ini)입니다.

270c270
< memory_limit = 32M
---
> memory_limit = 16M      ; Maximum amount of memory a script may consume (16MB)
415c415
< variables_order = "EGCSP"
---
> variables_order = "EGPCS"
491d490
< include_path = ".:"
1253a1253,1254
> extension=mcrypt.so
>

여기서 phps.ini는 그것이 작동하는 서버의 것이고 php.ini는 현재의 것입니다. 여기서 문제가없는 것 같습니다.


4
수호신이 될 수 있습니다.
Col. Shrapnel


더 많은 정보를 줄 수 있습니까? Suhosin이 서버에 설치되어 있습니다. 전원을 꺼야합니까? 설정을 변경해야합니까?
rael_kid

3
이것을 시도하십시오, 그것이 sihosin 문제라면 기록 할 것입니다. hardened-php.net/suhosin/configuration.html#suhosin.simulation

시뮬레이션 모드를 켜려고했습니다. 어레이가 여전히 비어 있습니다. 로그 파일을 찾을 수없는 것 같습니다 ...
rael_kid

답변:


2

명시적인 지수 없이 작동합니까 ? 시험:

<form method="post" action="test.php">
<input type="text" name="test[]" />
<input type="text" name="test[]" />
<input type="text" name="test[]" />
<input type="submit" name="action" value="Go" />
</form>

아니요, 작동하지 않습니다.
rael_kid

테스트 배열에 대한 인덱스를 설정하지 마십시오 – POST 변수 감지를
망칩니다

2
알았어, 나갈 수있어 그러나 그것은 내 문제를 해결하지 못합니다.
rael_kid

2

포스트 배열이 비어있는 이유는 여러 가지가 있습니다. 사람 / 개발자 오류가 발생할 가능성이 있습니다. PHP 5.2에서 5.4로 업그레이드 할 때이 정확한 문제가 발생했지만 간단하지만 버그를 찾는 데 몇 시간이 걸렸습니다. config.php 파일에서 $ _POST 배열을 처리하기 위해 아래 명령문이 있습니다.

if (!get_magic_quotes_gpc()) {
    if (isset($_POST)) {
        foreach ($_POST as $key => $value) {
            $_POST[$key] =  trim(addslashes($value));
        }
    }

마술 따옴표는 한 번 사용되었으며 PHP 버전에서는 5.2 이상에서는 정상적으로 작동했지만 버전 5.2 이상에서는 처리되지 않고 빈 배열이 반환됩니다.

error_reporting()전원을 켜지 않은 경우 문제가 해결 될 것입니다.

" magic_quotes"와 같은 더 이상 사용되지 않는 시스템 기능 을 사용하면 결과가 반환 되지 않으므로 확인해야 합니다. 이게 도움이 되길 바란다. 행운을 빌어 요. JCS :)


1

PHP의 버그 트래커에는 이와 유사한 문제에 대한 버그 보고서가 있습니다.

불행히도 해결책에 대해서는 언급하지 않지만 다른 CONTENT_TYPE을 설정하거나 전혀 컨텐츠 유형을 설정하지 않을 수 있습니다.


이 버그는 비슷하지만 내 것과는 다릅니다. 내용 유형을 설정하려고했습니다 (원래 답변의 코드 스 니펫에서 볼 수 있듯이). 컨텐츠 유형을 전혀 설정하지 않으면 작동하지 않습니다 ...
rael_kid

1

비슷한 문제가있었습니다. 글쎄, 우선이 게시물에 도착하는 데 꽤 오랜 시간이 걸렸습니다. 내 문제의 이름을 알아 내기 위해 PHP 콘솔을 설치하고 사용 방법을 찾아야했습니다. 내가 알지 못하는 코드를 디버깅하십시오. 문제의 근원에 도달하고 여전히 당황합니다.

해결책은 실제로 매우 간단했습니다. Chrome에서 F12를 눌러 개발자 도구로 이동하여 네트워크를 선택하고 양식을 게시 해보십시오. 게시 요청 추적, 상태를 확인하십시오. 301 (또는 200 이외의 다른 것)-최근까지 내가 겪었던 것과 똑같은 문제가 있습니다!

새 호스트 제공 업체가 http://my_site.comhttp://www.my_site.com 으로 리디렉션 하고있었습니다. CMS의 일부로 일부 설정을 변경하기 만하면됩니다.

$Configuration['BASE_URL'] = 'http://my_site.com'

$Configuration['BASE_URL'] = 'http://www.my_site.com'

그리고 짜잔, 마법과 무지개와 유니콘과 내 사이트가 마침내 작동합니다!

PS 호스팅 설정으로 문제를 해결하면 문제가 해결 될 수도 있습니다 ... 문제가 내 것과 비슷하다면 ...


젠장 리디렉션도 내 문제였습니다!
Aman Alam

0

확실하지 않지만

name="test[1]"

등은 PHP를 혼란스럽게 할 수 있습니다. 입력 이름을 test_1, test_2로 변경하고 결과를 확인했습니다.


7
@haavee : 아니, PHP는 보급 이 사용 : php.net/manual/en/faq.html.php#faq.html.arrays을
Boldewyn

변수가 작동하는 방식으로 시도했지만 배열에 없습니다.
rael_kid 11

@haavee : 아냐, 표기법은 PHP를 혼동하지 않으며, PHP + 양식의 표준 사용법입니다. Boldewyn의 링크를 참조하십시오. :)

알았어! 오늘 새로운 것을 배웠습니다.

1
@adam : "어레이에 특정 키를 할당 할 수도 있습니다".

0

기본 PHP에서는이를 깨뜨릴 수있는 하나의 구성 옵션 만 생각할 수 있습니다. 즉, post_max_sizephp.ini 및 관련 파일을 확인 하여이 값이 정상이고 0으로 설정되지 않았거나 알파벳 문자와 같은 유효하지 않은 값인지 확인하십시오 .

Suhosin을 사용하면 배열 길이 및 변수 이름 길이와 같은 다양한 조건에서 사후 변수를 차단할 수 있습니다. php.ini 파일에 'suhosin'이 있는지 확인하십시오. 특히 'suhosin.post'로 시작하는 설정이 있는지 확인하십시오. ( 생각하는 매개 변수에 대한 자세한 내용 은 http://www.hardened-php.net/suhosin/configuration.html#suhosin.post.max_array_depth 를 참조 하십시오 .)

불행히도, 일부 값을 1 또는 0으로 설정하는 구성의 주요 중단을 막 으면 코드와 변수가 짧아서 오래 걸리지 않습니다. 그것이 비어 있다면, 다음 제안은 Apache 및 PHP 구성을 백업하고, 디렉토리를 압축 해제하고, 패키지를 제거하고, 다시 설치하고 코드가 다시 작동을 멈출 때까지 구성 청크를 다시 시작하는 것입니다 (대체적으로 해당 서버 업데이트 시작). 그것은 작동하지 않는 서버의 구성에서 모두 작동 할 때까지 작동합니다). 동일한 OS- 동일한 PHP 서버가 올바르게 작동하기 때문에 이는 아마도 서버 오작동 서버의 구성 오류 일 가능성이 거의 있지만 검색하기에는 매우 큰 건초 더미입니다.

시작하기 전에 / etc의 버전 제어를 적극 권장합니다. etckeeper 패키지를 살펴보십시오. (실제로, 나는 그것의 사용 기간을 추천합니다. 특히 한 명 이상의 사람이 루트 액세스 권한을 가진 머신에서 주요 위생 보호기입니다.)


내 post_max_size는 8M이지만 충분하다고 생각합니다. 내 php.ini에는 suhosin이 들어있는 항목이 없으므로 문제가 될 수 있습니다 ... suhosin에는 자체 conf 파일이 있습니까?
rael_kid

기본적으로는 아니지만 모든 PHP 모듈의 설정은 데비안 시스템의 /etc/php5/conf.d에있는 모든 파일로 설정할 수 있으므로 우분투 시스템도 사용합니다. 내가 말했듯이, 이것은 긴 샷이었습니다. 여전히 각 구성 파일을 작동 시스템과 비교하여 시작합니다.
Zed

0

"안정된"에서 데비안 "테스트"로 업그레이드 한 이후로 양식 제출에 실패했습니다. apache2 또는 php5가 동일한 이름의 제출에서 여러 항목을 처리하지 않는 것 같습니다. 예를 들어; 양식에는 "mo"라는 두 개의 입력이 있습니다. 과거에는 "mo"에 대한 값 중 하나만 통과했습니다. 이제 양식은 중복 키가 처음 발생한 후 모든 데이터를 삭제하는 것으로 보입니다. 아직 확실하지 않습니다. 아직도 알아 내려고 노력 중입니다.


0

이 서버로 작동하는 서버에서 php.ini를 복사하십시오 (먼저 작동하지 않는 서버의 php.ini를 먼저 백업하십시오). 그렇다면, 거기에 뭔가 있습니다 (아마도 variables_order 또는 아마도 메모리 일 것입니다).


0

제출 단추의 이름을 조치 이외의 것으로 바꾸십시오. 나는 과거에 이것에 문제가있었습니다. 'action'이라는 입력을 갖는 것이 문제인 것 같습니다.


0

다음은 도움이되지 않습니다. PHP 구성에 대해 내가 아는 모든 것에 반대합니다.

< variables_order = "EGCSP"
---
> variables_order = "EGPCS"

이건 나에게 뛰어 들었다. 슈퍼 글로벌이 다른 순서로 등록되고 있습니다. 이것은 사용 register_globals하지 않고 의존하지 않기 때문에 순서 변수가 처리되는 순서를 변경하는 데 문제가되지 않기 때문에 문제가되지 않습니다.

그러나 반드시 시도하고 변수의 순서를 변경해야합니다.


0

그 OP조차도 꽤 오래되었지만 오늘날에도 비슷한 문제가 발생했습니다.

몇 시간 동안 수백만 가지의 다른 것들을 점검하는 데 몇 시간을 보낸 후에 , PHP 기본 설정에서 cPanel의 PHP 5.6.17 버전으로 마지막 업데이트 후 http 가 선택되지 않았다는 것을 알았습니다 .여기에 이미지 설명을 입력하십시오

그리고 선택으로 설정 한 후 모든 것이 정상으로 돌아갑니다 :-)

여기에 이미지 설명을 입력하십시오

미래의 독자들에게 도움이 되길 바랍니다.


0

이것이 다른 사람을 도울 수 있다면 ... 비슷한 문제를 해결하는 데 몇 시간을 보냈으며 문제는 php.ini의 max_input_vars = "1000"한도입니다. upload_max_filesize, post_max_size 및 max_input_vars의 php.ini 값을 확인하십시오. 하나를 초과하면 $ _POST 배열이 비게됩니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.