신비하게 비어있는 $ _POST 배열 에서 마이그레이션 되었습니다.

다음 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는 현재의 것입니다. 여기서 문제가없는 것 같습니다.



답변

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

<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>

답변

포스트 배열이 비어있는 이유는 여러 가지가 있습니다. 사람 / 개발자 오류가 발생할 가능성이 있습니다. 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 🙂


답변

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

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


답변

비슷한 문제가있었습니다. 글쎄, 우선이 게시물에 도착하는 데 꽤 오랜 시간이 걸렸습니다. 내 문제의 이름을 알아 내기 위해 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 호스팅 설정으로 문제를 해결하면 문제가 해결 될 수도 있습니다 … 문제가 내 것과 비슷하다면 …


답변

확실하지 않지만

name="test[1]"

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


답변

기본 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 패키지를 살펴보십시오. (실제로, 나는 그것의 사용 기간을 추천합니다. 특히 한 명 이상의 사람이 루트 액세스 권한을 가진 머신에서 주요 위생 보호기입니다.)


답변

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