:::

4-1 傳入變數讓程式知道現在要做什麼

  1. 我們有傳一個 op 變數給 index.php,用來告知它現在要做什麼
  2. index.php 中要讀取用GET方式(有接 ? 的都是GET方式)傳來的變數用 $_GET['op'] 即可。
  3. 用POST方式(大部份表單都是POST)傳來的變數用 $_POST['op'] 即可讀取。

一、傳入的變數需要過濾:

  1. 過濾輸入來去除或轉換潛在的危險字符,還要能轉換特殊字符,防止XSS攻擊。
  2. 我們讓AI來代勞:
    請建立一個PHP8函數,可以用來過濾外部傳入的變數,變數類型可以是數字、文字、陣列、日期...等,傳入方式同時支援POST及GET(不須自己指定),亦可設定預設值。過濾後,需可防止XSS攻擊(不須防止SQL注入),最後傳出過濾後的變數值。

     

  3. 最後產生了一個函數,因為這個函數可能到處都會被用到,所以,我們直接建立一個 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');
        }
    }

     

  4. function.php 中順便加入簡單的除錯工具,方便日後觀察變數
    //除錯工具
    function dd($array = [])
    {
        header('HTTP/1.1 200 OK');
        header("Content-Type: application/json; charset=utf-8");
        die(json_encode($array, 256));
    }
    

     

  5. index.php admin.php 中,都需要先用 require function.php 引入,這樣就可以任意使用裡面的函數
  6. 接著利用它來過濾變數:
    <?php
    require 'function.php';
    require 'vendor/autoload.php';
    use Smarty\Smarty;
    $smarty = new Smarty();
    
    // 過濾外部傳來變數
    $op = filter_input_var('op');

     

二、讓程式可以用 $op 來判斷現在該做什麼

  1. 要讓程式進行判斷,一般用 if switch
    1. 使用 if 語句來處理簡單和複雜的邏輯判斷,較有彈性。
    2. 使用 switch 語句來根據單一變數的不同值執行不同的操作,當值的選項較多時特別有用。
  2. 在這裡我們用 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');
    

     

  3. 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');
    

     


:::

書籍目錄

展開 | 闔起

http%3A%2F%2Fcampus-xoops.tn.edu.tw%2Fmodules%2Ftad_book3%2Fpage.php%3Ftbdsn%3D2006%26tbsn%3D55

計數器

今天: 3153315331533153
昨天: 2259225922592259
總計: 7951951795195179519517951951795195179519517951951