Lab 1 - Task 1

基本資料輸出環境測試

任務說明

建立一個名為 Lab01_Task1.php 的檔案,並包含標準 HTML 標籤。在 <body> 標籤內建立一個 PHP 區塊,在瀏覽器上分行顯示您的英文姓名、年齡和體重。完成後在瀏覽器中開啟頁面以核對結果。

建議解答程式碼 (PHP)

<?php
    echo "Chan Tai Man<br />";
    print '19<br />';
    echo "65.5 kg";
?>
http://localhost/Lab01_Task1.php
Chan Tai Man
19
65.5 kg

任務說明

重寫 Task 1 的 PHP 腳本,建立適當的變數 $name$age$weight 來儲存相關數據。使用變數在瀏覽器中不同的行上顯示這三個數據。將檔案儲存為 Lab01_Task2.php

變數與資料型態規劃:

變數名稱資料型態 (Data Type)
$nameString (字串)
$ageInteger (整數)
$weightFloating-point (浮點數)

建議解答程式碼 (PHP)

<?php
    $name = "Chan Tai Man";
    $age = 19;
    $weight = 65.5;

    echo "$name <br />";
    echo "$age <br />";
    echo $weight . " kg";
?>
http://localhost/Lab01_Task2.php
Chan Tai Man
19
65.5 kg

任務說明

編寫一個名為 Lab01_Task3.php 的 PHP 腳本,在瀏覽器上列印出算術運算的完整結果。設變數 $x = 20$y = 6

需要輸出的運算式包含:加法 (+)、減法 (-)、乘法 (*)、除法 (/) 以及模數/取餘數 (%)。

建議解答程式碼 (PHP)

<?php
    $x = 20;
    $y = 6;

    $result = $x + $y;
    echo "$x + $y = $result<br />";

    $result = $x - $y;
    echo "$x - $y = $result<br />";

    $result = $x * $y;
    echo "$x * $y = $result<br />";

    $result = $x / $y;
    echo "$x / $y = $result<br />";

    $result = $x % $y;
    echo "$x % $y = $result<br />";
?>
http://localhost/Lab01_Task3.php
20 + 6 = 26
20 - 6 = 14
20 * 6 = 120
20 / 6 = 3.3333333333333
20 % 6 = 2

任務說明

輸入並執行以下 PHP 腳本,觀察並追踪變數的值在執行前置與後置遞增時的變化過程,並寫下最終的輸出結果。

<?php
$a = 100;
$x = $a++;
echo "a: " . $a . "<br />";
echo "x: " . $x . "<br />";
$x = ++$a;
echo "a: " . $a . "<br />";
echo "x: " . $x . "<br />";
?>

追踪結果與輸出說明

a: 101
x: 100
a: 102
x: 102

概念解析:
1. $x = $a++; 為後置遞增,系統先將 $a 當前的值 (100) 賦值給 $x,接著 $a 自增變為 101。
2. $x = ++$a; 為前置遞增,$a 先自增變為 102,隨後將新值 (102) 賦值給 $x

http://localhost/Lab01_Task4.php
a: 101
x: 100
a: 102
x: 102

任務說明

編寫一個 PHP 腳本以顯示目前日期,格式為 [dd mm yy]。根據目前的月份和年份,您的腳本將返回對應月份的天數。您必須使用 switch 條件控制語句。將檔案儲存為 Lab01_Task5.php

提示:閏年的判斷標準為:能被 4 整除,但不能被 100 整除(除非同時能被 400 整除)。

建議解答程式碼 (PHP)

<?php
    $today = getdate(time());
    echo "Today is " . $today['mday'] . " " . $today['month'] . " " . $today['year'] . "<br />";
    $current_month = $today['month'];

    switch($current_month){
        case "February":
            $current_year = $today['year'];
            if (($current_year % 4 == 0 && $current_year % 100 != 0) || ($current_year % 400 == 0)) {
                $leapday = 1;
            } else {
                $leapday = 0;
            }
            $days = 28 + $leapday;
            break;
        case "April":
        case "June":
        case "September":
        case "November":
            $days = 30;
            break;
        default:
            $days = 31;
    }
    echo $current_month . " has " . $days . " days.";
?>
http://localhost/Lab01_Task5.php
Today is 10 June 2026
June has 30 days.

任務說明

