2010-07-13 21 views
9

Nếu đây là file_1.php

<?php 

    $_POST["test_message"] = "Hello, world";  

    header("Location: http://localhost/file_2.php"); 
?> 

và đây là file_2.php

<html> 
<head> 
</head> 
<body> 

<?php 

    if (!(isset($_POST["test_message"]))) 
    echo "Test message is not set"; 
    else 
    echo $_POST["test_message"]; 
?> 

</body> 
</html> 

đầu ra là Test message is not set

Mà làm cho tôi tự hỏi, nếu một thậm chí có thể viết thư cho $ _POST và, có tự hỏi rằng, tôi tự hỏi nếu nó là thực hành xấu để làm như vậy. Tôi có nên chỉ cho phép các biểu mẫu có các nút gửi và phương thức = viết ghi lên $ _POST cho tôi hay viết thư lên $ _POST để chuyển dữ liệu giữa các tệp?

+0

chưa kể nếu đây là thực hành không tốt: đơn giản là cách bạn có thể chuyển dữ liệu sang tệp khác sẽ không hoạt động. – oezi

+1

sử dụng biến phiên –

+1

nó có thể không phải là thực hành xấu nếu bạn lọc dữ liệu bài đăng với một phần của ứng dụng trước khi một phần khác của ứng dụng nhận được và hai phần cần được tách hoàn toàn. Nếu không, có thể là một cách tốt hơn để làm bất cứ điều gì bạn đang làm. –

Trả lời

14

Bạn muốn sử dụng $_SESSION để thay thế.

$_POST là thông tin đã được đăng lên trang hiện tại và không duy trì trạng thái giữa các lần tải trang, nó sẽ chỉ được điền nếu bạn thực sự đăng nội dung nào đó lên tệp thứ hai khi chuyển hướng. Nếu bạn đã bao gồm tệp thứ hai, thay vì chuyển hướng qua tiêu đề, thì những gì bạn đã thực hiện sẽ hoạt động vì biến số $_POST vẫn sẽ được đặt.

$_SESSION sẽ duy trì trạng thái giữa các trang, vì vậy sẽ thực hiện những gì bạn muốn khi chuyển hướng.

Để sử dụng $_SESSION đúng cách, trước tiên bạn cần phải gọi session_start(); để bắt đầu phiên. Có thêm thông tin trong số PHP manual.

+0

Điều này giống như câu trả lời +1 – Mawg

6

$_POST["test_message"] trống trong tệp2.php vì bạn chưa đăng bất kỳ thứ gì lên tập lệnh đó. Mảng $_POST được điền bằng cách POST dữ liệu biểu mẫu, bạn có thể điền $_GET bằng cách thêm biến GET vào chuyển hướng tiêu đề hoặc lưu trữ dữ liệu trong $_SESSION nếu bạn cần dữ liệu tồn tại giữa các trang.

+0

bạn đang nói rằng $ _POST chỉ có thể được viết từ một dạng HTML với "emthod = post"? – Mawg

+1

như hướng dẫn sử dụng PHP cho biết $ _POST là "... Một mảng kết hợp các biến được chuyển đến tập lệnh hiện tại thông qua phương thức HTTP POST". http://php.net/manual/en/reserved.variables.post.php – robjmills

+0

+1 cho câu trả lời và +1 để nhận xét. Cảm ơn – Mawg

3

Thật tuyệt khi làm điều đó. Nếu bạn nhìn vào tất cả các khung công tác php lớn (CI, bánh, joomla, vv), tất cả chúng đều được gửi qua trang index.php 'một bộ điều khiển đến đích cuối cùng (thường sử dụng một số mã trợ giúp). Do đó, biến $ _POST được chôn sâu một vài lớp. Hãy nhớ rằng biến $ _POST CHỈ hợp lệ cho thời điểm tạm thời đó trong khi yêu cầu http đang hoạt động, vì vậy khi yêu cầu hoàn tất, tất cả các biến được đặt lại thành null.

Biến $ _SESSION CÓ THỂ được sử dụng nếu bạn muốn thuyết phục giữa các yêu cầu - tho nó phụ thuộc vào yêu cầu và kịch bản của bạn.

+0

+1 cho "tạm thời". Cảm ơn, tôi có thể gắn bó với $ _SESSION – Mawg

1

Các $_POST chỉ nên được sử dụng với hình thức không như thế này:

$_POST["test_message"] = "Hello, world"; 

Bạn cũng cần phải chắc chắn rằng bạn tránh bất kỳ rủi ro an ninh, chức năng sử dụng như stripslashesmysql_real_escape_string (khi chèn dữ liệu trong cơ sở dữ liệu)

Để duy trì trạng thái giữa các trang, bạn cần sử dụng sessions thay thế.

2

Xem xét từ góc độ của máy chủ web: nó nhận được yêu cầu file_1.php, chạy tệp PHP đó và gửi lại kết quả, bao gồm tiêu đề Location:.Sau đó một thời gian sau, nó nhận được một yêu cầu riêng biệt cho file_2.php, do đó, nó tải và chạy tệp đó và gửi lại kết quả, đó là một trang HTML. Vấn đề là, hai tập tin được sử dụng trong các yêu cầu HTTP hoàn toàn riêng biệt. Mỗi cái được chạy trong một môi trường riêng biệt, ví dụ, bất kỳ thay đổi nào được thực hiện cho các biến trong một không được phản ánh trong một biến khác. Số điện thoại $_POST trong yêu cầu cho file_1.php là một biến riêng biệt từ $_POST trong yêu cầu file_2.php.

Theo như câu hỏi thực tế của bạn: Tôi nghĩ bạn có thể viết thư cho $_POST, nhưng có thể không được đề xuất. Đó không thực sự là biến số cho.

+0

+1 Cảm ơn bạn đã khiến tôi suy nghĩ về điều đó; đã làm cho nó rất rõ ràng. – Mawg

1

Nói chung, $_POST chỉ là một mảng PHP thông thường được điền dữ liệu POST trên mỗi yêu cầu. Do đó, bạn có thể viết các giá trị của riêng mình vào $_POST.

Nhưng ...

1) Mã của bạn không hoạt động như header() cuộc gọi của bạn trong file_1.php lệnh cho trình duyệt để đưa ra một yêu cầu mới mà kết quả trong một hoàn toàn mới (và trống) $_POST mảng trong file_2.php. Mảng sẽ trống vì bạn không đăng bất kỳ thứ gì lên file_2.php.

2) Theo ý kiến ​​của tôi thực tế là xấu ... Lấy dữ liệu từ $_POST (hoặc $_GET hoặc $_REQUEST) cho biết bạn đang truy xuất dữ liệu người dùng cần xử lý hết sức thận trọng (lọc, khử trùng, thoát, .. .). Việc ghi dữ liệu nội bộ vào các mảng này sẽ trộn lẫn dữ liệu nội bộ và bên ngoài dẫn đến sự nhầm lẫn và các lỗ hổng bảo mật có thể xảy ra.

+0

+1 điểm tốt về bảo mật. Cảm ơn – Mawg

1

Ví dụ của bạn không thể hoạt động, hãy xem câu trả lời khác giải thích lý do.

Hơn nữa việc sử dụng $ _POST superglobal làm lưu trữ dữ liệu là một ý tưởng khá tồi tệ. Sử dụng giải pháp chia sẻ biến cụ thể nếu bạn cần (như cơ sở dữ liệu, đăng ký bộ nhớ im, phiên, cookie, v.v.)

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