Gizemli boş $ _POST dizisi


21

Aşağıdaki HTML / PHP sayfam var:

<?php
if(empty($_SERVER['CONTENT_TYPE'])) {
    $type = "application/x-www-form-urlencoded";
    $_SERVER['CONTENT_TYPE'] = $type;
}

echo "<pre>";
var_dump($_POST);
var_dump(file_get_contents("php://input"));
echo "</pre>";
?>

<form method="post" action="test.php">
<input type="text" name="test[1]" />
<input type="text" name="test[2]" />
<input type="text" name="test[3]" />
<input type="submit" name="action" value="Go" />
</form>

Gördüğünüz gibi, form gönderilecek ve beklenen çıktı, içinde bir dolu dizi bulunan bir dizi içeren bir POST dizisi ve "Go" (düğme) değerine sahip bir "eylem" girişi içeriyor. Ancak, alanlara hangi değerleri girdiğim önemli değildir; sonuç her zaman:

array(2) {
  ["test"]=>
  string(0) ""
  ["action"]=>
  string(2) "Go"
}
string(16) "test=&action=Go&"

Her nasılsa, test adındaki dizi boşaltılır, "action" değişkeni bunu çözer.

POST alanlarının gönderilip gönderilmediğini kontrol etmek için Firefox için Live HTTP Başlıkları uzantısını kullandım. Live HTTP Başlıklarından gelen bilgiler (metin kutularında değerler olarak doldurulmuş a, b ve c ile):

Content-Type: application/x-www-form-urlencoded
Content-Length: 51
test%5B1%5D=a&test%5B2%5D=b&test%5B3%5D=c&action=Go

Bunun neden olduğu hakkında bir fikri olan var mı? Bunu korkutuyorum, bu bana çok zaman kazandırdı ...

Güncelleştirme:

Bunu farklı sunucularda, Windows kutularında, PHP sürüm 5.2.4 (Suhosin ile) ile Ubuntu sunucusunda çalıştığını denedik. Hatta Ubuntu ve aynı PHP sürümüyle farklı bir sunucuda, Suhosin yüklü olarak da çalışıyor.

İki dosyayı dağıttım, çıktı ( diff php.ini phps.ini):

270c270
< memory_limit = 32M
---
> memory_limit = 16M      ; Maximum amount of memory a script may consume (16MB)
415c415
< variables_order = "EGCSP"
---
> variables_order = "EGPCS"
491d490
< include_path = ".:"
1253a1253,1254
> extension=mcrypt.so
>

Bu phps.ini içinde çalıştığı sunucudan biridir ve php.ini şu ankidir. Burada sorun yokmuş gibi görünüyor, değil mi?


4
Suhosin olabilir.
Albay Şarapnel

Ya, suhosin olası bir aday gibi geliyor
SeanJA

Biraz daha bilgi verebilir misiniz? Suhosin sunucuya kurulmuş, kapatmalı mıyım? Ayarları değiştirmeli miyim?
rael_kid

3
Bunu dene, bir sihosin problemi varsa, kayıt olacak. hardened-php.net/suhosin/configuration.html#suhosin.simulation

Simülasyon modunu açmayı denedim. Dizi hala boşaltılmış. Ancak günlük dosyalarını bulamıyorum ...
rael_kid

Yanıtlar:


2

Açık endeksler olmadan çalışıyor mu ? Deneyin:

<form method="post" action="test.php">
<input type="text" name="test[]" />
<input type="text" name="test[]" />
<input type="text" name="test[]" />
<input type="submit" name="action" value="Go" />
</form>

Hayır, işe yaramadı.
rael_kid

Test dizisi için endeksleri ayarlamayın - POST değişkeni algılamasını karıştırırlar
adam

2
Tamam, onları dışarıda bırakabilirim. Ama bu benim sorunumu çözmüyor.
rael_kid

2

Gönderi dizisinin boş olmasının birkaç olası nedeni vardır - ihtimal insan / geliştirici hatasına geri dönebilir. PHP 5.2'den 5.4'e yükseltirken bu sorunu yaşadım, basitti ama hatayı bulmak saatler sürdü. Config.php dosyamızda $ _POST dizilerini işlemek için aşağıdaki ifadeye sahibiz:

