118 votes

php Le tableau $_POST est vide lors de la soumission du formulaire.

J'ai construit un système de gestion de contenu (CMS) personnalisé qui fonctionne parfaitement sur ma boîte de développement (Ubuntu/PHP5+/MySQL5+).

Je viens de le déplacer vers la boîte de production pour mon client et maintenant toutes les soumissions de formulaire apparaissent comme des tableaux $_POST vides.

J'ai trouvé une astuce pour vérifier que les données sont réellement transmises en utilisant file_get_contents('php://input'); et les données s'affichent bien ici la $_POST / $_REQUEST Les tableaux sont toujours vides.

J'ai également vérifié que les en-têtes content-type sont corrects via firebug ( application/x-www-form-urlencoded; charset=utf-8 ).

Ce problème se produit indépendamment du fait qu'un formulaire soit soumis via AJAX ou via un formulaire normal.

Toute aide est grandement appréciée !

2voto

Chandu Points 11

RÉFÉRENCE : http://www.openjs.com/articles/ajax_xmlhttp_using_post.php

Méthode POST

Nous allons faire quelques modifications pour que la méthode POST soit utilisée lors de l'envoi de la requête...

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

Certains en-têtes http doivent être définis avec toute demande POST. Nous les définissons donc dans ces lignes...

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

Avec les lignes ci-dessus, nous disons essentiellement que les données envoyées sont au format d'une soumission de formulaire. Nous indiquons également la longueur des paramètres que nous envoyons.

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

Nous avons défini un gestionnaire pour l'événement de changement de l'état de préparation. Il s'agit du même gestionnaire que nous avons utilisé pour la méthode GET. Vous pouvez utiliser le http.responseText ici - l'insérer dans un div en utilisant innerHTML(AHAH), l'évaluer(JSON) ou n'importe quoi d'autre.

http.send(params);

Enfin, nous envoyons les paramètres avec la requête. L'url donnée n'est chargée qu'après l'appel de cette ligne. Dans la méthode GET, le paramètre sera une valeur nulle. Mais dans la méthode POST, les données à envoyer seront envoyées comme argument de la fonction send. La variable params a été déclarée dans la deuxième ligne comme suit lorem=ipsum&name=binny - nous envoyons donc deux paramètres - 'lorem' et 'name' avec les valeurs 'ipsum' et 'binny' respectivement.

2voto

Walid Ajaj Points 398

Je sais que c'est vieux, mais je voulais partager ma solution.

Dans mon cas, le problème se situait dans mon .htaccess, car j'ai ajouté des variables pour augmenter la limite de téléchargement maximale de mon PHP. Mon code était le suivant :

php_value post_max_size 50MB
php_value upload_max_filesize 50MB

Plus tard, j'ai remarqué que les valeurs devraient être xxM et non xxMB et quand je les ai changées en :

php_value post_max_size 50M
php_value upload_max_filesize 50M

Maintenant, mon $_POST retourne les données comme d'habitude. J'espère que cela aidera quelqu'un à l'avenir.

1voto

Martin Fisher Points 36

Pour moi, le fichier .htaccess redirigeait alors que mod_rewrite n'était pas installé. Installez mod_rewite et tout va bien.

Plus précisément :

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

s'exécutait.

1voto

Josh P Points 348

Dans mon cas, c'était parce que j'utilisais jQuery pour désactiver toutes les entrées sur la page juste avant d'utiliser jQuery pour soumettre le formulaire. J'ai donc changé mon "désactivation de toutes les entrées, même les types 'cachés'" :

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

pour "désactiver uniquement les entrées de type 'bouton'" :

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

Ceci afin d'éviter que l'utilisateur n'appuie accidentellement deux fois sur le bouton "go" et ne détruise notre DB ! Il semble que si vous mettez l'attribut 'disabled' sur une entrée de formulaire de type 'hidden', leurs valeurs ne seront pas envoyées si le formulaire est soumis !

1voto

MyraGe Points 53

Je viens de passer des heures à résoudre un problème similaire. Le problème dans mon cas, était le

max_input_vars = "1000"

par défaut, dans le php.ini. J'avais un formulaire vraiment énorme sans téléchargement. Le php.ini est réglé sur upload_max_filesize = "100M" et post_max_size = "108M" et ce n'était sûrement pas le problème dans mon cas. Le comportement de PHP est le même pour max_input_vars quand il dépasse 1000 variables dans le formulaire. Il renvoie un tableau _POST vide. J'aurais aimé trouver cette solution il y a des heures et des heures.

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