:::

3. 資料庫規劃與表單製作

一、資料庫規劃

  1. 點擊MySQL的Admin叫出phpMyAdmin,或直接輸入網址:「http://localhost/phpmyadmin/」亦可。
  2. 點擊左側選單中「新增」,於右側「建立新資料庫」,如「todo」,「校對」選擇「utf8mb4_general_ci」。
  3. 建立需要的資料表,例如「list」資料表,欄位數 9 。
  4. 接著建立以下資料表:
    類型 註解
    sn mediumint(8) 自動遞增 流水號
    title varchar(255) 待辦事項
    directions text 描述
    end date 到期日
    priority enum('高','中','低') 優先順序
    assign varchar(255) 指派對象
    done enum('0','1') 是否完成
    create_time datetime 建立時間
    update_time datetime 最後更新時間
  5. 注意,一定要有流水號(勾選AI,即自動遞增)
  6. 利用【預覽 SQL】存下 SQL 語法
    CREATE TABLE `todo`.`list` ( 
        `sn` MEDIUMINT(8) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '流水號' ,
        `title` VARCHAR(255) NOT NULL COMMENT '待辦事項' ,
        `directions` TEXT NOT NULL COMMENT '描述' ,
        `end` DATE NOT NULL COMMENT '到期日' , 
        `priority` ENUM('高','中','低') NOT NULL COMMENT '優先順序' ,
        `assign` VARCHAR(100) NOT NULL COMMENT '指派對象' ,
        `done` ENUM('1','0') NOT NULL COMMENT '是否完成' ,
        `create_time` DATETIME NOT NULL COMMENT '建立時間' ,
        `update_time` DATETIME NOT NULL COMMENT '最後更新時間' ,
        PRIMARY KEY (`sn`)
    ) ENGINE = MyISAM DEFAULT CHARSET=utf8mb4;

二、讓PHP8連線到MySQL資料庫

  1. 設定資料庫密碼
    • 在 phpMyAdmin 介面選到使用者帳號的地方,會看到帳號的部分有 % 的帳號,先把這帳號給刪掉,這帳號表示資料庫可以匿名登入,這非常不安全請一定要刪除。
    • 點選 root 的編輯權限,接著點擊修改密碼

    • 到 D:\xampp\phpMyAdmin 開啟 config.inc.php,在 password 後面輸入你剛剛所設定的密碼,將19行的值改為http,如此,登入phpMyAdmin時就會詢問帳號密碼。
  2. PHP常數設定

    • 常數是一旦設定就不會變,和變數可以隨時指派其值不一樣。

    • 常數可以直接在函數中使用。

    • 一般常數會以大寫前面加底線來辨識(實際上,不加底線或是用小寫也是可以)。

    • 常數定義方式:

      define('常數名稱', '對應值');
    • index.php
      //常數設定
      define('_DB_LOCATION', 'localhost');
      define('_DB_ID', 'root');
      define('_DB_PASS', '12345');
      define('_DB_NAME', 'todo');
  3. MySQL資料庫連線方法:
    • https://www.php.net/manual/en/mysqli.quickstart.connections.php
    • 程式碼( index.php )
      //實體化資料庫物件
      $mysqli = new mysqli(_DB_LOCATION, _DB_ID, _DB_PASS, _DB_NAME);
      if ($mysqli->connect_error) {
          throw new Exception('無法連上資料庫:' . $mysqli->connect_error);
      }
      $mysqli->set_charset("utf8mb4");
    • 指定欲連線的來源位置(一般為localhost),資料庫帳號、密碼及資料庫名稱。
    • 若無錯誤訊息,表示連線成功。連線後,需設定用utf8mb4編碼來擷取資料。
    •  練習:將資料庫連線加到 header.php

三、PHP函數

  1. 函數有兩種,一組是PHP內建函數,另一種是自訂的函數。
  2. 一個函數通常都有其獨特的功能,可視為具特定功能的小零件,直接呼叫使用即可,如: phpinfo() ,有些有傳回值,有些沒有;有些需要輸入參數,有些不用。
  3. 完整函數手冊:http://www.php.net/manual/en/funcref.php
  4. 函數基本結構:傳回值 函數名稱(參數1,參數2...);
  5. 函數傳回值有:string(字串)、int(整數)、array(陣列)、object(物件)、bool(布林值)、void(無傳回值)、mixed(不一定)、new(建立物件)
  6. 練習內建函數:顯示今日日期 (找手冊)。

四、PHP自訂函數

  1. 自訂函數的基本語法為:
    function 函數名稱($參數1='預設值' , $參數2='預設值',...){
        global $外面的變數1, $外面的變數2;
        //函數內容,任何有效的 PHP 程式碼,包括其它函數和class定義 ;
        return 傳回值;
    }
  2. 參數不見得要有,傳回值也不一定要有。
  3. 函數可放在檔案中任何地方,放在呼叫之前或之後都沒關係。使用時,呼叫函數名稱即可。
  4. 建立一個function.php檔案,若同一個函數會被兩個以上的檔案呼叫時,即可把該函數放到此檔,以便讓其他檔案共用,例如可以把連線資料庫寫成函數試試。
    • function.php:
      function link_db()
      {
          //實體化資料庫物件
          $mysqli = new mysqli(_DB_LOCATION, _DB_ID, _DB_PASS, _DB_NAME);
          if ($mysqli->connect_error) {
              throw new Exception('無法連上資料庫:' . $mysqli->connect_error);
          }
          $mysqli->set_charset("utf8mb4");
          return $mysqli;
      }
    • header.php:
      // 引入function.php
      require_once 'function.php';
  5. 超級全域變數可直接在函數中使用,外面的一般變數無法進到函數中,除非做成參數或是用 global 宣告。當然,函數裡面的變數外面也無法取用,除非 return 出去。
    • 常見超級全域變數
      • 以「陣列」方式存在,超級全域變數可在任何地方被拿來使用(包括函數內)。
      • $_GET、$_POST、$_REQUEST:來自表單的變數。
      • $_SERVER:環境變數,$_SERVER['PHP_SELF']取得目前網址。
      • $_COOKIE:給cookie用的全域變數,cookie是存在使用者電腦的一個小檔案
      • $_SESSION:給session的全域變數,session是存在伺服器中的一個小檔案
      • $_FILES:上傳檔案時會用到的超級全域變數。
      • footer.php 加入:
        // 取得目前網址
        $smarty->assign('action', $_SERVER['PHP_SELF']);

