簡體   English   中英

沒有header()或meta的PHP重定向

[英]PHP redirect without header() or meta

我正在嘗試設計一個執行某些數據庫操作的頁面,然后將用戶重定向回到他們來自的頁面。 問題是我使用require()函數來獲取與數據庫的連接,因此已經發送了標頭。 元標記是不可能的,因為我希望它看起來像所有進程都是從它們來自的頁面完成的。 有小費嗎? 有沒有辦法可以使用require()header()或者我必須刪除一個? 是否有header()的替代方案?

如果在發送某些內容之前無法發送header() ,請通過放置ob_start();使用輸出緩沖 ob_start(); 在發送任何內容之前,在腳本的開頭。 這樣,任何內容都將存儲在緩沖區中,直到腳本結束或手動發送緩沖區內容時才會發送。

另一方面,除非包含的腳本發送它們,否則只require另一個文件就不會生成任何標題/內容。 最常見的“隱藏”原因是在<?php ?>標簽之前或之后沒有注意到空白。

正如Artefacto所指出的,連接到數據庫不應該要求任何輸出。 修復你要包含的內容(例如database_connect.php)而不是輸出。 在“已發送標頭”問題上查看此搜索 ,這可能有助於您找到“隱藏”輸出。

ob_start(); // start output buffering
echo "<html......"; // You can even output some content, it will still work.
.
.
.
.
.
header("Location: mypage.php");
ob_flush(); //flush the buffer

在這種情況下,所有輸出都被緩沖。 這意味着首先處理標題,然后輸出結果......

在已經發送了一些內容后,您無法發送任何標題。 header()調用移到require()調用之前。

在將任何數據發送到客戶端后,您無法發送標頭。

但是,使用require並不表示輸出內容。 如果我理解您的權利,您可以包含數據庫文件,運行查詢,然后重定向用戶。 這完全有效。

如果你需要發送一些輸出(為什么你需要進行重定向?)另一種選擇是使用輸出緩沖。 通過使用輸出緩沖,當您回顯它時,您不會將數據發送到瀏覽器,而是將其存儲在緩沖區中。 當您調用ob_end_flush或到達腳本末尾時,將發送數據。 ob_end_flush之后,您將無法發送任何新標頭。 使用ob_start啟動輸出緩沖。

當我使用輸出緩沖時,可以使用帶有require() header() 這意味着整個腳本被緩沖並在腳本結束時首先發送。

我這樣做了

ob_start("ob_gzhandler");  //begin buffering the output

require_once('/classes/mysql.php');

// Some code where I access the database.

header('/somepage.php');
exit;

ob_flush(); //output the data in the buffer

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM