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();
}
?>
補一下其他建議
一、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)」,後續再看要怎麼處理
給個範例,直接寫在 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');
<?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();
}
?>
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>
統整一下及加上我一些以前用的案例統統都給你。
1.判斷法:
目前你用的就是判斷法。直接用elseif(波動拳)的方式,一直判斷下去。
這其實並不是很好的方式就是了。
2.對應法:
這是搭配 in_Array 的方式,這招很多地方可以看到。
有點類似白名單的方式
相關程式碼,很多人都寫了。我就不在重覆。