if (!get_magic_quotes_gpc()) {
    if (isset($_POST)) {
        foreach ($_POST as $key => $value) {
            $_POST[$key] =  trim(addslashes($value));
        }
    }

Sihirli alıntılar bir zamanlar açıktı ve PHP sürümünde 5.2'ye kadar olan sürümler iyi çalışıyordu ancak sürüm 5.2'nin üzerindeki hiçbir şey işlenmiyor ve boş bir dizi döndürülüyordu.

Eğer var yoksa error_reporting()ben bu olmasını öneriyoruz açılır ve eminim sorunu gidermek mümkün olacak.

Ayrıca " magic_quotes" gibi kullanımdan kaldırılmış sistem özelliklerini de denetlemelisiniz, çünkü bunları kullanmak sonuçları döndüremez. Umarım bu yardımcı olur. İyi şanslar. JCS :)


1

PHP'nin bugtracker'ında bu veya benzeri konularda hata raporları var:

Maalesef bir çözümden bahsetmiyor, ancak başka bir CONTENT_TYPE ayarlamaya çalışabilir veya hiçbir içerik türü belirtmeyebilirsiniz.


Bu böcekler benzer, fakat benimkiyle aynı değil. İçerik türünü ayarlamayı denedim (orijinal yanıtımda kod pasajında ​​görebileceğiniz gibi). Hiçbir içerik türü ayarlamazsam da işe yaramazsa ...
rael_kid

1

Oldukça benzer bir problem vardı. Her şeyden önce, bu yazıya ulaşmam biraz zaman aldı. Sorunumun adını bulmak için PHP konsolunu kurmak, nasıl kullanacağımı bulmak zorunda kaldım. Hakkında hiçbir şey bilmediğim kodu ayıkla. Sorunun kökünden alın ve hala şaşkın.

Çözüm aslında oldukça basitti. Chrome'da, geliştirici araçlarına ulaşmak için F12 tuşuna basın, Ağ seçeneğini belirleyin, formunuzu göndermeyi deneyin. Gönderi isteğini takip et, duruma bak. Eğer 301 ise (veya 200 dışında bir şey varsa) - yakın zamana kadar yaşadığım problemin aynısını yaşıyorsun!

Benim yeni ev sahibi sağlayıcısı oldu yönlendirme http://my_site.com için http://www.my_site.com , bütün i? (Sizin bir bakıma farklı ama benzer olabilir) benim CMS parçası olarak bazı ayarları değiştirmek yapmak zorunda

$Configuration['BASE_URL'] = 'http://my_site.com'

için

$Configuration['BASE_URL'] = 'http://www.my_site.com'

Ve işte, sihir, gökkuşağı ve tek boynuzlu atlar ve sitem sonunda çalışıyor!

Barındırma ayarlarınızla PS Messing de sorununuzu çözebilir ... Sorununuz benimkine benziyorsa ...


Lanet olsun. Yönlendirme de benim sorunumdu!
Aman Alam

0

Emin değilim ama sahip

name="test[1]"

vs. php ile karıştırılabilir. Giriş adlarını test_1, test_2 olarak değiştirirdim ve ne olduğunu görün.


7
@haavee: Hayır, PHP bu kullanımın reklamını yapar : php.net/manual/en/faq.html.php#faq.html.arrays
Boldewyn

Bunu denedim, bu şekilde değişkenler işe yarıyor ama bir dizide değiller.
rael_kid

@haavee: Hayır, notasyon PHP'yi karıştırmaz, standart PHP + formlarını kullanır. Boldewyn'in linkine bakınız. :)

tamam teşekkürler! bugün yeni bir şey öğrendim.

1
@ adam: "Dizilerinize belirli anahtarlar atamak da mümkündür".

0

PHP'de, bunu kırabilecek tek bir yapılandırma seçeneği düşünebilirim post_max_size, bu yüzden php.ini'nizi ve ilgili dosyalarınızı kontrol edin ve bu değerin aklı başında olduğundan emin olun ve sıfıra veya alfabetik karakter gibi geçersiz bir değere ayarlanmadığından emin olun .