將 Task 5 重新改寫,改為使用 If-Else-If 條件控制結構來完成相同邏輯的月份天數計算,並將檔案儲存為 Lab01_Task6.php

建議解答程式碼 (PHP)

<?php
    $today = getdate(time());
    echo "Today is " . $today['mday'] . " " . $today['month'] . " " . $today['year'] . "<br />";
    $current_month = $today['month'];

    if ($current_month == "February") {
        $current_year = $today['year'];
        if (($current_year % 4 == 0 && $current_year % 100 != 0) || ($current_year % 400 == 0)) {
            $days = 29;
        } else {
            $days = 28;
        }
    } else if ($current_month == "April" || $current_month == "June" || $current_month == "September" || $current_month == "November") {
        $days = 30;
    } else {
        $days = 31;
    }
    
    echo $current_month . " has " . $days . " days.";
?>
http://localhost/Lab01_Task6.php
Today is 10 June 2026
June has 30 days.

任務說明

編寫一個 PHP 腳本,使用 for 迴圈 在瀏覽器上產生 1 到 10 的平方相乘列表輸出(例如:1 * 1 is 1)。將 PHP 檔案儲存為 Lab02_Task1.php

建議解答程式碼 (PHP)

<?php
    for ($n = 1; $n <= 10; $n++) {
        echo $n . " * " . $n . " is " . ($n * $n) . "<br />";
    }
?>
http://localhost/Lab02_Task1.php
1 * 1 is 1
2 * 2 is 4
3 * 3 is 9
4 * 4 is 16
5 * 5 is 25
6 * 6 is 36
7 * 7 is 49
8 * 8 is 64
9 * 9 is 81
10 * 10 is 100

任務說明

編寫一個名為 Lab02_Task2.php 的新 PHP 文件。使用短陣列語法建立一個名為 $mathMark 的陣列,其中包含以下指定數值與順序:

70, 40, 60, 50, 20, 30, 10, 100, 80, 90

  • 使用 do-while 迴圈 在瀏覽器上列印每個陣列元素。
  • 使用 while 迴圈 找出最大值(Maximum mark)並顯示在瀏覽器上。
  • 使用 for 迴圈 找出最小值(Minimum mark)並顯示在瀏覽器上。

建議解答程式碼 (PHP)

<?php
    $ar = [70, 40, 60, 50, 20, 30, 10, 100, 80, 90];
    
    // 1. do-while 輸出
    $c = 0;
    do {
        echo $ar[$c] . " ";
        $c++;
    } while ($c < count($ar));
    echo "<br />";

    // 2. while 找最大值
    $c = 0;
    $max = 0;
    while ($c < count($ar)) {
        if ($ar[$c] > $max) {
            $max = $ar[$c];
        }
        $c++;
    }
    echo "Maximum mark: " . $max . "<br />";

    // 3. for 找最小值
    $min = PHP_INT_MAX;
    for ($c = 0; $c < count($ar); $c++) {
        if ($ar[$c] < $min) {
            $min = $ar[$c];
        }
    }
    echo "Minimum mark: " . $min . "<br />";
?>
http://localhost/Lab02_Task2.php
70 40 60 50 20 30 10 100 80 90
Maximum mark: 100
Minimum mark: 10

任務說明

費氏數列(Fibonacci sequence)的規律如下:1, 1, 2, 3, 5, 8, 13, 21, 34, . . .

請使用 2 欄的 HTML 表格 印出前 20 個費氏數列元素。同時推算或思考第 50 個、第 500 個以及第 5000 個元素在記憶體中的處理方式。

建議解答程式碼 (PHP)

<?php
    echo "<table border='1'><tr><th>Term</th><th>Value</th></tr>";
    $fib = [1, 1];
    echo "<tr><td>1</td><td>1</td></tr>";
    echo "<tr><td>2</td><td>1</td></tr>";
    
    for($i = 2; $i < 20; $i++) {
        $fib[$i] = $fib[$i-1] + $fib[$i-2];
        echo "<tr><td>" . ($i+1) . "</td><td>" . $fib[$i] . "</td></tr>";
    }
    echo "</table>";
?>
http://localhost/Lab02_Task3.php
TermValue
11
21
32
43
55
68
713
821
934
1055
1189
12144
13233
14377
15610
16987
171597
182584
194181
206765

任務說明

