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 !

1voto

phper Points 213

Une autre raison simple pour laquelle le tableau POST est vide peut être causée par le fait de ne pas fermer un formulaire et d'ajouter ensuite un deuxième ..... Lorsque le deuxième formulaire est soumis, le tableau POST est vide.

0voto

Andrew G. Johnson Points 9572

Êtes-vous sûr de comprendre les langages côté serveur et côté client ? Le fait que vous disiez que le fait qu'un formulaire soit soumis ou non via AJAX signifie que vous ne le comprenez peut-être pas. Comment utilisez-vous $_POST et AJAX ?

Essayez de créer un nouveau so-test.php avec le contenu suivant et le mettre sur votre serveur :

<?php

if ($_SERVER['REQUEST_METHOD'] == 'POST')
{
    echo '<pre>',print_r($_POST, TRUE),'</pre><br /><br /><br />';
}

?>

<form method="post" action="so-test.php">
    <input type="hidden" name="test1" value="one" />
    <input type="hidden" name="test2" value="two" />
    <input type="hidden" name="test3" value="three" />
    <input type="submit" value="Test Me" />
</form>

Une fois que ce fichier est en place, postez une URL pour une aide supplémentaire.

0voto

En complément du message de MRMage :

J'ai dû définir cette variable afin de résoudre le problème que posent certaines $_POST (avec un grand tableau > 1000 éléments) a disparu :

suhosin.request.max_vars = 2500

" request ", et non " post " était la solution...

0voto

Luke Points 31

Je recevais l'erreur suivante de 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"]

Une fois que j'ai retiré la configuration de sécurité de mon mod pour tester, tout a fonctionné comme prévu. Il ne me reste plus qu'à modifier mes règles pour qu'elles restent sécurisées mais suffisamment flexibles pour mes besoins :)

0voto

Rápli András Points 1265

Ce n'est peut-être pas la solution la plus pratique, mais je me suis rendu compte que si je définissais le formulaire action au domaine racine, on peut accéder à index.php et obtenir les variables affichées. Cependant, si je définis une URL réécrite comme action, cela ne fonctionne pas.

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