Ben bir php sayfasına POST olarak aşağıdaki gönderir:
{a:1}
Bu, isteğin gövdesidir (POST isteği).
Php, bu değeri ayıklamak için ne yapmam gerekir?
var_dump($_POST);
çözüm değil, çalışmıyor.
Ben bir php sayfasına POST olarak aşağıdaki gönderir:
{a:1}
Bu, isteğin gövdesidir (POST isteği).
Php, bu değeri ayıklamak için ne yapmam gerekir?
var_dump($_POST);
çözüm değil, çalışmıyor.
Yanıtlar:
POST veya PUT isteğinin varlık gövdesine (veya başka bir HTTP yöntemine) erişmek için:
$entityBody = file_get_contents('php://input');
Ayrıca, STDIN
sabit zaten açık bir akıştır php://input
, böylece alternatif olarak şunları yapabilirsiniz:
$entityBody = stream_get_contents(STDIN);
Gönderen I PHP manuel giriş / Ç akışları docs :
php: // input , istek gövdesinden ham verileri okumanızı sağlayan salt okunur bir akıştır. POST istekleri halinde, bu kullanım tercih edilir php: // input yerine
$HTTP_RAW_POST_DATA
özel php.ini yönergelerinin bağlı değildir olarak. Ayrıca,$HTTP_RAW_POST_DATA
varsayılan olarak doldurulmadığı durumlarda , always_populate_raw_post_data işlevini etkinleştirmek için daha az bellek yoğun bir alternatiftir. php: // input , enctype = "multipart / form-data" ile kullanılamaz.
Özellikle sen dikkat isteyeceksiniz php://input
akışı, ne olursa olsun bir web SAPI'de erişmek nasıl, aranabilir durumda . Bu, yalnızca bir kez okunabileceği anlamına gelir. Büyük HTTP varlık gövdelerinin rutin olarak yüklendiği bir ortamda çalışıyorsanız, girdiyi akış formunda (yukarıdaki ilk örnek gibi arabelleğe almak yerine) korumak isteyebilirsiniz.
Akış kaynağını korumak için böyle bir şey yardımcı olabilir:
<?php
function detectRequestBody() {
$rawInput = fopen('php://input', 'r');
$tempStream = fopen('php://temp', 'r+');
stream_copy_to_stream($rawInput, $tempStream);
rewind($tempStream);
return $tempStream;
}
php://temp
bellek tüketimini yönetmenize izin verir, çünkü belirli miktarda veri saklandıktan sonra şeffaf bir şekilde dosya sistemi depolamasına geçer (varsayılan olarak 2M). Bu boyut php.ini dosyasında veya ekleyerek manipüle edilebilir /maxmemory:NN
nerede, NN
bayt olarak, geçici bir dosya kullanmadan önce hafızada tutmak için maksimum veri miktarıdır.
Tabii ki, giriş akışında arama yapmak için gerçekten iyi bir nedeniniz yoksa, bir web uygulamasında bu işlevselliğe ihtiyacınız olmamalıdır. HTTP isteği varlık gövdesini bir kez okumak genellikle yeterlidir; uygulamanız ne yapacağınızı anlarken müşterilerinizi tüm gün bekletmeyin.
Content-Type: multipart/form-data
Üstbilgi belirten istekler için php: // girişinin kullanılamadığını unutmayın ( enctype="multipart/form-data"
HTML formlarında). Bu, PHP'nin form verilerini $_POST
süper küresel olarak ayrıştırmış olmasından kaynaklanır .
php://input
application/x-www-form-urlencoded
multipart/form-data
php://input
mevcut. Bu yüzden (Hızlı) CGI yapılandırmaları stream_get_contents(STDIN)
çalışmazken file_get_contents("php://input")
çalışacaktır.
dizideki değeri döndür
$data = json_decode(file_get_contents('php://input'), true);
$data
her bir değerin istediğiniz şekilde kodlanıp kodlanmadığını kontrol etmek için ilişkilendirilebilir dizi arasında döngü yapmanız gerekir . Olaylara "akış-veri tipi" yolu basit olabilir, ancak bir akış filtresi kullanarak "akış formunda" kodlama ile uğraşmak kadar etkili olmayabilir. Kodlama sorunlarını ele almıyorsanız ve sadece sterilize edip onaylıyorsanız, bir adımı kaçırıyorsunuz demektir.
Boşluğun olası bir nedeni $_POST
, isteğin artık olmaması POST
veya POST
artık olmamasıdır ... Posta olarak başlamış olabilir, ancak bir yere yönlendirilmiş 301
veya bir 302
yere yönlendirilmiş olabilir GET
!
Durumun $_SERVER['REQUEST_METHOD']
bu olup olmadığını kontrol edin .
Bunun neden olmasa da hala olması gerektiği konusunda iyi bir tartışma için bkz. Https://stackoverflow.com/a/19422232/109787 .
POST
ancak inceledikten sonra bunun olduğunu gösteriyordu GET
. URL'imin /
sonuna a ekledikten sonra POST gösterilmeye başlandı. Tuhaf!
Değişkeni kontrol edin$HTTP_RAW_POST_DATA
php://input
. $HTTP_RAW_POST_DATA
ile kullanılamaz enctype="multipart/form-data"
.
HTTP PECL uzantısını yüklediyseniz, http_get_request_body()
gövde verilerini dize olarak almak için bu işlevi kullanabilirsiniz .
Eğer varsa pecl / http uzantı yüklü, ayrıca bu kullanabilirsiniz:
$request = new http\Env\Request();
$request->getBody();
function getPost()
{
if(!empty($_POST))
{
// when using application/x-www-form-urlencoded or multipart/form-data as the HTTP Content-Type in the request
// NOTE: if this is the case and $_POST is empty, check the variables_order in php.ini! - it must contain the letter P
return $_POST;
}
// when using application/json as the HTTP Content-Type in the request
$post = json_decode(file_get_contents('php://input'), true);
if(json_last_error() == JSON_ERROR_NONE)
{
return $post;
}
return [];
}
print_r(getPost());
json_last_error() == JSON_ERROR_NONE
olduğunu false
, boş bir dizi döner gerektiğini. Birisi XML veya YAML gönderdiyse ne olur? İçerik Türü için bir test ekleyin ve oradan gidin.
$_SERVER
Kontrol edilecek faydalı değerler için süper küresel olana bakınız .
http_get_request_body()
açık bir şekilde belgelerin gövdesini PUT
ve POST
isteklerini almak için yapılmıştır http://php.net/manual/fa/function.http-get-request-body.php
$_POST
süper küresel aracılığıyla mevcut olmadığından komut dosyalarına gönderilen ham girdi verilerine nasıl erişeceğini bilmiyor . PHP'nin karşılık gelen bir süper küresel olmadığı için bu PUT isteklerinde de (özellikle) doğrudur.