2009-12-04 33 views
8

Tôi là người mới sử dụng PHP và tôi gặp sự cố với biến POST đôi khi bị trống khi tôi gửi chúng. Phần mà làm cho điều này khó khăn cho tôi để tìm ra là điều này không xảy ra mỗi lần, và tôi thường có thể nhận được dữ liệu bài viết trong chương trình PHP của tôi bằng cách đơn giản làm mới trang. Đôi khi nó sẽ mất một vài lần, nhưng một khi dữ liệu đã đi qua một lần, nó sẽ tiếp tục đi qua tốt.

Các ứng dụng PHP khác (Wordpress và các ứng dụng khác) hoạt động tốt và không bao giờ đưa ra bất kỳ lỗi nào, vì vậy tôi chắc chắn có vấn đề với ứng dụng php của tôi.

Tôi có PHP 4.2.9 được cài đặt trên một máy chủ CentOS 5.2, và có KeepAliveTimeout thiết lập để 1.

Mã cho ứng dụng trong đó tôi xử lý dữ liệu nộp:

<?php 
    session_start(); 
    if (isset($_SESSION['username'])) { 
     $expire = time() + (60*60*24*30); 
     setcookie("username", $_SESSION['username'], $expire); 
    } 

    header("Cache-control: no-cache"); 

    if (!isset($_SESSION['username'])) { 
     header('Location: ./login.php'); 
     die(); 
    } 

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

    var_dump($_POST); 
    echo "\n"; 
    var_dump($_SERVER); 
?> 

Bất kỳ sự giúp đỡ tất cả sẽ được đánh giá cao

Chỉnh sửa: Tôi đã tìm thấy một sự khác biệt giữa yêu cầu đăng bài làm việc và những yêu cầu không thành công. Firebug nói với tôi rằng khi bài đăng không thành công, trạng thái là chuyển hướng 302 thay vì 200 ok. Im không thực sự chắc chắn những gì có thể gây ra điều đó, nhưng tôi có kiểm soát bộ đệm tiêu đề trong việc gửi biểu mẫu giống như nó xuất hiện trong đoạn mã trên.

Bất kỳ ý tưởng nào?

+0

Biểu mẫu trông như thế nào bạn đang BÀI ĐĂNG? –

+0

Điều này có xảy ra ở tất cả các trình duyệt không? – DisgruntledGoat

+0

bạn cũng có thể kiểm tra biến $ _REQUEST chứa chậu và nhận dữ liệu – NDM

Trả lời

0

Bạn có thể kiểm tra biến $ _REQUEST là tổ hợp các mảng $ _POST và $ _GET. Nếu các biến không có ở đó, chúng không được gửi đi và vấn đề có thể nằm ở phía máy khách.

Bạn có thể sử dụng các công cụ phân tích lưu lượng mạng, ví dụ: Tab Net của Firebug để xem những gì thực sự được gửi đến máy chủ.

+0

Tôi đã kiểm tra biến REQUEST và kết quả là như nhau. Tôi cũng đã kiểm tra yêu cầu đăng bài bằng Firebug và các biến luôn được truyền chính xác. Nó chỉ là ứng dụng php mà không nhận được chúng. – Marc

+1

Có vẻ như ứng dụng PHP đang thay đổi các biến trong chính nó sau đó. Tôi cũng sẽ đặt một dấu kiểm tại điểm vào - các biến sẽ được OK ở đó - và sau đó tìm ra phần nào của mã là "loại bỏ" chúng. –

+0

Tôi đã thử làm điều này, tuy nhiên vấn đề vẫn xảy ra khi điều duy nhất tôi có trong mã php của tôi là var_dump ($ _ POST); – Marc

0

Biến số $_POST được điền bởi công cụ PHP, không phải bởi bất kỳ ứng dụng nào. Vì vậy, nếu nó trống, nó chỉ trống và mã của bạn cần tính đến điều đó, giống như cách bạn đã làm cho các biến số $_SESSION$_SERVER.

7

Bạn quên tham số name = trên thẻ INPUT của mình.

<input type="text" id="xyz" name="xyz" value="123"/> 
+0

Câu trả lời này phải được đánh dấu là nguyên nhân có khả năng nhất cho người mới bắt đầu. Tôi đã có chính xác vấn đề đó - làm việc trong javascript tôi đã có tất cả các thẻ "id" quy định và họ đã làm việc, nhưng khi trang đã được gửi đến máy chủ tôi đã mong đợi giá trị $ _POST là id. Thêm thẻ "tên" đã sửa nó ngay lập tức. – Bill

0
header('Location: ./login.php'); 

Theo mặc định này sẽ gửi các mã trạng thái 302 là tốt. Hầu hết các trình duyệt sẽ yêu cầu mục tiêu 302 với yêu cầu GET, bất kể loại yêu cầu ban đầu. Nếu bạn muốn cả hai yêu cầu chứa dữ liệu POST thì bạn có thể thử 307:

header('Location: ./login.php', true, 307); 

Nhưng bạn có thể điều này không hoạt động trên tất cả các trình duyệt (nó sẽ hoạt động ở bất kỳ thứ gì không cổ). Bạn có thể muốn kiểm tra lại logic của bạn ở đây mặc dù, nó không bình thường để yêu cầu khách hàng double-POST.

Ngoài ra, bạn có biết rằng bạn đọc $_SESSION['username'] nhưng dường như không bao giờ viết thư cho nó?

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