:::
4-1 傳入變數讓程式知道現在要做什麼
- 我們有傳一個
op變數給index.php,用來告知它現在要做什麼 index.php中要讀取用GET方式(有接?的都是GET方式)傳來的變數用$_GET['op']即可。- 用POST方式(大部份表單都是POST)傳來的變數用
$_POST['op']即可讀取。
一、傳入的變數需要過濾:
- 過濾輸入來去除或轉換潛在的危險字符,還要能轉換特殊字符,防止XSS攻擊。
- 我們讓AI來代勞:
請建立一個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');
二、讓程式可以用 $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');
4. 讓表單開始有作用