建立一個名為 Lab03_Task1.html 的 HTML 表單頁面,包含以下欄位:

  • Name: 文字框 (text)
  • Graduate Year: 數字框 (number)
  • Alumni: 單選按鈕 (radio) - 包含 Yes 與 No 兩個選項
  • Comments: 多行文字框 (textarea)

撰寫一個 PHP 腳本 (例如 Lab03_Task1_v4.php) 來接收並處理使用者點擊 Submit 後傳送的 POST 表單數據。

防呆驗證要求: 腳本必須檢查所有欄位是否皆已填寫(包含單選按鈕是否被選取)。如果有任何欄位未填寫,必須在瀏覽器上顯示對應的警告訊息;若全部填寫正確,則輸出所有接收到的資料。

建議解答程式碼

HTML 表單 (Lab03_Task1.html)

<form method="post" action="Lab03_Task1_v4.php">
  <p>
    <label for="name">Name : </label>
    <input type="text" name="myname" id="myname">
  </p>
  <p>
    <label for="gYear">Graduate Year : </label>
    <input type="number" name="gYear" id="gYear">
  </p>
  <p>Almuni<br>
    <label><input type="radio" name="isAlumni" value="true"> Yes</label><br>
    <label><input type="radio" name="isAlumni" value="false"> No</label><br>
  <p>
    <label for="comments">Comments</label>
    <textarea name="comments" cols="60" rows="3" id="comments"></textarea>
  </p>
  <p><input type="submit" value="Submit"></p>
</form>

PHP 處理腳本 (Lab03_Task1_v4.php)

此版本使用了關聯式陣列 (Associative Array) 與 foreach 迴圈進行進階的動態驗證:

<?php
// 建立關聯式陣列儲存欄位資訊 (欄位型態, 顯示標籤)
$fields = array(
  'myname' => array('text', 'Name'),
  'gYear' => array('text', 'Graduate Year'),
  'isAlumni' => array('radio', 'Alumni'),
  'comments' => array('text', 'Comments')
);

$dataOK = true;
$dataMsg = "";
$errMsg = "";

foreach ($fields as $fieldname => $array) {
  $fieldtype = $array[0];
  $label = $array[1];
  switch ($fieldtype) {
    case 'text':
      if (strlen($_POST[$fieldname]) > 0)
        $dataMsg .= "$label = {$_POST[$fieldname]}<br>";
      else {
        $errMsg .= "$label field is empty !<br>";
        $dataOK = false;
      }
      break;
    case 'radio':
      if (isset($_POST[$fieldname]))
        $dataMsg .= "$label = {$_POST[$fieldname]}<br>";
      else {
        $errMsg .= "$label option is not selected !<br>";
        $dataOK = false;
      }
      break;
  }
}

if ($dataOK) {
  echo "<h2>All input data in the form are :</h2>";
  echo $dataMsg;
} else {
  echo "<h2 style='color:red'>Error Message :</h2>";
  echo $errMsg;
}
?>
http://localhost/Lab03_Task1_v4.php
(模擬情境 1:資料輸入完整)

All input data in the form are :

Name = Peter Parker
Graduate Year = 2026
Alumni = true
Comments = I love PHP programming!
(模擬情境 2:漏填部分資料)

Error Message :

Name field is empty !
Alumni option is not selected !

任務說明

建立一個名為 Lab03_Task2.html 的表單,包含兩個輸入框,讓使用者輸入兩個數字(first Number 與 second Number)。

撰寫一個 PHP 腳本 Lab03_Task2.php 來處理表單:

  • 接收 POST 傳送來的兩個數字。
  • 宣告一個名為 calTwoNumbers($n1, $n2) 的自定義函式,該函式需負責將傳入的兩個數字相加並 return 其總和。
  • 呼叫該函式並將結果顯示在瀏覽器上。

建議解答程式碼

HTML 表單 (Lab03_Task2.html)

<form method="post" action="Lab03_Task2.php">
  <p>
    <label for="num1">Enter first Number:</label>
    <input type="text" name="num1" id="num1">
  </p>
  <p>
    <label for="num2">Enter second Number:</label>
    <input type="text" name="num2" id="num2">
  </p>
  <p><input type="submit" value="Calculate"></p>
</form>

PHP 處理腳本 (Lab03_Task2.php)

<?php
  // 定義自定義函式
  function calTwoNumbers($n1, $n2) {
    return $n1 + $n2;
  }