五、Smarty 條件判斷

  1. 基本語法:
    {if 判斷條件}
      //條件為真執行
    {elseif 判斷條件}
      //elseif 的條件為真執行
    {else}
      //條件為假時執行
    {/if}
  2. index.tpl :
    {if $content}
      <div class="table-responsive">
        <table class="table table-bordered border-primary table-hover">
          <thead class="table-primary">
            <tr>
              <th scope="col">是否完成</th>
              <th scope="col">標題</th>
              <th scope="col">到期日</th>
              <th scope="col">優先順序</th>
              <th scope="col">指派對象</th>
            </tr>
          </thead>
          <tbody>
            {foreach $content as $c}
              <tr>
                <td>{$c.done}</td>
                <td>{$c.directions}</td>
                <td>{$c.end}</td>
                <td>{$c.priority}</td>
                <td>{$c.assign}</td>
              </tr>
            {/foreach}
          </tbody>
        </table>
      </div>
    {else}
      <div class="d-grid col-12 col-md-3 mx-auto">
        <a class="btn btn-info" href="{$action}?op=post_form" role="button">新增待辦事項</a>
      </div>
    {/if}

六、PHP 條件判斷

  1. 三元運算式:
    • 條件 ? 真動作一 :假動作二
      $op = isset($_REQUEST['op']) ? $_REQUEST['op'] : "";
    • 練習:將 op 送到 index.tpl 樣板檔,並判斷 op=='post_form' 切換到樣板檔 post_form.tpl
  2. if  的用法:
    if(判斷條件){
        //條件為真執行
    }elseif(判斷條件){
        //elseif的條件為真執行
    }else{
        //條件為假時執行
    }
    • 由上往下判斷,一旦為真,就執行指定動作。後面就不再繼續判斷。
    • elseif 和 else 均可省略,視情況使用即可。
    • elseif 可以有很多組,其餘的只能有一組。若是太多elseif,建議改用switch
    • 練習:利用 if 判斷頁面切換,並建立自訂函數 list_all()
  3. switch 用法:
    • switch 可以判斷某個變數值,當該變數值符合指定條件時,就去執行哪些動作,基本上就是「一個口令,一個動作」之意。
    • switch 完整語法為:
      switch ($變數) {
        case '特定值':
          # 動作...
          break;
        
        default:
          # 動作...
          break;
      }
    • case 到 break 就是完整一組,可以自行添加無限多組。
    • break; 不加也符合語法,但會一直執行到下方動作。
    • default 則是當變數跟任一個「特定值」都不相符時要進行的動作。
    • 練習:請利用 $op 來完成 switch 迴圈。
  4. match 用法 ( PHP8 新增):
    • 優點:https://iter01.com/576346.html
    • 改寫switch
      match ($op) {
          'post_form'=> $content='新增表單',
          default=> list_all(),
      };

七、 製作表單 post_form.tpl

  1. https://bootstrap5.hexschool.com/docs/5.0/forms/layout/#horizontal-form 選擇【水平表單】貼到 post_form.tpl 並修改所需欄位
    <form>
      <div class="row mb-3">
        <label for="inputEmail3" class="col-sm-2 col-form-label">Email</label>
        <div class="col-sm-10">
          <input type="email" class="form-control" id="inputEmail3">
        </div>
      </div>
    </form>
  2. 基本語法:
    <form action="送至.php" method="post" role="form">
      表單元件
    </form>
  3. 基礎的input 表單元件
    • <input type="格式" name="名稱" value="預設值" placeholder="佔位字元">
    • 常用有: text (文字框)、 hidden (隱藏框)、 password (密碼框)、 file (上傳)
    • 其中的 name 最重要!一定要有!因為 name 送出後,會變成 PHP 的變數名稱。
  4. 其他常用的表單元件 HTML 語法及屬性
    • 大量文字框: <textarea name="名稱">預設值</textarea>
    • 下拉選單: <select name="名稱" size=1>選項</select>
      • (1) 選項: <option value="值">選項文字</option>
      • (2) 若要預設選取:要在<option>中加入 selected="selected"
      • (3) 若希望下拉選單可以複選,除了 name 要加上 [] 外,還要加上 multiple 屬性。
    • 單選框: <input type="radio" name="名稱"  value="值 1">選項文字 1
      • (1) 單選框通常會有好幾個選項,一組選項就要一組 <input> ,name 都要一樣才行!
      • (2) 若要預設選取,要加上 checked="checked"
    • 複選框: <input type="checkbox" name="名稱[]"  value="值 1">選項文字 1
      • (1) 複選框通常同時會有好幾個選項,一組選項就要一組 <input>
      • (2) name 都要一樣才行!而且因為是複選,所以 name 要加上 [] ,如此會送出陣列。
      • (3) 若要預設選取,要加上 checked="checked"
    • <input type="submit" name="send" value="按鈕文字" class="btn btn-primary" /> 可做出按鈕效果
  5. input 元件參考 https://www.w3schools.com/html/html_form_input_types.asp