복붙노트

양식 제출시 PHP $ _POST 배열이 비어 있습니다.

PHP

양식 제출시 PHP $ _POST 배열이 비어 있습니다.

난 내 dev에 상자 (우분투 / PHP5 + / MySQL5 +) 완벽하게 작동하도록 만들어 사용자 지정 CMS 있습니다.

방금 클라이언트의 프로덕션 상자로 옮겼습니다. 이제 모든 양식 제출이 빈 $ _POST 배열로 표시됩니다.

데이터가 실제로 file_get_contents ( 'php : // input')를 사용하여 전달되는지 확인하는 트릭을 발견했습니다. $ _POST / $ _REQUEST 배열은 항상 비어 있습니다.

또한 방화 벽 (application / x-www-form-urlencoded; charset = utf-8)을 통해 콘텐츠 유형 헤더가 올바른지 확인했습니다.

이 문제는 양식이 AJAX 또는 일반 양식 제출을 통해 제출하는지 여부에 관계없이 발생합니다.

어떤 도움이라도 대단히 감사합니다!

해결법

  1. ==============================

    1.이 질문은 양식을 통한 POST에 관한 것이었지만 JSON 콘텐츠 유형으로 게시 할 때 비슷한 문제에 대한 답변을 찾고자했습니다. 대답을 찾았으며 많은 시간을 들여 공유하고 싶었습니다.

    이 질문은 양식을 통한 POST에 관한 것이었지만 JSON 콘텐츠 유형으로 게시 할 때 비슷한 문제에 대한 답변을 찾고자했습니다. 대답을 찾았으며 많은 시간을 들여 공유하고 싶었습니다.

    JSON content-type을 사용할 때 $ _POST 배열이 채워지지 않을 것입니다 (내가 믿는 다중 부분 형식으로 만)

    다음은이 문제를 해결하는 방법입니다.

    $rest_json = file_get_contents("php://input");
    $_POST = json_decode($rest_json, true);
    

    이 사람이 도움이되기를 바랍니다!

  2. ==============================

    2.또 다른 가능한 원인이 있습니다 - 양식이 WWW없이 domain.com에 제출되었습니다. "WWW"를 추가하기 위해 자동 리디렉션을 설정했습니다. $ _POST 배열이 프로세스에서 비워지고있었습니다. 그래서 그것을 고치려면 www.domain.com에 제출해야만했습니다.

    또 다른 가능한 원인이 있습니다 - 양식이 WWW없이 domain.com에 제출되었습니다. "WWW"를 추가하기 위해 자동 리디렉션을 설정했습니다. $ _POST 배열이 프로세스에서 비워지고있었습니다. 그래서 그것을 고치려면 www.domain.com에 제출해야만했습니다.

  3. ==============================

    3.나는 비슷한 문제가 있었다. 간단한 수정으로 밝혀졌습니다. 내가 가진 형태로

    나는 비슷한 문제가 있었다. 간단한 수정으로 밝혀졌습니다. 내가 가진 형태로

    여기서 directory는 디렉토리의 이름입니다. 내 POST 배열이 완전히 비어 있습니다. 브라우저에서 URL을 보면 끝 부분에 슬래시가 표시되었습니다.

    내 행동의 끝에 슬래시를 추가하는 것은 트릭을했다.

    My $ _POST 배열이 다시 가득 찼습니다!

  4. ==============================

    4.php.ini에서 다음을 확인하십시오.

    php.ini에서 다음을 확인하십시오.

    제 생각에 두 번째 제안이 당신의 문제를 해결할 것이라고 생각합니다.

  5. ==============================

    5.이 시점에서 우아한 해결책은 없지만이 문제가 발생한 다른 사람들에 대한 내 연구 결과를 공유하고 싶습니다. 문제의 근원은 .htaccess 파일의 PHP 값 2 개를 오버라이드 한 것입니다. 이 2 가지 값을 추가하여 파일 업로드에 대한 파일 크기 제한을 기본 8MB에서 더 큰 크기로 늘려 보았습니다. 기본값보다 크거나 작 으면 htaccess 파일에이 2 가지 값을 갖는 것만으로도 문제가 발생한다는 것을 알았습니다 .

    이 시점에서 우아한 해결책은 없지만이 문제가 발생한 다른 사람들에 대한 내 연구 결과를 공유하고 싶습니다. 문제의 근원은 .htaccess 파일의 PHP 값 2 개를 오버라이드 한 것입니다. 이 2 가지 값을 추가하여 파일 업로드에 대한 파일 크기 제한을 기본 8MB에서 더 큰 크기로 늘려 보았습니다. 기본값보다 크거나 작 으면 htaccess 파일에이 2 가지 값을 갖는 것만으로도 문제가 발생한다는 것을 알았습니다 .

    php_value post_max_size xxMB
    php_value upload_max_filesize xxMB
    

    suhosin.post.xxx/suhosin.upload.xxx vars에 대한 제한을 높이기 위해 추가 변수를 추가했지만 불행히도이 문제에 아무런 영향을 미치지 않았습니다.

    요약하면 여기서 왜 "이유"를 설명 할 수는 없지만 근본 원인을 확인했습니다. 내 느낌은 이것이 궁극적으로 suhosin / htaccess 문제이지만 불행히도 내가 해결할 수없는 이상 2 php overridden 값을 제거하는 것입니다.

    희망은 앞으로 누군가를 도울 수 있기를 바랍니다. 이 일을 도와 주신 모든 분들께 감사드립니다 (MrMage, Andrew)

  6. ==============================

    6.나는 enctype = "application / x-www-form-urlencoded"를 사용하여 문제를 해결할 수 있습니다. 기본값은 "text / plain"입니다. $ DATA를 체크인 할 때 seperator는 "text / plain"을위한 공간이고 "urlencoded"를위한 특수 문자입니다.

    나는 enctype = "application / x-www-form-urlencoded"를 사용하여 문제를 해결할 수 있습니다. 기본값은 "text / plain"입니다. $ DATA를 체크인 할 때 seperator는 "text / plain"을위한 공간이고 "urlencoded"를위한 특수 문자입니다.

    종류는 안부 솔직한

  7. ==============================

    7.HTTP에서 HTTPS로 게시 할 때 $ _POST가 비어 있음을 발견했습니다. 이것은 양식을 테스트하는 동안 발생했지만, 내가 깨닫기까지는 다소 시간이 걸렸습니다.

    HTTP에서 HTTPS로 게시 할 때 $ _POST가 비어 있음을 발견했습니다. 이것은 양식을 테스트하는 동안 발생했지만, 내가 깨닫기까지는 다소 시간이 걸렸습니다.

  8. ==============================

    8.비슷하지만 약간 다른 문제가있어서 문제를 이해하는 데 2 ​​일이 걸렸습니다.

    비슷하지만 약간 다른 문제가있어서 문제를 이해하는 데 2 ​​일이 걸렸습니다.

    나중에 POST 제출 후로드 된 페이지를 새로 고치면 브라우저가 양식 데이터를 다시 제출할 것인지 묻는 wasnt를 발견했습니다. 직접 페이지를 새로 고치고있었습니다. 하지만 양식 URL을 다른 것으로 변경하면 POST가 제대로 전달되고 페이지 새로 고침을 시도 할 때 데이터를 다시 제출하라는 메시지가 표시됩니다.

    그런 다음 실제 URL에 무엇이 잘못되었는지 확인했습니다. URL에 오류가 없었지만 URL에 index.php가없는 폴더를 가리키고 있었고 index.php에서 POST를 확인했습니다.

    여기에서 / to /index.php로 리디렉션하면 POST 데이터가 손실되고 URL에 index.php가 추가 된 URL이 테스트됩니다.

    그것은 일했다.

    누군가가 도움이 될 수 있도록 여기에 게시하십시오.

  9. ==============================

    9./api/index.php와 같은 디렉토리의 index.php 파일에 게시하는 경우 양식에 파일의 전체 디렉토리를 지정하십시오.

    /api/index.php와 같은 디렉토리의 index.php 파일에 게시하는 경우 양식에 파일의 전체 디렉토리를 지정하십시오.

    <form method="post" action="/api/index.php"> 
    </form>
    

    또는

    <form method="post" action="/api/"> 
    </form>
    

    공장. 그러나 이것은 실패한다.

    <form method="post" action="/api"> 
    </form>
    
  10. ==============================

    10.

    <form action="test.php" method="post">
                            ^^^^^^^^^^^^^
    

    좋아, 이것은 어리석은 내가 공공 장소에서 자신을 embarassing 것입니다,하지만 PHP에서 무언가를위한 약간의 테스트 스크립트를 노크하고 $ _POST 배열이 비어있을 때, StackOverflow 내가 처음 보았고 대답을 찾지 못했습니다 내가 필요.

    나만 썼다.

    <form action="test.php">
    

    POST로 메소드를 지정하는 것을 잊어 버렸습니다!

    나는 누군가가 snigger 것입니다 확신하지만이 같은 일을 다른 사람을 도움이된다면, 그때 난 상관 없어! 우리 모두는 때때로 그것을합니다!

  11. ==============================

    11.참조 : http://www.openjs.com/articles/ajax_xmlhttp_using_post.php

    참조 : http://www.openjs.com/articles/ajax_xmlhttp_using_post.php

    우리는 요청을 보낼 때 POST 메소드가 사용될 수 있도록 약간의 수정을 할 것입니다 ...

    var url = "get_data.php";
    var params = "lorem=ipsum&name=binny";
    http.open("POST", url, true);
    
    //Send the proper header information along with the request
    http.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
    http.setRequestHeader("Content-length", params.length);
    http.setRequestHeader("Connection", "close");
    
    http.onreadystatechange = function() {//Call a function when the state changes.
      if(http.readyState == 4 && http.status == 200) {
        alert(http.responseText);
      }
    }
    http.send(params);
    

    일부 http 헤더는 POST 요청과 함께 설정해야합니다. 그래서 우리는이 라인에 그들을 배치 ...

    http.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
    http.setRequestHeader("Content-length", params.length);
    http.setRequestHeader("Connection", "close");
    

    위의 내용을 통해 우리는 기본적으로 데이터 전송이 양식 제출 형식임을 나타냅니다. 우리는 또한 우리가 보내는 매개 변수의 길이를 제공합니다.

    http.onreadystatechange = function() {//Call a function when the state changes.
      if(http.readyState == 4 && http.status == 200) {
        alert(http.responseText);
      }
    }
    

    우리는 '준비 상태'변경 이벤트에 대한 처리기를 설정했습니다. 이것은 GET 메소드에서 사용한 것과 같은 핸들러입니다. 여기서 http.responseText를 사용할 수 있습니다 - innerHTML (AHAH), eval it (JSON) 또는 다른 것을 사용하여 div에 삽입하십시오.

    http.send(params);
    

    마지막으로 요청과 함께 매개 변수를 보냅니다. 주어진 URL은이 줄이 호출 된 후에 만로드됩니다. GET 메소드에서 매개 변수는 널 값입니다. 그러나 POST 메서드에서 보낼 데이터는 send 함수의 인수로 보내집니다. params 변수는 두 번째 라인에서 lorem = ipsum & name = binny로 선언되었으므로 'lorem'과 'name'값을 각각 'ipsum'과 'binny'로 보냅니다.

  12. ==============================

    12.제 경우에는 jQuery를 사용하여 양식을 제출하기 전에 jQuery를 사용하여 페이지의 모든 입력을 비활성화했기 때문입니다. 그래서 "내 모든 입력을 '숨겨진'유형으로도 비활성화하도록 변경했습니다.

    제 경우에는 jQuery를 사용하여 양식을 제출하기 전에 jQuery를 사용하여 페이지의 모든 입력을 비활성화했기 때문입니다. 그래서 "내 모든 입력을 '숨겨진'유형으로도 비활성화하도록 변경했습니다.

    $(":input").attr("disabled","disabled"); 
    

    "버튼 유형 입력 만 사용 중지":

    $('input[type=button]').attr('disabled',true);
    

    이것은 사용자가 우연히 'go'버튼을 두 번 치지 않고 DB를 위로 올려 놓을 수 없기 때문입니다! '비활성화 된'속성을 '숨김'유형 입력에 넣으면 양식 제출시 값이 전송되지 않습니다!

  13. ==============================

    13.나를 위해, mod_rewrite가 설치되지 않았을 때 .htaccess가 방향을 전환하고있었습니다. mod_rewite를 설치하면 모두 정상입니다.

    나를 위해, mod_rewrite가 설치되지 않았을 때 .htaccess가 방향을 전환하고있었습니다. mod_rewite를 설치하면 모두 정상입니다.

    구체적으로 :

    <IfModule !mod_rewrite.c>
      ErrorDocument 404 /index.php
    </Ifmodule>
    

    실행 중이었습니다.

  14. ==============================

    14.enable_post_data_reading 설정을 사용 중지하면이 문제가 발생합니다. 문서에 따르면 :

    enable_post_data_reading 설정을 사용 중지하면이 문제가 발생합니다. 문서에 따르면 :

  15. ==============================

    15.MRMage의 게시물 외에도

    MRMage의 게시물 외에도

    이 변수를 설정하여 일부 $ _POST 변수가 큰 배열> 1000 개 항목과 함께 사라지는 문제를 해결해야했습니다.

    suhosin.request.max_vars = 2500
    

    "요청"이 아니라 "게시"가 해결책이었습니다 ...

  16. ==============================

    16.아마도 가장 편리한 솔루션은 아니지만, 루트 도메인에 양식 작업 속성을 설정하면 index.php에 액세스하여 게시 된 변수를 가져올 수 있다고 생각했습니다. 그러나 다시 작성한 URL을 작업으로 설정하면 작동하지 않습니다.

    아마도 가장 편리한 솔루션은 아니지만, 루트 도메인에 양식 작업 속성을 설정하면 index.php에 액세스하여 게시 된 변수를 가져올 수 있다고 생각했습니다. 그러나 다시 작성한 URL을 작업으로 설정하면 작동하지 않습니다.

  17. ==============================

    17.이것은 @icesar가 말한 것과 비슷합니다.

    이것은 @icesar가 말한 것과 비슷합니다.

    하지만 site / api / index.php에있는 api에 게시하려고했는데 사이트 / api에 게시하는 것만으로 index.php에 전달되었습니다. 그러나 이것은 $ _POST가 즉시 비워지기 때문에 무언가를 엉망으로 만들 것입니다. 단순히 site / api / index.php에 직접 게시하는 대신 직접 해결했습니다.

  18. ==============================

    18.내 문제는 내가 HTML 태그를 사용하여 내 테스트 사이트의 기본 URL을 변경했다는 것입니다. 헤더에서 태그를 제거하면 $ _POST 데이터가 다시 나타납니다.

    내 문제는 내가 HTML 태그를 사용하여 내 테스트 사이트의 기본 URL을 변경했다는 것입니다. 헤더에서 태그를 제거하면 $ _POST 데이터가 다시 나타납니다.

  19. ==============================

    19.필자의 경우 (OVH mutualisé 서버의 PHP 페이지) enctype = "text / plain"이 작동하지 않습니다 ($ _POST 및 해당 $ _REQUEST가 비어 있음). 아래의 다른 예제가 작동합니다. `

    필자의 경우 (OVH mutualisé 서버의 PHP 페이지) enctype = "text / plain"이 작동하지 않습니다 ($ _POST 및 해당 $ _REQUEST가 비어 있음). 아래의 다른 예제가 작동합니다. `

    <form action="?" method="post">
    <!-- in this case, my google chrome 45.0.2454.101 uses -->
    <!--     Content-Type:application/x-www-form-urlencoded -->
        <input name="say" value="Hi">
        <button>Send my greetings</button>
    </form>
    
    <form action="?" method="post" enctype="application/x-www-form-urlencoded">
        <input name="say" value="Hi">
        <button>Send my application/x-www-form-urlencoded greetings</button>
    </form>
    
    <form action="?" method="post"  enctype="multipart/form-data">
        <input name="say" value="Hi">
        <button>Send my multipart/form-data greetings</button>
    </form>
    
    <form action="?" method="post" enctype="text/plain"><!-- not working -->
        <input name="say" value="Hi">
        <button>Send my text/plain greetings</button>
    </form>
    

    `

    자세히보기 : method = "post"enctype = "text / plain"은 호환되지 않습니까?

  20. ==============================

    20.좋아, 나는 내 사건을 여기에 넣어야한다고 생각했다 .... 특정 경우에 게시물 배열이 비어있게되었다. 양식이 잘 작동하지만 사용자가 제출 버튼을 눌렀다 고 불평하는 경우가 있고 아무 일도 일어나지 않는다. .   잠시 파기를 한 후 호스팅 업체에 사용자 입력을 확인하고 전체 게시물 배열 (악성 데이터는 제외)을 발견하는 보안 모듈이 있음을 발견했습니다. 예를 들어, 수학 선생님은 방정식을 입력하려고했습니다 : dy + dx + 0 = 0; 데이터가 완전히 지워졌습니다.

    좋아, 나는 내 사건을 여기에 넣어야한다고 생각했다 .... 특정 경우에 게시물 배열이 비어있게되었다. 양식이 잘 작동하지만 사용자가 제출 버튼을 눌렀다 고 불평하는 경우가 있고 아무 일도 일어나지 않는다. .   잠시 파기를 한 후 호스팅 업체에 사용자 입력을 확인하고 전체 게시물 배열 (악성 데이터는 제외)을 발견하는 보안 모듈이 있음을 발견했습니다. 예를 들어, 수학 선생님은 방정식을 입력하려고했습니다 : dy + dx + 0 = 0; 데이터가 완전히 지워졌습니다.

    이 문제를 해결하기 위해 dy + dx + 0 = 0으로 텍스트 영역에 데이터를 입력하도록 조언합니다. 이제는 작동합니다 .... 그러면 누군가 시간을 절약 할 수 있습니다.

  21. ==============================

    21.Mod Security에서 다음 오류가 발생했습니다.

    Mod Security에서 다음 오류가 발생했습니다.

    Access denied with code 500 (phase 2). Pattern match "((select|grant|delete|insert|drop|alter|replace|truncate|update|create|rename|describe)[[:space:]]+[A-Z|a-z|0-9|\*| |\,]+[[:space:]]+(from|into|table|database|index|view)[[:space:]]+[A-Z|a-z|0-9|\*| |\,]|UNION SELECT.*\'.*\'.*,[0-9].*INTO.*FROM)" at REQUEST_BODY. [file "/usr/local/apache/conf/modsec2.user.conf"] [line "345"] [id "300013"] [rev "1"] [msg "Generic SQL injection protection"] [severity "CRITICAL"]
    

    테스트를 위해 mod 보안 구성을 제거한 후에는 예상대로 작동했습니다. 이제 보안을 유지하기 위해 내 규칙을 수정해야하지만 필요에 따라 유연하게 사용할 수 있습니다. :)

  22. ==============================

    22.비슷한 문제를 해결하기 위해 몇 시간을 보냈습니다. 제 경우의 문제는

    비슷한 문제를 해결하기 위해 몇 시간을 보냈습니다. 제 경우의 문제는

    max_input_vars = "1000"
    

    기본적으로 php.ini에 있습니다. 나는 업로드하지 않고 정말 거대한 형식을 가졌다. php.ini는 upload_max_filesize = "100M"및 post_max_size = "108M"으로 설정되어 있으며 필자의 경우에는 문제가되지 않습니다. 폼의 1000 변수를 초과하면 PHP 동작은 max_input_vars와 동일합니다. _POST 배열을 반환하고 비 웁니다. 1 시간 전, 몇 시간 전에 그걸 발견했으면 좋았을 텐데.

  23. from https://stackoverflow.com/questions/1282909/php-post-array-empty-upon-form-submission by cc-by-sa and MIT license