2008-11-22 45 views
6

Tôi mới sử dụng PHP và tôi đang cố gắng thực hiện điều gì đó có thể là hành vi không tốt và cũng có thể là không thể. Tôi về cơ bản chỉ hack một cái gì đó với nhau để kiểm tra kiến ​​thức của tôi và xem những gì PHP có thể làm.PHP mở một trang web khác có dữ liệu POST

Tôi có một trang web có biểu mẫu thu thập dữ liệu. Điều đó được gửi đến một tập lệnh PHP thực hiện một loạt các xử lý - nhưng không thực sự hiển thị bất cứ điều gì quan trọng. Điều tôi muốn là khi quá trình xử lý được thực hiện, tập lệnh sẽ yêu cầu trình duyệt mở một trang khác, nơi kết quả được hiển thị.

Tôi biết tôi có thể sử dụng tiêu đề ('Vị trí: page.php'); nhưng tôi không thể tìm ra cách cung cấp dữ liệu POST với điều này. Làm thế nào tôi có thể làm điều đó? Ngoài ra, có cách nào khác để yêu cầu trình duyệt mở một trang khác không?

CHỈNH SỬA: Những gì tôi lấy từ câu trả lời là có thể để thực hiện việc này bằng nhiều cách khác nhau nhưng tốt hơn hết là chỉ xử lý và hiển thị mã trong một tệp. Tôi hài lòng với điều đó; đây là một thử nghiệm nhiều hơn bất cứ điều gì.

Trả lời

4

Là nó thực sự cần thiết để gọi trang khác sau khi chế biến được thực hiện? Tôi có lẽ muốn làm như sau:

<form method="post" action="display.php"> 
... 
</form> 

display.php:

if ($_POST) { 
    require_once(process.php); 
    process($_POST); 
    display_results; 
} 

với process.php chứa mã cần thiết cho việc xử lý yêu cầu bài.

Hoặc, bạn có thể sử dụng một cái gì đó giống như thư viện cURL để chuyển kết quả xử lý đến trang do bạn chỉ định. Không biết nếu đó thực sự là những gì bạn đang mặc dù.

-3

Tôi hy vọng tôi nhận được quyền hạn chế của bạn. Bạn có thể thử này:

  1. Điều chỉnh hình thức của bạn trông như thế này:

form method = "POST" action = "process_data.php"

2. Sau đó, bạn tạo tệp process_data.php, xử lý dữ liệu một cách đáng ngạc nhiên.
Và trong tập tin này bạn sử dụng tiêu đề:
Ví dụ:

$ đầu = sprintf ("? Page.php data1 =% d data2 =% d", $ data1, data2 $);
tiêu đề ($ head);

Tôi hy vọng tôi có thể trợ giúp.

+0

hm ... nếu bạn bỏ phiếu cho tôi, có thể bạn có thể cho tôi lý do?!?! – Nick

+0

Tôi đã không downvote bạn, nhưng ví dụ mã bạn đã đưa ra sẽ không làm việc –

+0

tiêu đề ($ head) nên được tiêu đề ('Location:'. $ Head); Ví dụ này trông giống như một thực tế xấu mặc dù .... – alex

16

Bạn có thể lưu trữ dữ liệu đó trong phiên, ví dụ: trong file đầu tiên để xử lý các bài

session_start(); 
$_SESSION['formdata'] = $_POST; //or whatever 

sau đó bạn có thể đọc nó trên trang tiếp theo như

session_start(); 
print_r($_SESSION['formdata']); 

hoặc bạn có thể vượt qua nó thông qua GET: (nhưng theo ý kiến ​​này là một ý tưởng tồi)

header('Location: page.php?' . http_build_query($_POST)); 

Nếu bạn thực hiện điều đó, hãy đảm bảo bạn xử lý/xác nhận bổ sung trên page.php khi người dùng độc hại có thể thay đổi biến. cũng có thể bạn có thể không cần toàn bộ bài truyền đến trang tiếp theo

Sửa

