2010-09-22 13 views
8

Tôi đã xuất hiện để kiểm tra php, tôi đã được hỏi một câu hỏi mà tôi không thể tìm thấy câu trả lời.Câu hỏi phỏng vấn: Chúng ta có thể có tiếng vang trước tiêu đề không?

Câu hỏi là như thế này.

echo "MESSI is injured!!"; 
header("Location:somepage.php"); 

Interviewer muốn cả tiêu đềvang được viết trên cùng một trang.

Tôi tự hỏi như thế nào là nó possible.It nên đưa ra một số lỗi như

headers already sent by (đầu ra bắt đầu lúc .....

Là nó thực sự có thể viết tiếng vang và tiêu đề vào cùng một trang !!!

+0

thử nghiệm php gì vậy? Nó là gì? Xin lỗi để được nosy. –

Trả lời

29

Bạn có thể sử dụng Output Buffering như

ob_start(); 
echo "MESSI is injured!!"; 
header("Location:somepage.php"); 
ob_end_flush(); 

Vấn đề là chúng tôi không thể gửi tiêu đề sau khi chúng tôi bắt đầu gửi đầu ra. Để giải quyết điều này, chúng tôi đệm đầu ra. Chức năng ob_start sẽ chuyển bộ đệm đầu ra thành. Trong khi đầu ra đệm đang hoạt động không có đầu ra được gửi từ kịch bản (khác với tiêu đề), thay vào đó đầu ra được lưu trữ trong một bộ đệm nội bộ. Vì vậy, đầu ra echo sẽ được lưu vào bộ đệm. Tiếp theo, chúng tôi gửi tiêu đề mà không có bất kỳ vấn đề nào vì chúng tôi chưa tiết lộ bất kỳ đầu ra nào. Cuối cùng, chúng tôi gọi ob_end_flush để xóa nội dung bộ đệm bên trong và dừng bộ đệm đầu ra.

+1

Hoàn toàn đúng –

+0

Trên thực tế nếu bạn có bộ đệm đầu ra, * không có gì * sẽ được gửi trước khi bạn xóa nó. Thậm chí không tiêu đề. (iirc) –

3

Bạn có thể làm điều đó miễn là tất cả các cuộc gọi tiêu đề đến trước khi bất kỳ đầu ra không tiêu đề được gửi (điều này bao gồm những điều pesky như newlines/khoảng trắng). Vì vậy,

<?php 
header("Location:somepage.php"); 
echo "MESSI is injured!!"; 
?> 

nên làm các trick

+4

Không hoàn toàn trả lời câu hỏi: viết echo “” ** và sau đó ** header() – codaddict

+0

Chính xác. Đầu ra đệm nên giải quyết vấn đề, mặc dù. – matsolof