iT邦幫忙

1

PHP 做到 當後方URL變數為空 ==>轉到首頁

index.php =>

<?php 
 //選單 
include("header.php");  
 //內容
include("main.php"); 
 //頁腳
include("footer.php"); 
?> 

main.php =>

<?php
    $p = $_GET['p'];
    
if(isset($_GET['p'] )) {

    //內容
	if($p == 'home'){                

        include("pages/home.php");   //首頁

    }elseif ($p == 'about'){

        include("pages/about.php");    //關於我們

}else{
		header(‘Location:?p=home’);
        exit();
	}
?>
5
淺水員
iT邦研究生 5 級 ‧ 2020-07-27 12:05:23
最佳解答

補一下其他建議

一、isset 判斷完之後再取值:

<?php
if(isset($_GET['p'] )) {
    $p = $_GET['p']; //建議把這個拉進來,
    //以下略

二、如果後面不是要寫 html ,?> 可以不寫。原因是可以避免送出一些不必要的字元(換行、空白等

三、如果要送 header ,最好在尚未有任何輸出的狀態下送。因為先前已經 include("header.php"); ,而後面才送轉址的 header ,這很可能造成轉址失敗。假使你開發時可以成功,那也只是因為 php 的緩衝機制,在沒手動處理的狀況下,不應該依賴這個功能。舉例來說,下面這段程式碼在我這邊是轉址失敗的。

<?php
echo 'aaa';
header('Location: /');

錯誤訊息:

Warning: Cannot modify header information - headers already sent by (...

因此我會比較建議「路由邏輯(Route)」都寫在 index.php
然後「選單」、「內容」、「頁腳」視為「視圖(view)」,後續再看要怎麼處理

淺水員 iT邦研究生 5 級 ‧ 2020-07-27 12:25:13 檢舉

給個範例,直接寫在 index.php 而不需要 main.php

<?php
//輸出視圖函式
function makeView($viewPage) {
    include("header.php");
    include('pages/'.$viewPage.'.php');
    include("footer.php");
    exit();
}

//路由處理
if(isset($_GET['p'])) {
    $p = $_GET['p'];
    $arr=['home', 'about'];
    if(array_search($p, $arr)!==false) {
        makeView($p);
    }
}

header('Location:?p=home');
3
listennn08
iT邦研究生 2 級 ‧ 2020-07-27 10:32:24
<?php
    $p = $_GET['p'];
    
    if (isset($_GET['p'] )) {
        //內容
        if ($p == 'home') {
            include("pages/home.php");   //首頁
        } elseif ($p == 'about') {
            include("pages/about.php");    //關於我們
        // <-- 少了 }
    } else {
        header(‘Location:?p=home’); // <-- header("Location: ?p=home");
        exit();
    }
?>
4
japhenchen
iT邦研究生 1 級 ‧ 2020-07-27 11:38:13

javascript跟PHP的方法都給你試試

<!DOCTYPE html>
<?php
if (empty($_GET)) {  //  GET 是空的
	header("Location:/");
    //直接跳轉,不再本頁處理,或是你要用include也可
	die;
	exit;
}
?>
<html>

<head>
	<script>
        // url 帶參數一定有個?跟=
		if (location.href.search(/[\?]+.*[\=]+/i)===-1)
			location.href = "/";  // 假設你們的首頁是 / 
	</script>
</head>
<body>
	有GET
</body>
</html>
2
浩瀚星空
iT邦超人 1 級 ‧ 2020-07-27 14:49:48

統整一下及加上我一些以前用的案例統統都給你。

1.判斷法:
目前你用的就是判斷法。直接用elseif(波動拳)的方式,一直判斷下去。
這其實並不是很好的方式就是了。

2.對應法:
這是搭配 in_Array 的方式,這招很多地方可以看到。
有點類似白名單的方式

相關程式碼,很多人都寫了。我就不在重覆。

摳宇 iT邦新手 5 級 ‧ 2020-07-27 16:48:24 檢舉

=.= 為啥最佳解答不能有兩個XD

我要發表回答

立即登入回答