?>

<h3>Calculate Two Numbers Function</h3>

<?php
  // 呼叫函式並帶入 POST 參數
  $total = calTwoNumbers($_POST['num1'], $_POST['num2']);
  
  echo "<p>The total of two numbers {$_POST['num1']} and {$_POST['num2']} is $total.</p>";
?>
http://localhost/Lab03_Task2.php

Calculate Two Numbers Function

The total of two numbers 15 and 25 is 40.

任務說明 (Challenge Exercise)

建立包含三個文字框的 HTML 表單 Lab03_Task3.html:First Name、Last Name 與 Year of Birth。

撰寫 PHP 腳本 Lab03_Task3.php 處理表單,需具備以下邏輯:

  • 使用 extract($_POST) 將陣列索引自動轉換為變數(例如 $fname, $lname, $birthyear)。
  • 防呆機制:檢查三個欄位是否皆已填寫,若有空白(使用 trim() 消除空白後長度為 0),則累加錯誤訊息,並提供返回表單的連結。
  • 動態年齡計算:利用 date('Y') 獲取伺服器當前年份,減去出生的年份計算使用者年齡。
  • 條件判斷:若年齡 >= 18 歲,顯示歡迎訊息;若 < 18 歲,則顯示拒絕/警告訊息。

建議解答程式碼

PHP 處理腳本 (Lab03_Task3.php)

<?php
  extract($_POST); // 將 $_POST 中的 key 轉換為對應的變數
  $errorMsg = "";
  $dataOK = true;
  
  // 驗證輸入欄位
  if (strlen(trim($lname)) == 0) {
    $errorMsg .= "last name is invalid! ";
    $dataOK = false;
  }
  if (strlen(trim($fname)) == 0) {
    $errorMsg .= "first name is invalid! ";
    $dataOK = false;
  }
  if (strlen(trim($birthyear)) == 0) {
    $errorMsg .= "birth year is invalid! ";
    $dataOK = false;
  }

  // 計算年齡
  $age = date('Y') - $birthyear;

  if (!$dataOK) {
    // 輸入無效時的訊息
    echo "<h3>Hello, $errorMsg</h3>";
    echo "<p>Please re-enter the information</p>";
    echo '<p><a href="Lab03_Task3.html">Go back to form</a></p>';
  } else {
    // 年齡條件判斷
    if ($age >= 18) {
      echo "<h3>Welcome! $fname $lname</h3>";
      echo "<h3>You are now $age years old.</h3>";
    } else {
      echo "<h3 style='color:red'>Sorry $fname $lname, you are under 18!</h3>";
    }
  }
?>
http://localhost/Lab03_Task3.php
(模擬情境 1:輸入 Peter Parker, 出生於 2000 年)

Welcome! Peter Parker

You are now 26 years old.

(模擬情境 2:漏填 First Name)

Hello, first name is invalid!

Please re-enter the information

Go back to form

任務說明

建立一個名為 Lab04_1.php 的檔案,連接至本機 MySQL 資料庫並從 customers 資料表中讀取所有的客戶記錄,最後使用標準的 HTML 表格將所有數據完整顯示在瀏覽器上。

顯示欄位要求: Cust ID、Cust Name、Cust Password、Cust Gender。

資料庫結構參考 (lab04.sql):

CREATE TABLE Customers(
  custID Varchar(4) NOT NULL,
  custName Varchar(30) NOT NULL,
  custPswd Varchar(6) NOT NULL,
  custGender Varchar(1) NOT NULL,
  PRIMARY KEY (custID)
);

建議解答程式碼 (Lab04_1.php)

<?php
  require_once('Connections/conn.php');
  $rs = mysqli_query($conn, $sql);
  $rc = mysqli_fetch_assoc($rs);
?>
<table border="1">
  <tr><th>Cust ID</th><th>Cust Name</th><th>Cust Password</th><th>Cust Gender</th></tr>
<?php
  do {
?>
  <tr>
    <td><?php echo $rc['custID']; ?></td>
    <td><?php echo $rc['custName']; ?></td>
    <td><?php echo $rc['custPswd']; ?></td>
    <td><?php echo $rc['custGender']; ?></td>
  </tr>
<?php
  } while ($rc = mysqli_fetch_assoc($rs));

  mysqli_free_result($rs);
  mysqli_close($conn);