Suhosin, post değişkenlerini dizi uzunluğu ve değişken isim uzunluğu gibi şeyler de dahil olmak üzere çeşitli koşullar altında engellemeyi mümkün kılar. Herhangi bir ayar olup olmadığını, özellikle 'suhosin.post' ile başlayan herhangi bir şeyin olup olmadığını görmek için php.ini dosyalarınızı 'suhosin' için tutun. (Düşündüğüm parametreler hakkında daha fazla bilgi için bkz. Http://www.hardened-php.net/suhosin/configuration.html#suhosin.post.max_array_depth .)

Ne yazık ki, bazı değerleri bir veya sıfıra ayarlayan konfigürasyonda büyük bir tıkanıklığı engellemek, kodunuz (ve değişkenler) bunun uzun süreli bir şey olması için yeterince kısa. Bu boş kalırsa, bir sonraki önerim Apache ve PHP yapılandırmalarınızı yedeklemek, dizinlerini doldurmak, paketleri temizlemek, yeniden yüklemek ve yapılandırma işlevlerini tekrar çalışmayı bırakıncaya kadar tekrar yapılandırmaya başlamak olacak (alternatif olarak bu sunucuyu güncellemeye başlayın) bu, ikisi de kesilene kadar çalışmayan sunucudaki yapılandırmalarla çalışıyor. Düzgün çalışan aynı OS işletim sistemiyle aynı PHP sunucunuz olduğundan, bu kesinlikle bir yerde hatalı işlev gören sunucuda bir yapılandırma hatasıdır, ancak bu, aranması oldukça büyük bir samanlıktır.

/ Etc sürüm kontrolü, buna başlamadan önce şiddetle tavsiye edilir - etckeeper paketine bakın. (Aslında, kullanılmasını öneririm, süre. Özellikle birden fazla kişinin kök erişimine sahip bir makinede büyük akıl sağlığı önlemi.)


Benim post_max_size 8m, bu yeterli olacağını düşünüyorum. Benim php.ini içinde suhosin içeren herhangi bir yazı içermiyor, bu bir sorun olabilir ... Suhosin'in kendine ait bir dosyaları var mı?
rael_kid

Varsayılan olarak değil, ancak herhangi bir PHP modülünün ayarları bir Debian sistemindeki /etc/php5/conf.d dosyasındaki herhangi bir dosya tarafından ayarlanabilir ve böylece bir Ubuntu sistemi olduğunu varsayarım. Dediğim gibi, bu uzun bir atış oldu. Yine de, her config dosyasını çalışan bir sisteme karşı dağıtarak başlarım.
Zed

0

Debian'ın "test edilmesine" "kararlı" durumdan yükselttiğimden beri her yerde form gönderme başarısızlığı yaşıyorum. Apache2 veya php5'in aynı addaki gönderimdeki birden fazla öğeyi işlemediği anlaşılıyor. Örneğin; Formunuzda iki giriş adı "mo" var. Geçmişte "mo" için olan değerlerden sadece biri bunu başarırdı. Şimdi form, yinelenen bir anahtarın ilk oluşumundan sonra tüm verileri bırakıyor gibi görünüyor. Henüz emin değilim. Hala anlamaya çalışıyorum.


0

Buna çalışan sunucudan php.ini dosyasını kopyalamayı deneyin (çalışmayan sunucunun php.ini dosyasını yedekleyin). Eğer öyleyse, o orada bir şey (belki de her ikisi de mümkün olmasa da, belki değişkenler_order veya belki de hafıza).


0

Gönder düğmenizi işlemden başka bir şeyle yeniden adlandırmayı deneyin. Geçmişte bununla ilgili bazı problemlerim var. 'İşlem' adında bir girdi olması sorun gibi görünüyor.


0

Aşağıdakiler size yardımcı olmamalıdır. PHP Yapılandırması hakkında bildiğim her şeye karşı duruyor:

< variables_order = "EGCSP"
---
> variables_order = "EGPCS"

Bu bana üstünden atladı. Süper marketleriniz farklı siparişlerde kayıt altına alınıyor. Bu sadece bir problem olmamalı, çünkü kullanmadığınız register_globalsve onlara güvenmediğiniz için, sipariş değişkenlerinin işlendiği sırayı değiştirmek sorun olmamalı.

Ancak, kesinlikle denemelisiniz ve değişkenlerin sırasını değiştirmelisiniz.


0

Bu OP bile oldukça eski ama bugün benzer bir sorunla karşılaştım.

Defalarca milyon farklı şeyler kontrol birkaç saat geçirdikten sonra sonunda son güncellemeden sonra öğrendim PHP 5.6.17 PHP varsayılan ayarlarında adresindeki cPanel sürümü http seçilmemiştir.görüntü tanımını buraya girin

Ve seçilene ayarladıktan sonra - her şey normale döndü :-)

görüntü tanımını buraya girin

Gelecekteki herhangi bir okuyucuya yardımcı olacağını umuyorum


0

Eğer bu başkasına yardımcı olabilirse ... Ben sadece benzer bir sorunu çözmek için saatler harcadım ve sorun php.ini max_input_vars = "1000" sınırıydı. Upload_max_filesize, post_max_size ve max_input_vars php.ini değerlerini kontrol ettiğinizden emin olun. Birini aşmak boş bir $ _POST dizisi ile sonuçlanacaktır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.