Form ibraz boş php $ _POST dizi

15 Cevap php

Benim dev kutusunu (Ubuntu/PHP5 + / MySQL5 +) mükemmel çalışır kurduğum özel bir CMS var.

Ben sadece benim müşteri için üretim kutusuna kadar taşındı ve şimdi tüm form gönderimler gibi boş $ _POST dizileri gösteriyorlar.

Ben verileri doğrulamak için bir hile aslında file_get_contents('php://input'); kullanılarak geçirilen bulunan ve veri orada ince gösteriyor - $_POST / $_REQUEST diziler her zaman boş .

Ben de içerik türü başlıklar kundakçı üzerinden de doğru doğrulandı (application/x-www-form-urlencoded; charset=utf-8).

Bu sorun ne olursa olsun formun AJAX ya da düzenli bir formu göndermek yoluyla göndererek olup olmadığı oluyor.

Herhangi bir yardım büyük beğeni topluyor!

15 Cevap

Burada başka olası nedeni - benim formu WWW olmadan domain.com göndererek edildi. ve ben eklemek için otomatik yönlendirme kurmuştu "WWW." $ _POST Dizi süreçte boşaltılmış başlamıştı. Yani bunu ben yapmak zorunda düzeltmek için www.domain.com teslim edildi

Bu soru bir Formuyla POST hakkında olduğunu biliyorum, ama json içerik türüyle sorarken benzer bir sorun için cevap arıyor geldim. Cevabını buldu ve bana çok zaman mal olarak paylaşmak istedim.

JSON içerik türünü kullanırken $ _POST dizi (sadece çok parçalı formları ile inanıyorum) doldurmak değil

Burada sorunu gidermek için çalışma ne yaptım:

$rest_json = file_get_contents("php://input");
$_POST = json_decode($rest_json, true);

bu kimse yardımcı olur umarım!

Php.ini de, emin olun:

  • track_vars (çok eski PHP sürümlerinde kullanılabilir bulunuyor) On ayarlanır
  • variables_order harfi içeren P
  • post_max_size makul bir değere ayarlanır (örneğin, 8 MB)
  • (Suhosin yama kullanılıyorsa) suhosin.post.max_vars ve suhosin.request.max_vars yeterince büyüktür.

Ben benim ikinci öneri sorununuzu çözecektir sanırım.

I = "application / x-www-form-urlencoded" default "metin / düz" olarak EncType kullanarak sorunu çözmek olabilir. Eğer $ DATA zaman check-in ayırıcı "metin / düz" için bir boşluk ve "urlencoded" için özel bir karakterdir.

Kind regards Frank

Bu noktada zarif bir çözüm var ama bu sorunla karşılaşırsanız başkalarının ileride benim bulguları paylaşmak istedim etmeyin. Sorunun kaynağı bir. Htaccess dosyasında 2 overriden php değerleri oldu. Ben sadece büyük bir şey varsayılan 8MB dosya yüklemeleri için dosya boyutu limiti artırmak için bu 2 değerleri eklemişti - Ben sadece varsayılan değerinden daha büyük veya daha küçük, soruna neden olmadığını, tüm htaccess dosyasında bu 2 değerlerine sahip olduğu görülmektedir .

php_value post_max_size xxMB
php_value upload_max_filesize xxMB

Umarım tüm suhosin.post.xxx / suhosin.upload.xxx vars için sınırlarını yükseltmek için ama bu ne yazık ki bu sorun ile herhangi bir etkisi yoktu ek değişkenleri eklendi.

Özetle, ben gerçekten "neden" burada açıklayamam, ama kök neden belirledik. Benim duygu bu sonuçta bir Suhosin / htaccess sorunu olduğunu, ama ne yazık ki bir ben yukarıda 2 php geçersiz değerleri kaldırmak için başka çözmek mümkün değildi.

Ben bu sergiyi saatlik bir avuç öldüren bu gelecekte birisi yardımcı olur umarım. Bu (MrMage, Andrew) ile bana yardımcı olmak için zaman aldı herkese teşekkürler

REFERANS: http://www.openjs.com/articles/ajax_xmlhttp_using_post.php

POST method

Isteği gönderirken POST yöntemi kullanılacaktır yüzden bazı değişiklikler yapmak için gidiyoruz ...

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

Bazı http başlıkları herhangi bir POST isteği ile birlikte ayarlanmalıdır. Bu yüzden bu satırları bunları ...

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

Yukarıdaki hatları ile biz temelde veri gönderme form gönderme biçiminde olduğunu söylüyor. Biz de gönderiyor parametrelerin uzunluğunu verir.

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

