J'ai un CMS personnalisé que j'ai construit 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 de mon client et maintenant toutes les soumissions de formulaire apparaissent sous forme de tableaux $ _POST vides.
J'ai trouvé une astuce pour vérifier que les données sont effectivement transmises file_get_contents('php://input');
et que les données s'affichent bien là-bas - les tableaux $_POST
/ $_REQUEST
sont toujours vides.
J'ai également vérifié que les en-têtes de type de contenu sont également 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 un formulaire normal.
Toute aide est grandement appréciée!
Réponses:
Je sais que cette question concernait POST via un formulaire, mais je suis venu ici à la recherche de réponses à un problème similaire lors de la publication avec le type de contenu JSON. J'ai trouvé la réponse et j'ai voulu la partager car cela m'a coûté beaucoup de temps.
Lors de l'utilisation de type de contenu JSON, le tableau $ _POST ne se remplira pas (uniquement avec des formulaires en plusieurs parties, je crois)
Voici ce qui a fonctionné pour corriger le problème:
espérons que cela aide quelqu'un!
la source
Content-Type
têteapplication/x-www-form-urlencoded
et à sérialiser vos données avec$.param(dataObject)
. Cela devrait aider.title=something&body=anything
. Je veux avoir la valeur du titre et du corps. $ dataobject ["title"] renvoie vide. Dans mon cas, $ _POST est vide. Et le seul moyen de l'obtenir en utilisant file_get_contents ("php: // input") ... sauf qu'il n'est pas encodé en json.Voici une autre cause possible - mon formulaire était soumis à domain.com sans le WWW. et j'avais mis en place une redirection automatique pour ajouter le "WWW". Le tableau $ _POST était vidé dans le processus. Donc, pour résoudre ce problème, tout ce que j'avais à faire était de me soumettre à www.domain.com
la source
htaccess
Bon sang , une réécriture d'url dans mon était la cause du dysfonctionnement des POST. J'ajoutais automatiquement une barre oblique à toutes les URL, mais dans le code comme ACTION, j'utilisais une URL sans barre oblique. Votre réponse a aidé, car je n'ai jamais pensé à vérifier le .htaccess. +1.htaccess
dossier. Il supprimait l'.php
extension de l'URL et mon formulaire étaitPOST
dirigé vers l'URL avec l'extension.J'avais un problème similaire. S'est avéré être une solution simple. Sous la forme que j'avais
où répertoire était le nom de ... le répertoire. Mon tableau POST était totalement vide. Lorsque j'ai regardé l'URL dans mon navigateur, elle était affichée avec une barre oblique à la fin.
L'ajout de la barre oblique à la fin de mon action a fait l'affaire -
Mon tableau $ _POST était à nouveau plein!
la source
<form>
balise n'avait pas d'name
attribut, et uniquement dans IE.Assurez-vous que, dans php.ini:
track_vars
(il n'est disponible que sur les très anciennes versions de PHP) est défini surOn
variables_order
contient la lettreP
post_max_size
est réglé sur une valeur raisonnable (par exemple 8 Mo)suhosin.post.max_vars
etsuhosin.request.max_vars
sont suffisamment grands.Je suppose que ma deuxième suggestion résoudra votre problème.
la source
J'ai constaté que lors de la publication de HTTP vers HTTPS, le
$_POST
fichier est vide. Cela s'est produit lors du test du formulaire, mais cela m'a pris du temps avant de m'en rendre compte.la source
Je suis tombé sur un problème similaire mais légèrement différent et il a fallu 2 jours pour comprendre le problème.
Dans mon cas, le tableau POST était également vide.
Puis vérifié avec file_get_contents ('php: // input'); et c'était aussi vide.
Plus tard, j'ai trouvé que le navigateur ne demandait pas de confirmation pour la soumission des données du formulaire après si je rafraîchis la page chargée après la soumission POST. C'était une page directement rafraîchissante. Mais lorsque j'ai changé l'URL du formulaire en une autre, il passait correctement le POST et a demandé à resoumettre les données lors de la tentative d'actualisation de la page.
Ensuite, j'ai vérifié ce qui ne va pas avec l'URL réelle. Il n'y avait aucun défaut avec l'URL, mais il pointait vers un dossier sans index.php dans l'URL et je vérifiais POST à index.php.
Ici, je doutais que la redirection de / vers /index.php entraîne la perte des données POST et teste l'URL avec l'ajout d'index.php à l'URL.
Ça a marché.
Postez-le ici pour que quelqu'un le trouve utile.
la source
Si vous publiez dans un fichier index.php dans un répertoire par exemple /api/index.php, assurez-vous que dans votre formulaire vous spécifiez le répertoire complet du fichier, par exemple
Ce
OU
travaux.
Mais cela échoue
la source
/my_uri
cela fonctionnerait mais pas/my_uri/
.Je n'ai pas de solution élégante à ce stade, mais je voulais partager mes découvertes pour la future référence d'autres personnes qui rencontrent ce problème. La source du problème était 2 valeurs php remplacées dans un fichier .htaccess. J'avais simplement ajouté ces 2 valeurs pour augmenter la limite de taille de fichier pour les téléchargements de fichiers de 8 Mo par défaut à quelque chose de plus grand - j'ai observé que le simple fait d'avoir ces 2 valeurs dans le fichier htaccess, qu'elles soient plus grandes ou plus petites que la valeur par défaut, causait le problème .
J'ai ajouté des variables supplémentaires pour augmenter, espérons-le, les limites de toutes les variables suhosin.post.xxx/suhosin.upload.xxx, mais celles-ci n'ont malheureusement aucun effet sur ce problème.
En résumé, je ne peux pas vraiment expliquer le «pourquoi» ici, mais j'en ai identifié la cause profonde. Mon sentiment est que c'est finalement un problème de suhosin / htaccess, mais malheureusement un problème que je n'ai pas pu résoudre autrement que de supprimer les 2 valeurs php remplacées ci-dessus.
J'espère que cela aidera quelqu'un dans le futur alors que j'ai tué une poignée d'heures à comprendre cela. Merci à tous ceux qui ont pris le temps de m'aider avec ça (MrMage, Andrew)
la source
Je pourrais résoudre le problème en utilisant enctype = "application / x-www-form-urlencoded" comme la valeur par défaut est "text / plain". Lorsque vous archivez $ DATA, le séparateur est un espace pour "text / plain" et un caractère spécial pour "urlencoded".
Cordialement Frank
la source
La
enable_post_data_reading
désactivation du paramètre entraînera cela. Selon la documentation:la source
D'accord, c'était stupide et je vais m'embarrasser en public, mais j'ai lancé un petit script de test pour quelque chose en PHP et quand mon
$_POST
tableau était vide, StackOverflow est le premier endroit où j'ai regardé et je n'ai pas trouvé la réponse dont j'avais besoin .J'avais seulement écrit
et j'ai oublié de spécifier la méthode comme étant
POST
!Je suis sûr que quelqu'un ricanera, mais si cela aide quelqu'un d'autre qui fait la même chose, ça ne me dérange pas! Nous le faisons tous de temps en temps!
la source
Dans mon cas, lors de la publication de HTTP vers HTTPS, le $ _POST est vide. Le problème était que le formulaire avait une action comme celle-ci //example.com Lorsque j'ai corrigé l'URL de https://example.com , le problème a disparu.
la source
même problème ici!
J'essayais de me connecter à mon code de serveur local via une demande de poste dans le facteur, et ce problème m'a fait perdre beaucoup de temps!
pour quiconque utilise un projet local (par exemple, postman): utilisez votre adresse IPv4 (tapez ipconfig dans cmd) au lieu du mot-clé "localhost". dans mon cas:
avant:
après:
la source
RÉFÉRENCE: http://www.openjs.com/articles/ajax_xmlhttp_using_post.php
Méthode POST
Nous allons faire quelques modifications donc la méthode POST sera utilisée lors de l'envoi de la requête ...
Certains en-têtes http doivent être définis avec toute requête POST. Alors nous les plaçons dans ces lignes ...
Avec les lignes ci-dessus, nous disons essentiellement que les données envoyées sont dans le format d'une soumission de formulaire. Nous donnons également la longueur des paramètres que nous envoyons.
Nous définissons un gestionnaire pour l'événement de modification «état prêt». C'est le même gestionnaire que nous avons utilisé pour la méthode GET. Vous pouvez utiliser http.responseText ici - insérer dans un div en utilisant innerHTML (AHAH), eval it (JSON) ou autre chose.
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 d'envoi. La variable params a été déclarée dans la deuxième ligne comme
lorem=ipsum&name=binny
- nous envoyons donc deux paramètres - «lorem» et «name» avec les valeurs «ipsum» et «binny» respectivement.la source
Dans mon cas, c'était parce que j'utilisais jQuery pour désactiver toutes les entrées de la page juste avant d'utiliser jQuery pour soumettre le formulaire. J'ai donc changé mon "désactiver toutes les entrées même les types" cachés "":
pour "désactiver uniquement les entrées de type" bouton "":
C'était ainsi l'utilisateur ne pouvait pas accidentellement appuyer deux fois sur le bouton «go» et arroser notre DB! Il semble que si vous mettez l'attribut «désactivé» sur un formulaire de type «caché», leurs valeurs ne seront pas envoyées si le formulaire est soumis!
la source
Pour moi, .htaccess redirigeait lorsque mod_rewrite n'était pas installé. Installez mod_rewite et tout va bien.
Plus précisément:
était en cours d'exécution.
la source
Je viens de passer des heures à résoudre un problème similaire. Le problème dans mon cas, c'était le
par défaut, dans le php.ini. J'avais un formulaire vraiment énorme sans téléchargement. php.ini est défini 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 lorsqu'il dépasse 1000 variables dans le formulaire. Il retourne et vide le tableau _POST. J'aurais aimé trouver ça il y a une heure et quelques heures.
la source
Je sais que c'est vieux, mais je voulais partager ma solution.
Dans mon cas, le problème était dans mon .htaccess car j'ai ajouté des variables pour augmenter la limite de téléchargement maximale de mon PHP. Mon code était comme ceci:
Plus tard, je remarque que les valeurs devraient aimer xxM et non xxMB et quand je l'ai changé en:
maintenant, mon $ _POST a renvoyé les données comme d'habitude auparavant. J'espère que cela aidera quelqu'un à l'avenir.
la source
En plus du message de MRMage:
J'ai dû définir cette variable pour résoudre le problème de la
$_POST
disparition de certaines variables (avec un grand tableau> 1000 éléments):"
request
", pas "post
" était la solution ...la source
Ce n'est peut-être pas la solution la plus pratique, mais j'ai compris que si je définissais l'
action
attribut form sur le domaine racine, index.php était accessible et obtenait les variables publiées. Cependant, si je définis une URL réécrite comme action, cela ne fonctionne pas.la source
C'est un peu similaire à ce que dit @icesar .
Mais j'essayais de publier des trucs sur mon api, situé dans
site/api/index.php
, en ne postant quesite/api
car il est transmisindex.php
par lui-même. Cependant, cela a apparemment gâché quelque chose, car mon a$_POST
été vidé à la volée. Le simple fait de postersite/api/index.php
directement à la place l'a résolu.la source
Mon problème était que j'utilisais la
<base>
balise HTML pour modifier l'URL de base de mon site de test. Une fois que j'ai supprimé cette balise de l'en-tête, les$_POST
données sont revenues.la source
Dans mon cas (page php sur le serveur OVH mutualisé)
enctype="text/plain"
ne fonctionne pas ($_POST
et correspondant$_REQUEST
est vide), les autres exemples ci-dessous fonctionnent. »»
Plus ici: method = "post" enctype = "text / plain" ne sont pas compatibles?
la source
J'obtenais l'erreur suivante de Mod Security:
Une fois que j'ai supprimé ma configuration de sécurité mod pour tester, tout a fonctionné comme prévu. Maintenant, j'ai juste besoin de modifier mes règles pour rester en sécurité mais suffisamment flexible pour mes besoins :)
la source
Assurez-vous d'utiliser name = " your_variable_name " dans la balise d'entrée.
J'utilise par erreur id = " your_variable_name ".
J'ai passé beaucoup de temps à attraper le bogue.
la source
Assurez-vous que la
name
propriété de chaque champ est définie.Cela vous crée un POST vide sur PHP
Mais cela fonctionnera
la source
OK, je pensais que je devrais mettre mon cas ici ... J'étais en train de vider le tableau de messages dans des cas spécifiques ... Le formulaire fonctionne bien, mais parfois les utilisateurs se plaignent d'avoir appuyé sur le bouton Soumettre, et rien ne se passe ... Après avoir creusé pendant un moment, j'ai découvert que ma société d'hébergement dispose d'un module de sécurité qui vérifie les entrées des utilisateurs et efface tout le tableau de messages (pas seulement les données malveillantes) s'il le découvre. Dans mon exemple, un professeur de mathématiques essayait de saisir l'équation: dy + dx + 0 = 0; et les données ont été complètement effacées.
Pour résoudre ce problème, je lui conseille simplement maintenant de saisir les données dans la zone de texte comme dy + dx + 0 = zéro, et maintenant cela fonctionne .... Cela peut faire gagner du temps à quelqu'un.
la source