op
變數給 index.php
,用來告知它現在要做什麼index.php
中要讀取用GET方式(有接 ?
的都是GET方式)傳來的變數用 $_GET['op']
即可。$_POST['op']
即可讀取。
請建立一個PHP8函數,可以用來過濾外部傳入的變數,變數類型可以是數字、文字、陣列、日期...等,傳入方式同時支援POST及GET(不須自己指定),亦可設定預設值。過濾後,需可防止XSS攻擊(不須防止SQL注入),最後傳出過濾後的變數值。
最後產生了一個函數,因為這個函數可能到處都會被用到,所以,我們直接建立一個 function.php
,並將這些共用的函數直接貼到function.php
中即可:
function filter_input_var(string $key, string $type = 'string', mixed $default = null): mixed
{
// 檢查變數是否存在於POST或GET中
$value = $_POST[$key] ?? $_GET[$key] ?? null;
// 如果變數不存在,返回預設值
if ($value === null) {
return $default;
}
// 根據類型進行過濾
switch ($type) {
case 'int':
$filtered = filter_var($value, FILTER_SANITIZE_NUMBER_INT);
return $filtered !== false ? (int)$filtered : $default;
case 'float':
$filtered = filter_var($value, FILTER_SANITIZE_NUMBER_FLOAT, FILTER_FLAG_ALLOW_FRACTION);
return $filtered !== false ? (float)$filtered : $default;
case 'email':
$filtered = filter_var($value, FILTER_SANITIZE_EMAIL);
return filter_var($filtered, FILTER_VALIDATE_EMAIL) ? $filtered : $default;
case 'url':
$filtered = filter_var($value, FILTER_SANITIZE_URL);
return filter_var($filtered, FILTER_VALIDATE_URL) ? $filtered : $default;
case 'date':
$date = DateTime::createFromFormat('Y-m-d', $value);
return ($date && $date->format('Y-m-d') === $value) ? $value : $default;
case 'array':
if (!is_array($value)) {
return $default;
}
return array_map(function($item) {
return is_string($item) ? htmlspecialchars($item, ENT_QUOTES, 'UTF-8') : $item;
}, $value);
case 'string':
default:
return htmlspecialchars($value, ENT_QUOTES, 'UTF-8');
}
}
function.php
中順便加入簡單的除錯工具,方便日後觀察變數
//除錯工具
function dd($array = [])
{
header('HTTP/1.1 200 OK');
header("Content-Type: application/json; charset=utf-8");
die(json_encode($array, 256));
}
index.php
及 admin.php
中,都需要先用 require
將 function.php
引入,這樣就可以任意使用裡面的函數
<?php
require 'function.php';
require 'vendor/autoload.php';
use Smarty\Smarty;
$smarty = new Smarty();
// 過濾外部傳來變數
$op = filter_input_var('op');
if
或 switch
:
if
語句來處理簡單和複雜的邏輯判斷,較有彈性。switch
語句來根據單一變數的不同值執行不同的操作,當值的選項較多時特別有用。switch
語句,修改 index.php
加入:
<?php
require 'function.php';
require 'vendor/autoload.php';
use Smarty\Smarty;
$smarty = new Smarty();
// 過濾外部傳來變數
$op = filter_input_var('op');
switch ($op) {
case 'embed':
# code...
break;
default:
# code...
break;
}
$smarty->display('index.tpl');
admin.php
也比照辦理:
<?php
require 'function.php';
require 'vendor/autoload.php';
use Smarty\Smarty;
$smarty = new Smarty();
// 過濾外部傳來變數
$op = filter_input_var('op');
switch ($op) {
default:
# code...
break;
}
$smarty->display('index.tpl');