?>
</table>
http://localhost/Lab04_1.php
Cust IDCust NameCust PasswordCust Gender
1001Stanleypass01M
1002Jenniferpass02F
1003Kevinpass03M
1004Fionapass04F

任務說明

重新改寫 Task 1 的資料讀取網頁。這次從資料庫讀取出資料後,不能直接顯示成純文字表格,而是必須**將資料與 HTML 表單元件(Form Controls)進行數據綁定**:

  • 客戶姓名與密碼必須顯示在可修改的輸入方塊(<input type="text">)內。
  • 性別欄位必須改為兩個單選按鈕(Male 和 Female),並且系統要根據資料庫取出的性別值,自動將正確的選項加上 checked="checked" 的勾選標記。

完成後將檔案儲存為 Lab04_2.php

建議解答程式碼 (Lab04_2.php)

<?php
  require_once('Connections/conn.php');
  $sql = "SELECT * FROM customers";
  $rs = mysqli_query($conn, $sql);
  $rc = mysqli_fetch_assoc($rs);
?>
<table border="1">
  <tr><th>Cust ID</th><th>Cust Name</th><th>Cust Password</th><th>Cust Gender</th></tr>
<?php
  $i = 0;
  do {
    $i++;
?>
  <tr>
    <td><?php echo $rc['custID']; ?></td>
    <td><input type="text" value="<?php echo $rc['custName']; ?>" /></td>
    <td><input type="text" value="<?php echo $rc['custPswd']; ?>" /></td>
    <td>
      <label><input type="radio" name="rbGender<?php echo $i; ?>" <?php if($rc['custGender'] == "M") echo 'checked="checked"'; ?> />Male</label>
      <label><input type="radio" name="rbGender<?php echo $i; ?>" <?php if($rc['custGender'] == "F") echo 'checked="checked"'; ?> />Female</label>
    </td>
  </tr>
<?php
  } while ($rc = mysqli_fetch_assoc($rs));
  mysqli_free_result($rs);
  mysqli_close($conn);
?>
</table>
http://localhost/Lab04_2.php
Cust IDCust NameCust PasswordCust Gender
1001
1002

任務說明

建立一個整合新增資料表單與後端處理邏輯的 PHP 頁面 Lab04_3.php。本任務需要實作向資料庫寫入新資料的防呆核心機制:

  • 一頁式多重處理:表單的 action 設定為指向自己本身($_SERVER['PHP_SELF'])。當偵測到有 POST 提交的資料時進入後端資料庫檢查與儲存流程;未提交時則單純呈現輸入表單。
  • 防重複檢查:在執行 INSERT 之前,必須先以 SELECT 語法查詢資料庫。若偵測到即將新增的 Customer ID 已經存在,後端必須停止動作,並透過 URL 回傳錯誤訊息:"Record already exist!"
  • 新增成功提示:若 ID 未重複,成功執行寫入指令後,在頁面上提示訊息:"A record is added successfully"

建議解答程式碼 (Lab04_3.php)

<?php
  if(isset($_POST['tfID'])) {
    require_once("Connections/conn.php");
    $sql = "SELECT * FROM Customers WHERE custID = '" . $_POST['tfID'] . "'";
    $rs = mysqli_query($conn, $sql) or die(mysqli_error($conn));
    
    if(mysqli_num_rows($rs) > 0) {
      header("location:". $_SERVER['PHP_SELF'] . "?msg=" . urlencode("Record already exist!"));
    } else {
      $sql = "INSERT INTO Customers (custID, custName, custPswd, custGender) VALUES '
            . "('" . $_POST['tfID'] . "', '" . $_POST['tfName'] . "', '" . $_POST['tfPswd'] . "', '" . $_POST['rbGender'] . "')";
      mysqli_query($conn, $sql) or die (mysqli_error($conn));
      
      if(mysqli_affected_rows($conn) > 0)
        header("location:". $_SERVER['PHP_SELF'] . "?msg=" . urlencode("A record is added successfully"));
    }
  } else {
?>
  <h2>Add a new customer</h2>
  <?php if(isset($_GET['msg'])) echo "<h3 style='color:blue;'>".$_GET['msg']."</h3>"; ?>
  <form method="post" action="<?php echo $_SERVER['PHP_SELF'] ?>">
    <p>Customer ID <input type="text" name="tfID" /></p>
    <p>Customer Name <input type="text" name="tfName" /></p>
    <p>Password <input type="password" name="tfPswd"/></p>
    <p>Gender
      <label><input type="radio" name="rbGender" value="M" checked />Male</label>
      <label><input type="radio" name="rbGender" value="F" />Female</label>
    </p>
    <p><input type="submit" value="Add New Record" /></p>
  </form>
<?php } ?>
http://localhost/Lab04_3.php

