17 votes

$_POST est une donnée vide en PHP

J'ai un problème étrange avec mes données $_POST qui n'aboutissent pas. Tout d'abord, cela fonctionne bien sur mon hôte local, mais pas sur mon hôte partagé sur le web. Voici le formulaire :

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

Le problème est qu'après avoir soumis le formulaire, je n'ai pas de données $_POST. Si je fais echo serialize($_POST); J'obtiens a:0:{} . Cependant, si je le fais, echo file_get_contents('php://input'); J'obtiens le résultat suivant :

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

De plus, et c'est plus étrange, si je réduis le formulaire à seulement 3 éléments, il fonctionne. N'importe quels 3 éléments conviennent, mais 4 et cela ne fonctionne pas. En outre, d'autres formulaires sur le site (avec plus de 3 éléments) fonctionnent parfaitement. Il n'y a que celui-là.

Voici quelques paramètres PHP de mon hébergeur mutualisé :

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 

S'il s'agit d'un paramètre du serveur, avez-vous une idée de ce que cela pourrait être ? Il semble que ce soit un problème de taille, mais il n'y a tout simplement pas beaucoup de données transmises (toutes ces valeurs sont petites).

J'ai un htaccess, mais je ne pense pas que ce soit lié (j'utilise codeigniter, et c'est le htaccess standard de CI, et mes autres formulaires se soumettent sans problème) :

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>

Voici ce que print_r($_SERVER) produit (légèrement expurgé pour des raisons de sécurité) :

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
)

0voto

Shaun Morgan Points 1
  1. J'ai exécuté ce formulaire sur mon serveur et il a fonctionné sans problème.

  2. J'ai copié le formulaire sur test.php

  3. Envoi de données de formulaire à test2.php

  4. Sortie affichée avec var_dump($_POST)

  5. Modifié : action="/add" (qui me semble d'ailleurs être un répertoire)

    A : action="test2.php"

  6. Ce qui a produit le résultat suivant :

    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) "" } }

Essayez d'envoyer la sortie vers un script différent, par exemple "test2.php"

0voto

Kasper Agg Points 107

J'ai lu que vous aviez commenté : "Pas de changement. J'utilise codeigniter, donc j'ai le 301 standard dans un htaccess" quelque part. Si vous utilisez 301, vous êtes redirigé PERMANENTEMENT (et parfois "pour toujours"). Vérifiez la réponse du serveur à votre navigateur (essayez de consulter le journal du serveur) et voyez si votre message est redirigé. Si c'est le cas, vos données POST seront perdues.

Comment préserver les données POST via une requête ajax après une redirection .htaccess ?

0voto

Clover Points 24
<form action="/add"

Remplacer la partie '/add' par le nom de la page cible : example.php

-1voto

gandaliter Points 2099

Je pense que PHP a un problème avec les entrées de type fichier et les entrées de type non fichier qui utilisent le même sous-réseau POST. Par exemple, le téléchargement d'un fichier appelé "form[image_name]" et d'autres champs appelés "form[something_else]" ne fonctionne pas. Essayez de donner un nom différent au champ de téléchargement de fichier et voyez si cela fonctionne.

PHP : Pièges courants - Chargements de fichiers

-1voto

Phantom Points 378

N'oubliez pas : lorsque vous lisez des formulaires, le nom des entrées est sensible à la casse ! Exemple :

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

Supposons qu'il contienne la valeur bob . Dans le fichier php j'ai écrit :

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

Il ne lira rien, car pour l'interpréteur php Bonjour n'est pas Bonjour - il s'agit de deux valeurs/noms de champs différents.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X