$_POST is empty data in PHP

2019-04-18 18:53发布

问题:

I'm having an odd issue with my $_POST data not coming through. First, this works fine on my local host, but doesn't work on my shared host on the web. Here's the form:

<form action="/add" method="POST" enctype="multipart/form-data">

<div>
    Name : <input type='text' name='form[name]' class='form-text ' value="" style='width: 350px' placeholder="I.E. Boulder Vote Bus" maxlength="30"/>
</div>
<div>
    Description : <textarea name='form[description]' class='form-bigbox '/></textarea>
</div>
<div class='clearfix pull-left'>
    Logo: <input type="file" name='form[image_name]' class='' value="" accept="image/jpeg, image/jpg, image/png"/>
</div>
<div class='clearfix'></div>
<div>
    <span id='date' class='change'>
        Date : <input type='text' name='form[date]' id='datepicker' class='form-text ' placeholder="mm/dd/yyyy" value="" style='width: 160px;'/> 
    </span>
    Time : <input type='text' name='form[hr]' class='form-text ' style='width: 40px;' placeholder="01" value=""/> : <input type='text' style='width: 40px;' name='form[min]' class='form-text ' placeholder="00" value=""/> <select name='form[ampm]' class='form-text form-select' style='width: 60px;'><option value='am' >AM</option><option value='pm' >PM</option></select>
</div>
<div>
    Your Email : <input type='text' name='form[email]' class='form-text '  value="" style='width: 350px' placeholder="hero@voterides.com"/>
</div>
<div>
    Zip code : <input type='text' name='form[zipcode]' class='form-text '  value="" placeholder="80304"/> Radius : <input type='text' name='form[radius]' class='form-text '  value="" placeholder="25" style='width:50px;'/> mi
</div>
                    <div>
                            <input type='submit' class='form-submit btn-warning' value='Create a Ride' />
</div>
</form>

Problem is, after I submit the form, I have no $_POST data. If I do echo serialize($_POST); I get a:0:{}. However, if I do, echo file_get_contents('php://input'); I get the following:

------WebKitFormBoundaryLCabCxfMMHCvWsAO

Content-Disposition: form-data; name="form[name]"



Some Name

------WebKitFormBoundaryLCabCxfMMHCvWsAO

Content-Disposition: form-data; name="form[description]"



Some Description

------WebKitFormBoundaryLCabCxfMMHCvWsAO

Content-Disposition: form-data; name="form[image_name]"; filename=""

Content-Type: application/octet-stream





------WebKitFormBoundaryLCabCxfMMHCvWsAO

Content-Disposition: form-data; name="form[date]"





------WebKitFormBoundaryLCabCxfMMHCvWsAO

Content-Disposition: form-data; name="form[hr]"





------WebKitFormBoundaryLCabCxfMMHCvWsAO

Content-Disposition: form-data; name="form[min]"





------WebKitFormBoundaryLCabCxfMMHCvWsAO

Content-Disposition: form-data; name="form[ampm]"



am

------WebKitFormBoundaryLCabCxfMMHCvWsAO

Content-Disposition: form-data; name="form[email]"





------WebKitFormBoundaryLCabCxfMMHCvWsAO

Content-Disposition: form-data; name="form[zipcode]"





------WebKitFormBoundaryLCabCxfMMHCvWsAO

Content-Disposition: form-data; name="form[radius]"





------WebKitFormBoundaryLCabCxfMMHCvWsAO--

Furthermore, and odder, if I take the form down to just 3 elements, it works. Any 3 elements are fine, but 4 and it doesn't work. Additionally, other forms on the site (with more than 3 elements) work just fine. It's just this one.

Here are some relevant PHP settings from my shared host:

PHP Version 5.3.16
max_execution_time  300 
max_file_uploads    20  
max_input_time  -1  -1
max_input_vars  1000    1000
memory_limit    128M    128M
post_max_size   500M    500M 

If it's a server setting, any idea what it could be? Seems like a size issue, but there just isn't that much data being passed (all of these are small values).

I have an htaccess, but I don't think it's related (I'm using codeigniter, and it's the standard CI htaccess, and my other forms submit a-ok):

AddDefaultCharset UTF-8
<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteBase /

    #Removes access to the system folder by users.
    #Additionally this will allow you to create a System.php controller,
    #previously this would not have been possible.
    #'system' can be replaced if you have renamed your system folder.
    RewriteCond %{REQUEST_URI} ^system.*
    RewriteRule ^(.*)$ /index.php?/$1 [L]

    #When your application folder isn't in the system folder
    #This snippet prevents user access to the application folder
    #Submitted by: Fabdrol
    #Rename 'application' to your applications folder name.
    RewriteCond %{REQUEST_URI} ^application.*
    RewriteRule ^(.*)$ /index.php?/$1 [L]

    #Checks to see if the user is attempting to access a valid file,
    #such as an image or css document, if this isn't true it sends the
    #request to index.php
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^(.*)$ index.php?/$1 [L]
</IfModule>

Here's what print_r($_SERVER) produces (slightly redacted for security sake):

