2008-12-09 24 views
31

Làm thế nào tôi có thể nhận được một hàm PHP vào một trang web cụ thể khi nó được thực hiện đang chạy?Chuyển hướng đến URL được chỉ định khi hoàn thành tập lệnh PHP?

Ví dụ:

<?php 
    //SOMETHING DONE 
    GOTO(http://example.com/thankyou.php); 
?> 

tôi sẽ thực sự như sau ...

<?php 
    //SOMETHING DONE 
    GOTO($url); 
?> 

tôi muốn làm một cái gì đó như thế này:

<?php 
    //SOMETHING DONE THAT SETS $url 
    header('Location: $url'); 
?> 

Trả lời

61
<? 
ob_start(); // ensures anything dumped out will be caught 

// do stuff here 
$url = 'http://example.com/thankyou.php'; // this can be set based on whatever 

// clear out the output buffer 
while (ob_get_status()) 
{ 
    ob_end_clean(); 
} 

// no redirect 
header("Location: $url"); 
?> 
+0

Bạn đã đánh bại tôi. Có thể đáng nói đến, vì các tiêu đề chỉ có thể được gửi nếu không có đầu ra nào được tạo ra, toàn bộ trang/ứng dụng có thể cần phải được bao bọc trong ob_start(). –

+0

Khi tôi thử điều này, tôi nhận được lỗi này: "Cảnh báo: Không thể sửa đổi thông tin tiêu đề - tiêu đề đã được gửi bởi (đầu ra tại example.php: 1)" Bạn có biết tại sao điều này xảy ra không? – JoshFinnie

+0

Điều này có nghĩa là bạn xuất ra một cái gì đó trước ob_start() hoặc sau khối ob_end_clean(). Đầu ra đệm (các chức năng ob_ *) chăm sóc đệm bất kỳ đầu ra cho phép bạn sử dụng nó hoặc (như trong trường hợp này) loại bỏ nó sau này. Đặt mã của bạn tại // làm công cụ ở đây –

13

Nếu "something done" không kích hoạt bất kỳ đầu ra nào qua echo/print/etc, sau đó:

<?php 
    // SOMETHING DONE 

    header('Location: http://stackoverflow.com'); 
?> 
3
<?php 

// do something here 

header("Location: http://example.com/thankyou.php"); 
?> 
5

Lưu ý rằng điều này sẽ không làm việc:

header('Location: $url'); 

Bạn cần phải làm điều này (đối với việc mở rộng biến):

header("Location: $url"); 
+2

Hoặc, tất nhiên: tiêu đề ('Vị trí:'. $ Url); –

28

Bạn luôn có thể chỉ cần sử dụng thẻ để làm mới trang - hoặc có thể chỉ cần thả javascript cần thiết vào trang ở cuối trang sẽ làm cho trang chuyển hướng. Bạn thậm chí có thể ném điều đó vào một chức năng tải trọng, vì vậy sau khi hoàn thành, trang được chuyển hướng

<?php 

    echo $htmlHeader; 
    while($stuff){ 
    echo $stuff; 
    } 
    echo "<script>window.location = 'http://www.yourdomain.com'</script>"; 
?> 
+0

Tại sao tôi không nghĩ về điều đó! Cảm ơn bạn đã suy nghĩ bên ngoài hộp ... – JoshFinnie

+0

Điều này làm việc tốt cho tôi - Tiêu đề đã được gửi do rất nhiều diễn ra trong khu vực CMS, điều này là hoàn hảo – Simon

+0

Câu trả lời hay ..... Nó làm việc cho tôi .. –

0

đừng quên đặt 'chết' sau khi bạn thực hiện chuyển hướng trước phần còn lại của mã trên trang được chạy ném. a. nếu bạn có chức năng tiêu đề tiếp tục xuống trang, chúng sẽ ghi đè lên các mã tiếp theo.

b: im giả sử bạn không muốn phần còn lại của mã trên trang được chạy và lý do tại sao bạn đặt chuyển hướng này ở vị trí đầu tiên [có thể].

dụ:

<?php 

// do something here 

header("Location: http://example.com/thankyou.php"); 
die(); 

//code down here now wont get run 

?> 
0

Dưới đây là một giải pháp cho "tiêu đề đã được gửi" vấn đề. Giả sử bạn đang xác thực và gửi biểu mẫu qua email. Đảm bảo rằng mã php là thứ đầu tiên trên trang của bạn ... trước bất kỳ loại tài liệu và thẻ đầu và tất cả nhạc jazz đó. Sau đó, khi POST quay trở lại trang, mã php sẽ đến trước và không gặp phải các tiêu đề đã gửi đi.

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