Biz 'hazır devlet' değişim olay işleyicisi ayarlayın. Bu, GET metodu için kullanılan aynı işleyicisi. Sen http.responseText burada kullanabilirsiniz - innerHTML (AHAH) kullanarak bir div içine yerleştirin, onu (json) veya başka bir şey eval.

http.send(params);

Son olarak, isteği ile parametre göndermek. Verilen url bu hattı denir sonra yüklenir. GET yönteminde, parametre null değer olacaktır. Ama POST yöntemi, göndermek için veri gönderme fonksiyonu argüman olarak gönderilecektir. Params değişken olarak lorem=ipsum&name=binny ikinci satırda ilan edildi - bu yüzden iki parametre göndermek - sırasıyla 'lorem' ve 'isim' değerlerin 'ipsum' ve 'binny'.

In my case it was because I was using jQuery to disable all inputs on the page just before using jQuery to submit the form. So I changed my "disable every input even the 'hidden' types":

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

"Sadece 'düğmesine' tipi girişleri devre dışı bırakmak" için:

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

This was so the user couldn't accidentally hit the 'go' button twice and hose up our DB! It seems that if you put the 'disabled' attribute on a 'hidden' type form input their values won't be sent over if the form is submitted!

Mod_rewrite kurulu değil iken, benim için. Htaccess yönlendirme edildi. Mod_rewite yükleyin ve tüm iyi.

Özellikle:

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

yürütülüyor.

Ben benzer bir sorun vardı. Basit bir düzeltme olduğu ortaya çıktı. Ben formunda

dizini ... dizininin ismi nerede. Benim POST dizi tamamen boştu. Benim tarayıcıda url baktığımda, o ucunda bir eğik çizgi ile sergilendi.

Hile benim eylemin sonuna eğik çizgi yoktu ekleme -

Benim $ _POST dizi yine doluydu!

Eğer sunucu ve istemci tarafı dillerini anlamak emin misiniz? Eğer olsun veya olmasın, bir formun AJAX yoluyla gönderildiğini söyleyerek olduğu gerçeği olmayabilir demektir. Nasıl $_POST ve AJAX kullanıyorsunuz?

Yeni bir so-test.php aşağıdaki içerikle dosyası oluşturma ve sunucu üzerinde koyarak deneyin:

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

Bu dosya kadar bir kez, daha fazla yardım için bir URL göndermek.

Ben bu yazı bir süre beri biliyorum, ama ben sorun benim için ne katkıda düşündüm.

Ben Mod Security aşağıdaki hatayı alıyorum:

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

Ben test etmek benim mod güvenlik yapılandırmasını kaldırıldı kez beklendiği gibi, tüm çalıştı. Şimdi ben sadece benim ihtiyaçları için güvenli ama yeterince esnek kalmak benim kuralları değiştirmek gerekir :)

Luke

MRMage en mesaja ek olarak:

Ben (bir büyük dizi> 1000 öğeleri ile) bazı $_POST değişkenleri kayboldu sorunu çözmek için bu değişkeni ayarlamak zorunda:

suhosin.request.max_vars = 2500

"request", "post" çözelti değildi ...

Değil en uygun çözüm belki, ama ben formu kök etki için action özniteliği ayarlarsanız, index.php erişilebilir ve yayınlanmıştır değişkenleri alır olabileceğini anladım. Ben eylem olarak yazılabilir URL set Ancak, eğer çalışmıyor.

Bu ne icesar @ said sort of benzer.

Ama kendisi tarafından index.php üzerine iletilir yana sadece site/api gönderme, yer benim API, site/api/index.php için malzeme göndermek için çalışıyordu. Benim $_POST anında boşaltılması var gibi bu ancak, görünüşe göre, bir şey berbat almak neden olur. Basitçe gönderme site/api/index.php yerine doğrudan bunu çözdü.

Ben benzer ama biraz farklı bir konuya rastladım ve bu sorunu anlamak için 2 gün sürdü.

  • Benim durumumda da POST dizi boştu.

  • Then checked with file_get_contents('php://input'); and that was also empty.

Daha sonra bu tarayıcı ben POST sunulmasından sonra yüklenen sayfayı yenilerseniz sonra form verilerini resubmitting için onay isteyen değildi bulundu. Doğrudan sayfa ferahlatıcı oldu. Ama düzgün POST geçerken farklı bir form URL değişti ve sayfayı yenilemek için çalışırken veri resubmitting sordu.

Sonra gerçek bir URL ile sorunun ne olduğunu kontrol etti. URL ile herhangi bir arıza ancak URL index.php olmadan bir klasöre işaret edildi ve ben index.php POST kontrol edildi vardı.

Burada / den / index.php POST veri URL'ye index.php ekleme ile URL kaybetti ve test neden olur yönlendirmeyi şüpheliydi.

O çalıştı.

Buraya Yayınlanan yüzden birisi yardımcı bulur.