tôi nên làm rõ rằng tôi nghĩ là lựa chọn thứ hai là có thể tồi tệ hơn, khi bạn được giới hạn bởi kích thước của dữ liệu bạn có thể gửi thông qua nhận được và nó có thể kém an toàn hơn khi người dùng rõ ràng có thể thao tác dữ liệu hơn.

+0

Tôi muốn giới thiệu bạn về đề xuất phiên và từ chối bạn để nhận đề xuất, do đó không bỏ phiếu cho bạn. – pilsetnieks

+0

@Nouveau: đã đồng ý, tôi chỉ muốn thể hiện rằng đó là một tùy chọn không quốc tịch hơn, nhưng tôi nên làm rõ rằng nó ít thích hợp hơn –

+0

Tôi đồng ý với Nouveau. Đề nghị thứ hai thực sự là thực hành xấu –

0

Không có cách nào để chuyển hướng trình duyệt của người dùng đến trang đơn lẻ và gửi yêu cầu POST. Đó sẽ là một chút rủi ro bảo mật, nơi bất kỳ liên kết nào có thể khiến bạn thực hiện bất kỳ việc gửi biểu mẫu nào đến một trang web tùy ý mà không có bất kỳ đầu mối nào về những gì sắp xảy ra.

Nói tóm lại, nó không thể

0

AFAIK này thường được thực hiện như một quá trình hai bước:

  1. On form.php, POST dữ liệu đến kịch bản process.php
  2. Quá trình này .php script xử lý dữ liệu nhưng không bao giờ xuất ra bất kỳ thứ gì, nó luôn gọi tiêu đề ("Location: asdasd") để chuyển hướng đến trang success.php hoặc fail.php (nếu có)
2

Bạn có thể sử dụng Jav aScript như một công việc xung quanh bẩn:

<form id="redirect_form" method="post" action="http://someserver.com/somepage.php"> 
    <input type="hidden" name="field_1" value="<?php echo htmlentities($value_1); ?>"> 
    <input type="hidden" name="field_2" value="<?php echo htmlentities($value_2); ?>"> 
    <input type="hidden" name="field_3" value="<?php echo htmlentities($value_3); ?>"> 
</form> 
<script type="text/javascript"> 
    document.getElementById('redirect_form').submit(); 
</script> 

(kịch bản nên được dưới hình thức)

0

Làm tất cả trong một tập lệnh và chỉ xuất HTML khác nhau cho kết quả.

<?php if($doingForm) { ?> 

html for form here 

<?php } else { ?> 

html for results 

<? } ?> 
+0

Đẩy làm mới ở đây sau khi '$ doinForm = true' sẽ gửi lại biểu mẫu. Điều này có thể gây ra hành vi không mong muốn. Xem http://adamv.com/dev/articles/getafterpost – alex

0

Sự cố này đã làm tôi thất vọng một thời gian. CMS tùy chỉnh của tôi thực hiện một số xử lý, tải lên và thao tác khá phức tạp và đôi khi ouputs các thông báo lỗi và thông tin khá dài, không phù hợp để chuyển đổi dữ liệu GET và tôi luôn muốn tránh sự cố tải lại dữ liệu INSERT, nhưng chưa tìm thấy một giải pháp thích hợp.

Tôi tin rằng cách chính xác để thực hiện việc này là tạo mảng thông báo cho từng trạng thái có thể - mỗi thông báo hoặc lỗi bạn có thể muốn hiển thị, và sau đó bạn chỉ cần gửi số lỗi/tin nhắn dễ dàng hơn nhiều để xử lý hơn các chuỗi dữ liệu dài, nhưng đó là điều tôi luôn luôn tránh xa cá nhân vì tôi thấy nó hơi tẻ nhạt và rườm rà. Thành thật mà nói, điều này có lẽ chỉ là lười biếng trên một phần của tôi.

Tôi rất thích giải pháp lưu trữ biến SESSION, nhưng điều này đặt ra câu hỏi về cách bạn đảm bảo dữ liệu SESSION được hủy đúng cách? Miễn là bạn đảm bảo bạn chỉ gửi thông tin (tin nhắn/lỗi) và không phải dữ liệu nên/có thể được lưu trữ (và do đó có khả năng nhạy cảm), đây phải là vấn đề có thể tránh được.

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