2009-03-24 98 views
7

Tìm kiếm không tìm thấy câu hỏi tương tự, vì vậy: Làm cách nào để dữ liệu POST được PHP sử dụng để tạo một trang được chuyển từ trang đó sang trang được tạo PHP khác? Tôi có:Truyền dữ liệu POST từ trang này sang trang khác bằng PHP

  • Biểu mẫu trên trang 1 gửi dữ liệu đến tập lệnh PHP qua POST.
  • Trang 2 được tạo bởi tập lệnh đó và hiển thị một hoặc nhiều đồ thị được tạo bởi chương trình bên ngoài bằng cách sử dụng các mục nhập trên trang 1 và cơ sở dữ liệu phía sau. Trang này cũng có một biểu mẫu khác với các tùy chọn để tạo lại biểu đồ bằng các tùy chọn mới (ví dụ: phóng to hoặc cắt bớt (các) biểu đồ).
  • Nếu được yêu cầu, trang 3 sẽ được tạo với cùng một tập lệnh PHP sử dụng dữ liệu POST được dán lại với nhau từ trang 1 và 2. Ngoại trừ các biểu đồ, ngoại hình cơ bản sẽ giống như trang 2.
  • Trang 4, 5 , 6 ... phải được tạo theo cách tương tự như trang 3.

Vì vậy, làm cách nào để đặt dữ liệu POST được sử dụng để tạo trang 2 vào dữ liệu POST cho trang 3?

CHỈNH SỬA: Do chính sách tổ chức, không thể sử dụng cookie (vì vậy các phiên không khả thi). GET là không mong muốn bởi vì chúng tôi không muốn đầu vào hiển thị trong URL.

Trả lời

13

Tôi nhớ lại đang gặp khó khăn với vấn đề này từ lâu, tự hỏi tại sao tôi không thể chuyển hướng bằng tiêu đề POST đã sửa đổi. Lý do là chuyển hướng thực sự được coi là GET.

Bất kể, bạn cần lưu trữ các biến bài đăng trong các trường ẩn.

<input type="hidden" name="someValueFromPageOne" value="blah"> 

Tôi khuyên bạn nên thêm tiền tố cho tất cả tên trường từ mỗi biểu mẫu để dễ dàng phân biệt chúng trong giai đoạn hợp nhất của bạn ở cuối.

<input type="hidden" name="pageOne_firstName" value="Joe"> 
<input type="hidden" name="pageTwo_streetNumber" value="22"> 

Edit: Như những người khác đã đề cập, sự bền bỉ dữ liệu sử dụng phiên là một khả năng, nhưng điều này sẽ trở thành một vấn đề rất phức tạp của việc duy trì trạng thái tạm thời mà những thứ như làm mới trang hoặc sử dụng nút quay lại có thể làm cho khó khăn để duy trì. Trừ khi bạn đang phải đối mặt với trường hợp cực đoan, việc lưu dữ liệu lâu hơn dễ dàng hơn bằng cách sử dụng các trường vì chúng tồn tại làm mới và hành vi trình duyệt khác dễ dàng hơn nhiều.

+0

Cảm ơn! Tôi cảm thấy như tôi nên nghĩ về điều này, nhưng tôi chưa bao giờ thực sự sử dụng các lĩnh vực ẩn trước đây, và tôi đã sửa chữa một giải pháp trong chính PHP, thay vì sử dụng HTML. – PTBNL

+0

Tin tôi đi, tôi biết, tôi đã ở đó nhiều lần. Đừng quên để xác nhận tất cả các yếu tố đầu vào của bạn trên các hình thức VÀ khi bạn kết hợp dữ liệu để tránh các cuộc tấn công tiêm !!! – Soviut

2

Sử dụng GET.

Theo ý kiến ​​của tôi, yêu cầu POST phải sửa đổi điều gì đó (ví dụ: thêm bản ghi vào cơ sở dữ liệu). Yêu cầu GET sẽ truy xuất nội dung nào đó (ví dụ: kết quả của truy vấn tìm kiếm).

Nếu bạn vẫn muốn sử dụng POST, hãy xem các phiên PHP.

+2

Tuy nhiên, có giới hạn kích thước rõ ràng (và thấp) đối với dữ liệu GET. – cletus

+0

@cletus, tôi biết, nhưng OP không đưa ra bất kỳ dấu hiệu nào về số lượng dữ liệu cần thiết để gửi giữa các yêu cầu trang. – strager

2

Phiên là một nỗi đau và nếu bạn cần chúng, bạn đã triển khai chúng.

Như @Soviut đã nói ở trên, trường nhập ẩn có thể là cách để thực hiện việc này.

+0

Đồng ý, phiên là khả thi, nhưng gây phiền nhiễu để duy trì trạng thái chính xác cho đúng trang. Không phải đề cập đến rất tài nguyên đói ở phía máy chủ với nhiều dữ liệu trôi nổi xung quanh. – Soviut

0

Nếu bạn quyết định cắn đường phiên với tùy chọn dbms, tôi đã may mắn thiết kế một lớp trạng thái để giữ nội dung này và tuần tự hóa một đối tượng sử dụng JSON tới một trường lớn trong bản ghi phiên.

2

Wez Furlong gần đây đã viết phiên bản php5 trên blog của mình (bài HTTP tiêu đề từ php, mà không cURL):

function do_post_request($url, $data, $optional_headers = null) 
{ 
$params = array('http' => array(
'method' => 'post', 
'content' => $data 
)); 
if ($optional_headers!== null) { 
$params['http']['header'] = $optional_headers; 
} 
$ctx = stream_context_create($params); 
$fp = @fopen($url, 'rb', false, $ctx); 
if (!$fp) { 
throw new Exception("Problem with $url, $php_errormsg"); 
} 
$response = @stream_get_contents($fp); 
if ($response === false) { 
throw new Exception("Problem reading data from $url, $php_errormsg"); 
} 
return $response; 
} 

Trong bài ông đề cập rằng ông luôn luôn phải tìm cách để làm điều này. Vui vì anh ấy là một trong những nhà phát triển cốt lõi!

+0

Giả sử bạn có ý nghĩa này: http://netevil.org/blog/2006/nov/http-post-from-php-without-curl có vẻ đầy hứa hẹn, cảm ơn (mặc dù năm 2006 không phải là "gần đây" đối với tôi! :-p) Có lẽ đó là sự thiếu kinh nghiệm PHP của tôi, nhưng tôi đã không làm cho nó hoạt động, và không thấy nó sẽ gửi dữ liệu POST từ trang này đến trang khác. – PTBNL

+0

Loại thông tin nào là dữ liệu $ mong đợi? – dangel

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