Array
(
    [CONTENT_LENGTH] => 1077
    [CONTENT_TYPE] => multipart/form-data; boundary=----WebKitFormBoundarydBnbAkAUNJntI6dz
    [DOCUMENT_ROOT] => [redaced]
    [GATEWAY_INTERFACE] => CGI/1.1
    [HTTP_ACCEPT] => text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
    [HTTP_ACCEPT_CHARSET] => ISO-8859-1,utf-8;q=0.7,*;q=0.3
    [HTTP_ACCEPT_ENCODING] => gzip,deflate,sdch
    [HTTP_ACCEPT_LANGUAGE] => en-US,en;q=0.8
    [HTTP_CACHE_CONTROL] => max-age=0
    [HTTP_CONNECTION] => keep-alive
    [HTTP_COOKIE] => vrsession=8pO1KwOg4OPzCYqsJHX0Qr6FPfLteTimRjIKQPRC%2F83GlFRTepX%2FnrfE1yDxYxDXiPa2JcX4kQviV6lezxrXmJHjqVbWMe%2FgRne%2Bp9P4%2FfxlZrxta2Zl4DACs2C2nsp1SkqYj6k6xhP6Wc9Zlpxgsma752%2BGxHkvwnT6%2F%2FTey699wnV5je99kZe%2FIhSa04DZvoGXoFc6bx1%2B%2FZRtSvojD86ktpWK91AUFUvltcoj8%2F31jeX0h%2BR7VEOPMZLBeqJrcn7qZGeQ6N2XvCIsh6gqTRZIPdsvyAIW%2FTTibBiY0qUvh50yE5MH060D8utqsiv4S54UrXypBsCP3H2w66pLXHTQKKrK%2FAsn1SEWb2pew%2BEOE4prm%2BJKGxcAq0efCGhkpsHZoP9ZDKDekMzaJTIxUin99RUeXVZTF0yqsMD5A%2FFF0AdZuz343VWsJcV9zru4hPHaAky5NMoZa6R1be9PwA%3D%3D; __utma=74945813.1164249566.1347560100.1347560100.1347560100.1; __utmb=74945813.176.10.1347560100; __utmc=74945813; __utmz=74945813.1347560100.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none)
    [HTTP_HOST] => [redacted]
    [HTTP_ORIGIN] => [redacted]
    [HTTP_REFERER] => [redacted]/add
    [HTTP_USER_AGENT] => Mozilla/5.0 (Macintosh; Intel Mac OS X 10_6_8) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/21.0.1180.89 Safari/537.1
    [PATH] => /bin:/usr/bin
    [PHPRC] => [redacted]
    [QUERY_STRING] => 
    [REDIRECT_QUERY_STRING] => /add
    [REDIRECT_STATUS] => 200
    [REDIRECT_UNIQUE_ID] => UFJZCUoyAC0AAE5v7ps
    [REDIRECT_URL] => /add
    [REMOTE_ADDR] => [redacted]
    [REMOTE_PORT] => 48098
    [REQUEST_METHOD] => POST
    [REQUEST_URI] => /add
    [SCRIPT_FILENAME] => [redacted]/index.php
    [SCRIPT_NAME] => /index.php
    [SERVER_ADDR] => [redacted]
    [SERVER_ADMIN] => [redacted]
    [SERVER_NAME] => [redacted]
    [SERVER_PORT] => 80
    [SERVER_PROTOCOL] => HTTP/1.1
    [SERVER_SIGNATURE] => <ADDRESS>Apache/1.3.42 Server at [redacted] Port 80</ADDRESS>

    [SERVER_SOFTWARE] => Apache/1.3.42 (Unix) Sun-ONE-ASP/4.0.2 Resin/2.1.13 mod_fastcgi/2.4.6 mod_log_bytes/1.2 mod_bwlimited/1.4 mod_auth_passthrough/1.8 FrontPage/5.0.2.2635 mod_ssl/2.8.31 OpenSSL/0.9.7a
    [UNIQUE_ID] => UFJZCUoyAC0AAE5v7ps
    [PHP_SELF] => /index.php
    [REQUEST_TIME] => 1347574025
    [argv] => Array
        (
            [0] => /add
        )

    [argc] => 1
)

回答1:

Similar question already answered here:

PHP some $_POST values missing but are present in php://input

and here:

php://input <> $_POST?

php $_POST array empty upon form submission



回答2:

Remember: when you read from forms the inputs' name is case sensitive! Example:

<form>
  <input name="hello" />
</form>

Let's say it contains the value bob. In the php file I wrote:

<?
   $var = $_POST['Hello'];
?>

It will read nothing, because for the php interpreter hello is not Hello - those are two different values/field names.



回答3:

  1. I ran this form on my server and it worked with no problems.
  2. I copied the form onto test.php
  3. Sent formdata to test2.php
  4. Displayed output with var_dump($_POST)
  5. Changed: action="/add" (which looks like a directory to me by the way)

    To: action="test2.php"

  6. Which Produced the following output:

    array(1) { ["form"]=> array(9) { ["name"]=> string(0) "" ["description"]=> string(0) "" ["date"]=> string(0) "" ["hr"]=> string(0) "" ["min"]=> string(0) "" ["ampm"]=> string(2) "am" ["email"]=> string(0) "" ["zipcode"]=> string(0) "" ["radius"]=> string(0) "" } }

Try sending output to a different script i.e "test2.php"



回答4:

I read you commented: "No change. I'm using codeigniter, so I have the standard 301 in an htaccess." somewhere. If you use 301, you are being redirected PERMANENTLY (and sometimes "forever"). Check your browsers response from server (try to preserver log) and see if your post is being redirected. If so, your POST data will be lost.

How to preserve POST data via ajax request after a .htaccess redirect?



回答5:

<form action="/add"

Change the '/add' part with the target page name: example.php



回答6:

I think PHP might have a problem with file inputs and non-file inputs using the same POST subarray. I.e. having a file upload called 'form[image_name]' and other fields called 'form[something_else]' doesn't work. Try with a different name for the file upload field and see if it works.

PHP: Common Pitfalls - File Uploads