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;
}

關於 Tsung

對新奇的事物都很有興趣, 喜歡簡單的東西, 過簡單的生活.
本篇發表於 My_Note-Programming。將永久鏈結加入書籤。

PHP header Location 寫成 function 的優缺點 有 8 則回應

  1. php 說道:

    可以幫我把上面的砍掉嗎,例子不見了:p
    不好意思,想說說我的看法,對你的標題有意見。
    先看下面的例子
    $url = "http://tw.yahoo.com";
    header("Location: $url");
    $url = "http://www.google.com";
    header("Location: $url");
    一樣會跑到google
    "PHP header Location 不要寫成 function"
    聽起來像是一個結論
    就我的評估判斷你對某些概念不瞭解,所以你看到的是如此
    若你去研究http的概念和php怎麼個跑法。
    相信妳會看到不同的觀點
    🙂

  2. Tsung 說道:

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

  3. php 說道:

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

  4. Tsung 說道:

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

  5. 孙杨 說道:

    请问博主,header 到另外一个页面后浏览器会有后退,当点后退后,为什么刚刚设置的头就没有了呢?
    我认为是当点浏览器后退后,应该跳转到 header 指定的URL,既后退不到刚刚的页面。
    后退功能是保存HTTP头的吧?
    就像不用header,提交完交单 刷新浏览器会出现 警告:会重新发送表单信息一样。

  6. Tsung 說道:

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

  7. 路人甲 說道:

    其實就像上面說的 寫不寫成 function 都一樣,
    若不加exit;都一樣往下跑!不是嗎?
    所以這一篇用途是...... (混淆視聽嗎) @@?

  8. Tsung 說道:

    不加 exit; 都會往下跑.
    這篇主要是說, 如果寫成 function, 就不要 return, 直接 exit.
    因為, 這種 bug 很難追. =.=|||

發表迴響

這個網站採用 Akismet 服務減少垃圾留言。進一步瞭解 Akismet 如何處理網站訪客的留言資料