Add a new customer

Customer ID

Customer Name

Password

Gender:

💡 成功儲存情境 (URL 帶入 msg):
A record is added successfully
⚠️ 帳號重複情境 (URL 帶入 msg):
Record already exist!

任務說明

重新改寫資料讀取網頁,建立一個名為 Lab05_1a.php 的檔案。在表格中新增一欄「Action」,在每個儲存格內生成一個用於刪除該筆記錄的超連結(Hyperlink)。

  • GET 方法傳參: 每個生成的超連結必須動態帶有查詢字串(Query String),格式為 ?custID=xxxx(xxxx 為該列客戶的 ID)。
  • 後端刪除腳本: 建立 Lab05_1b.php,負責接收 $_REQUEST['custID']$_GET['custID'],執行 DELETE 的 SQL 語法。
  • 自動重新導向: 刪除成功後,後端必須使用 header("location:Lab05_1a.php") 自動跳轉回原列表頁面。

建議解答程式碼

主列表顯示頁 (Lab05_1a.php)

<?php
  require_once('Connections/conn.php');
  $sql = "SELECT * FROM Customers";
  $rs = mysqli_query($conn, $sql);
  echo '<table border="1"><tr><th>Action</th><th>Cust ID</th><th>Cust Name</th><th>Cust Password</th><th>Cust Gender</th></tr>';

  while($rc = mysqli_fetch_assoc($rs)) {
    printf('<tr><td><a href="Lab05_1b.php?custID=%s">Delete Record</a></td><td>%s</td><td>%s</td><td>%s</td><td>%s</td></tr>',
           $rc['custID'], $rc['custID'], $rc['custName'], $rc['custPswd'], $rc['custGender']);
  }
  echo "</table>";
  mysqli_free_result($rs);
?>

後端刪除處理頁 (Lab05_1b.php)

<?php
  require_once('Connections/conn.php');
  $sql = "DELETE FROM Customers WHERE custID='" . $_REQUEST['custID'] . "'";
  mysqli_query($conn, $sql) or die(mysqli_error($conn));
  header("location:Lab05_1a.php");
?>
http://localhost/Lab05_1a.php
ActionCust IDCust NameCust PasswordCust Gender
Delete Record1001Stanleypass01M
Delete Record1002Jenniferpass02F
Delete Record1003Kevinpass03M

任務說明

將 Task 1 的超連結刪除方式改寫,建立 Lab05_2a.php。改為使用** HTML 表單、按鈕(Button)與 JavaScript 配合 POST 方法**來進行刪除:

  • 隱藏欄位傳參: 表單內放置一個隱藏元件(<input type="hidden" name="custID" id="custID" />)。
  • JavaScript 觸發提交: 點擊表格內的「Delete Record」按鈕時,調用自定義 JavaScript 函式 setValue(n),將該筆資料的 custID 寫入隱藏欄位中,並以程式碼觸發表單提交(document.forms[0].submit();)。
  • 後端處理解答: 建立 Lab05_2b.php 接收 POST 來的數據,執行刪除並導回 Lab05_2a.php

建議解答程式碼

前端按鈕與 JavaScript 觸發頁 (Lab05_2a.php)

<script language="JavaScript" type="text/javascript">
function setValue(n) {
  document.getElementById('custID').value = n;
  document.forms[0].submit();
}
</script>

<?php
  require_once('Connections/conn.php');
  $sql = "SELECT * FROM Customers";
  $rs = mysqli_query($conn, $sql);
  echo '<form method="post" action="Lab05_2b.php">';
  echo '<table border="1"><tr><th>Action</th><th>Cust ID</th><th>Cust Name</th><th>Cust Password</th><th>Cust Gender</th></tr>';

  while($rc = mysqli_fetch_assoc($rs)) {
    printf('<tr><td><input type="button" value="Delete Record" onclick="setValue(\'%s\');" /></td><td>%s</td><td>%s</td><td>%s</td><td>%s</td></tr>',
           $rc['custID'], $rc['custID'], $rc['custName'], $rc['custPswd'], $rc['custGender']);
  }
  echo '</table> <input type="hidden" name="custID" id="custID" value="" /></form>';
  mysqli_free_result($rs);
