To pytanie jest prawie identyczna do pytania bez odpowiedzi-letniego:PHP POST zmienna nie określono przy użyciu Chrome + XHR
HTTP-POST XHR not working in chrome.
Miałem nadzieję znaleźć rozwiązanie i mogę zaoferować więcej szczegółów niż oryginalne pytanie.
Tło
Mam skrypt php Sever-boczny, który ma pobierać dane z żądania POST formularza lub użyciem nagłówków XHR. Kiedy testuję witrynę za pomocą formularza do przesłania, działa on w Chrome i IE9. Jednak gdy generuję żądanie za pomocą XHR, zmienna PHP POST jest niezdefiniowana podczas korzystania z Chrome po stronie klienta. Takie zachowanie jest niespójne: około 1 na 20 prób, php akceptuje dane.
Sprawdziłem strumień php://input
i widzę, że dane pocztowe są wysyłane na serwer we wszystkich przypadkach; i zauważ, że kilka małych nagłówków HTTP ($_SERVER
) różni się między przypadkami testowymi.
Kod
po stronie serwera:
<?php
echo file_get_contents("php://input") . "\n";
print_r($_SERVER);
print_r($_POST);
?>
wersja formularza po stronie klienta (Chrome i IE9 zarówno praca)
<form action="scriptName.php" method="post">
Field: <input type="text" name="myField"><br>
<input type="submit" value="Submit">
</form>
wersja Client strona XHR (IE9 działa zawsze, Chrome działa około 5% czasu)
<script>
function postToURL(url,data)
{
// Typical XHLHttpRequest declarations are removed for brevity
// - checks browser type and declares xmlhttp accordingly
// - defines a onreadystatechange handle
xmlhttp.open("POST",url,false);
xmlhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
xmlhttp.send(data);
}
</script>
...
<form>
<button type="button" onClick="postToURL('scriptname.php','myField=test');">
Test
</button>
</form>
Wyjście
We wszystkich przypadkach dane żądanie ciała (php://input
) zwraca taką samą wartość. Kolektory są w większości takie same, ale chrom dodaje [HTTP_PRAGMA] => no-cache
w trybie użyciem nagłówków XHR
Zmienna $_POST
jest zdefiniowana jako [myField] => test
wyjątkiem chrom + użyciem nagłówków XHR.
Pytania
gdzie jest problem prawdopodobnie występuje? Czy jest coś nie tak z nagłówkami HTTP, czy powinienem wyglądać po stronie serwera. Jakieś pomysły?
Kiedy wywoływane jest 'postToURL()'? – jeremy
Jest wywoływana z zdarzenia 'onClick' przycisku. – nicholas
Czy możesz nam to pokazać? – jeremy