星期二, 五月 02, 2006

PHP header Location 寫成 function 的優缺點

我們很常用的一個寫法

header("Location: http://plog.longwin.com.tw/");

這個寫法基本上沒有什麼問題, 但是寫在 function 裡面就有些問題寫了, 詳見下述說明.

先簡單說結論就是:

若要寫成 function, 在 heade Location 下面要加 exit, 否則最好就不要寫成 function 來呼叫.

以下用個簡單範例來說明一下:

function redirect($url)
{
    header("Location: $url");
    return True;
}
if('xxx' == $data) {
    redirect($url);
}
..... 一些資料流程 ....
header("Location: $url2");

假設是上面的這支程式, 中間沒有吐出任何字, 只是純處理資料, 照理說我們想要在 $data='xxx' 的狀況下做 redirect 到 $url 去, 但是最後程式跑下來會變成跑到 $url2 去.

主要原因就是我沒有在 function 裡面做 exit; 的動作, 他的實際流程會跑如下述:

  1. 判斷 $data == 'xxx'
  2. redirect 到 $url 去, 然後實際已經導過去了.
  3. 但是此程式因為是 function, 只是呼叫, 呼叫完程式會繼續往下做.
  4. 程式跑到下面看到要 redirect 到 $url2 去, 於是再次將 url 導到 $url2 去.

簡單說就是, function 呼叫如果沒有給他結束, 那程式的基本流程還是會繼續做到完, 若有其它導向, 就會跟著被導到非預期的地方去.

所以 redirect 的 function 寫法要加 exit 比較保險, 如下範例:

function redirect($url)
{
    header("Location: $url");
    exit;
}
相關標籤

this is comment icon 不好意思,想說說我的看法,對你的標題有意見。 [回覆]

可以幫我把上面的砍掉嗎,例子不見了:p

不好意思,想說說我的看法,對你的標題有意見。
先看下面的例子

$url = "http://tw.yahoo.com";
header("Location: $url");

$url = "http://www.google.com";
header("Location: $url");

一樣會跑到google
"PHP header Location 不要寫成 function"
聽起來像是一個結論
就我的評估判斷你對某些概念不瞭解,所以你看到的是如此
若你去研究http的概念和php怎麼個跑法。
相信妳會看到不同的觀點
:-)

Comment by php (05/04/2006 10:52)

this is comment icon 回 php [回覆]

嗯嗯~ 不好意思, 這標題真的取的很差, 我修改了一下, 感謝您的指導 m(_ _)m.
可否請教您指的 http概念 跟 php跑法 指的是??
就小弟的觀念是如下:
http 接收 header, 而照 header 指定的去跑.
php 送 header 出去, 而寫成 function 並不是不妥, 只是沒有加 exit, 會造成程式繼續往下執行, 進而送出第二個 header.
能否請大大指出小弟的認知錯誤是在哪邊呢? 謝謝~

Comment by Tsung (05/04/2006 10:59)

this is comment icon 我只是就我看到的來做"評估判斷" [回覆]

我只是就我看到的來做"評估判斷",
並沒有說你一定有錯誤認知。
只是覺得標題會讓人有錯誤的聯想。
想跟你討論如此而已。
:)

Comment by php (05/04/2006 13:08)

this is comment icon 回 php [回覆]

嗯嗯~ 了解~ 非常感謝您的提醒~~
很高興跟您討論~~ 謝謝~~ :D

Comment by Tsung (05/04/2006 13:37)

this is comment icon 请教楼主一个问题 [回覆]

请问博主,header 到另外一个页面后浏览器会有后退,当点后退后,为什么刚刚设置的头就没有了呢?

我认为是当点浏览器后退后,应该跳转到 header 指定的URL,既后退不到刚刚的页面。

后退功能是保存HTTP头的吧?

就像不用header,提交完交单 刷新浏览器会出现 警告:会重新发送表单信息一样。

Comment by 孙杨 (12/28/2007 01:24)

this is comment icon 回 孙杨 [回覆]

厄, 有點難懂..
我想, 說明一下大概是這樣子的狀況.
A頁 -Send-> B頁 header -> C頁.
然後 在 C 點選回上一頁, 應該會回到 A頁.
因為 B頁只是做一個轉導的動作, 我猜瀏覽器的設計, 如果單純 header 做轉址的動作的話, 他可能會直接略過, 因為不這樣子做 C -> B, 馬上 B 又會被導到 C, 那上一頁的做用就不存在了.
不知道這樣子是否有解到您的問題? @.@a

Comment by Tsung (12/29/2007 14:21)
Add this page to del.icio.us Add this page to Yahoo Taiwan's bookmark Add this page to MyShare

發表迴響

標題

內容 (限制 1000 字)

暱稱

電子郵件

個人網頁


 authimage


PS: 若無法留言, 請先確認是否有打開 JavaScript, 造成您的困擾, 實在萬分對不起 Orz...(如果無法留言, 勞煩可以發信給我好嗎? 謝謝.)
PS2: 若您的留言被誤判, 我都會再自行看過, 不需要一直重覆張貼~