2013-01-02 21 views
7

Câu hỏi này gần giống với câu hỏi chưa được trả lời cũ:Biến POST của PHP không được xác định khi sử dụng Chrome + XHR

HTTP-POST XHR not working in chrome.

Tôi đã hy vọng tìm được giải pháp và có thể cung cấp nhiều chi tiết hơn câu hỏi ban đầu.

nền

Tôi có một kịch bản php sever-side đó là nghĩa vụ để lấy dữ liệu POST từ một hình thức hoặc XHR yêu cầu. Khi tôi kiểm tra trang web bằng cách sử dụng biểu mẫu để gửi, nó hoạt động trong Chrome và IE9. Tuy nhiên, khi tôi tạo yêu cầu bằng XHR, biến POST của PHP không được xác định khi sử dụng Chrome ở phía máy khách. Hành vi này không phù hợp: khoảng 1 trong 20 lần thử, php chấp nhận dữ liệu.

Tôi đã kiểm tra luồng php://input và thấy rằng dữ liệu bài đăng đang được gửi đến máy chủ trong mọi trường hợp; và lưu ý rằng một số ít tiêu đề HTTP ($_SERVER) khác nhau giữa các trường hợp kiểm tra.

Server side:

<?php 
    echo file_get_contents("php://input") . "\n"; 
    print_r($_SERVER); 
    print_r($_POST); 
?> 

phiên bản hình thức bên khách hàng (Chrome và IE9 cả công việc)

<form action="scriptName.php" method="post"> 
     Field: <input type="text" name="myField"><br> 
     <input type="submit" value="Submit"> 
</form> 

phiên bản khách hàng bên XHR (IE9 luôn luôn làm việc, hoạt động của Chrome khoảng 5% thời gian)

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

Output

Trong mọi trường hợp dữ liệu theo yêu cầu cơ thể (php://input) trả về giá trị tương tự. Các tiêu đề chủ yếu giống nhau, nhưng Chrome thêm [HTTP_PRAGMA] => no-cache vào chế độ XHR

Biến số $_POST được định nghĩa là [myField] => test ngoại trừ trường hợp Chrome + XHR.

Câu hỏi

đâu là vấn đề có thể xảy ra? Có cái gì đó sai với các tiêu đề HTTP có thể, hoặc tôi nên tìm kiếm phía máy chủ. Ý tưởng nào?

+0

Khi nào thì 'postToURL() 'được gọi là? – jeremy

+0

Nó được gọi là từ một sự kiện nút 'onClick'. – nicholas

+0

Bạn có thể cho chúng tôi thấy điều đó không? – jeremy

Trả lời

1

Nơi mã này trong dòng đầu tiên của trang của bạn

<?php ob_start(); error_reporting(E_ALL & ~E_NOTICE & ~8192); ?> 
<!-- Ignore Errors , Header Sent Report --> 

và mã này trong dòng cuối cùng của trang của bạn

<!-- Ignore Header Sent Error --> 
<?php ob_flush(); ?> 
<!-- Ignore Header Sent Error --> 

tôi hy vọng rằng sẽ giúp bạn

Các vấn đề liên quan