?>

後端處理頁 (Lab05_2b.php)

<?php
  require_once('Connections/conn.php');
  $sql = "DELETE FROM Customers WHERE custID='" . $_POST['custID'] . "'";
  mysqli_query($conn, $sql) or die(mysqli_error($conn));
  header("location:Lab05_2a.php");
?>
http://localhost/Lab05_2a.php
ActionCust IDCust NameCust PasswordCust Gender
1001Stanleypass01M
1002Jenniferpass02F

任務說明 (Challenge Exercise)

實作完整的資料庫資料修改功能。建立 Lab05_3a.php 網頁,將列表與編輯表單做整合:

  • 一頁式載入: 表格第一欄為「Update Record」超連結。點擊超連結後,網頁會重新載入自己,並在網址列帶上 ?custID=xxxx
  • 資料回填表單: 如果網頁偵測到 URL 有帶入 custID,則在表格下方顯示一個修改表單,並從資料庫查詢該客戶的舊資料自動填入(Customer ID 設定為 readonly 唯讀模式避免被修改)。
  • 更新提交處理: 表單使用 POST 提交至 Lab05_3b.php,使用 UPDATE 語法更新資料庫,完成後使用 header() 重新導回 Lab05_3a.php

建議解答程式碼

列表與回填編輯頁 (Lab05_3a.php)

<?php
  require_once('Connections/conn.php');
  $sql = "SELECT * FROM Customers";
  $rs = mysqli_query($conn, $sql);
  echo '<table border="1"><tr><th>Action</th><th>Cust ID</th><th>Cust Name</th><th>Cust Password</th><th>Cust Gender</th></tr>';
  while($rc = mysqli_fetch_assoc($rs)) {
    printf('<tr><td><a href="Lab05_3a.php?custID=%s">Update Record</a></td><td>%s</td><td>%s</td><td>%s</td><td>%s</td></tr>',
           $rc['custID'], $rc['custID'], $rc['custName'], $rc['custPswd'], $rc['custGender']);
  }
  echo "</table><br />";
  mysqli_free_result($rs);

  // 判斷是否點擊了修改連結
  if (isset($_GET['custID'])) {
    $sql = "SELECT * FROM Customers WHERE custID='" . $_GET['custID'] . "'";
    $rs = mysqli_query($conn, $sql);
    $rc = mysqli_fetch_assoc($rs);
    $m_check = ($rc['custGender'] == "M") ? 'checked="checked"' : '';
    $f_check = ($rc['custGender'] == "F") ? 'checked="checked"' : '';

    // 使用 heredoc 語法渲染帶有舊資料的表單
    printf('
    <form method="post" action="Lab05_3b.php">
      <p>Customer ID <input type="text" name="tfID" readonly="readonly" value="%s"/></p>
      <p>Customer Name <input type="text" name="tfName" value="%s"/></p>
      <p>Password <input type="password" name="tfPswd" value="%s"/></p>
      <p>Gender <label><input type="radio" value="M" name="rbGender" %s/>Male </label>
                <label><input type="radio" value="F" name="rbGender" %s/>Female</label></p>
      <p><input type="submit" value="Update Record" /></p>
    </form>', $rc['custID'], $rc['custName'], $rc['custPswd'], $m_check, $f_check);
  }
?>

資料庫更新後端頁 (Lab05_3b.php)

<?php
  require_once('Connections/conn.php');
  extract($_POST);
  $sql = "UPDATE Customers SET custName='$tfName', custPswd='$tfPswd', custGender='$rbGender' WHERE custID='$tfID'";
  mysqli_query($conn, $sql) or die(mysqli_error($conn));
  header("location:Lab05_3a.php");
?>
http://localhost/Lab05_3a.php?custID=1001
ActionCust IDCust NameCust PasswordCust Gender
Update Record1001Stanleypass01M
Update Record1002Jenniferpass02F

修改資料表單 (已自動回填 CustID: 1001 的舊資料)

Customer ID

Customer Name

Password

Gender: