Lab 1 - Task 1
基本資料輸出環境測試
任務說明
建立一個名為 Lab01_Task1.php 的檔案,並包含標準 HTML 標籤。在 <body> 標籤內建立一個 PHP 區塊,在瀏覽器上分行顯示您的英文姓名、年齡和體重。完成後在瀏覽器中開啟頁面以核對結果。
建議解答程式碼 (PHP)
echo "Chan Tai Man<br />";
print '19<br />';
echo "65.5 kg";
?>
19
65.5 kg
任務說明
重寫 Task 1 的 PHP 腳本,建立適當的變數 $name、$age 和 $weight 來儲存相關數據。使用變數在瀏覽器中不同的行上顯示這三個數據。將檔案儲存為 Lab01_Task2.php。
變數與資料型態規劃:
| 變數名稱 | 資料型態 (Data Type) |
|---|---|
| $name | String (字串) |
| $age | Integer (整數) |
| $weight | Floating-point (浮點數) |
建議解答程式碼 (PHP)
$name = "Chan Tai Man";
$age = 19;
$weight = 65.5;
echo "$name <br />";
echo "$age <br />";
echo $weight . " kg";
?>
19
65.5 kg
任務說明
編寫一個名為 Lab01_Task3.php 的 PHP 腳本,在瀏覽器上列印出算術運算的完整結果。設變數 $x = 20 且 $y = 6。
需要輸出的運算式包含:加法 (+)、減法 (-)、乘法 (*)、除法 (/) 以及模數/取餘數 (%)。
建議解答程式碼 (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 />";
?>
20 - 6 = 14
20 * 6 = 120
20 / 6 = 3.3333333333333
20 % 6 = 2
任務說明
輸入並執行以下 PHP 腳本,觀察並追踪變數的值在執行前置與後置遞增時的變化過程,並寫下最終的輸出結果。
$a = 100;
$x = $a++;
echo "a: " . $a . "<br />";
echo "x: " . $x . "<br />";
$x = ++$a;
echo "a: " . $a . "<br />";
echo "x: " . $x . "<br />";
?>
追踪結果與輸出說明
x: 100
a: 102
x: 102
概念解析:
1. $x = $a++; 為後置遞增,系統先將 $a 當前的值 (100) 賦值給 $x,接著 $a 自增變為 101。
2. $x = ++$a; 為前置遞增,$a 先自增變為 102,隨後將新值 (102) 賦值給 $x。
x: 100
a: 102
x: 102
任務說明
編寫一個 PHP 腳本以顯示目前日期,格式為 [dd mm yy]。根據目前的月份和年份,您的腳本將返回對應月份的天數。您必須使用 switch 條件控制語句。將檔案儲存為 Lab01_Task5.php。
提示:閏年的判斷標準為:能被 4 整除,但不能被 100 整除(除非同時能被 400 整除)。
建議解答程式碼 (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.";
?>
June has 30 days.
任務說明
將 Task 5 重新改寫,改為使用 If-Else-If 條件控制結構來完成相同邏輯的月份天數計算,並將檔案儲存為 Lab01_Task6.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.";
?>
June has 30 days.
任務說明
編寫一個 PHP 腳本,使用 for 迴圈 在瀏覽器上產生 1 到 10 的平方相乘列表輸出(例如:1 * 1 is 1)。將 PHP 檔案儲存為 Lab02_Task1.php。
建議解答程式碼 (PHP)
for ($n = 1; $n <= 10; $n++) {
echo $n . " * " . $n . " is " . ($n * $n) . "<br />";
}
?>
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)
$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 />";
?>
Maximum mark: 100
Minimum mark: 10
任務說明
費氏數列(Fibonacci sequence)的規律如下:1, 1, 2, 3, 5, 8, 13, 21, 34, . . .。
請使用 2 欄的 HTML 表格 印出前 20 個費氏數列元素。同時推算或思考第 50 個、第 500 個以及第 5000 個元素在記憶體中的處理方式。
建議解答程式碼 (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>";
?>
| Term | Value |
|---|---|
| 1 | 1 |
| 2 | 1 |
| 3 | 2 |
| 4 | 3 |
| 5 | 5 |
| 6 | 8 |
| 7 | 13 |
| 8 | 21 |
| 9 | 34 |
| 10 | 55 |
| 11 | 89 |
| 12 | 144 |
| 13 | 233 |
| 14 | 377 |
| 15 | 610 |
| 16 | 987 |
| 17 | 1597 |
| 18 | 2584 |
| 19 | 4181 |
| 20 | 6765 |
任務說明
建立一個名為 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)
<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 迴圈進行進階的動態驗證:
// 建立關聯式陣列儲存欄位資訊 (欄位型態, 顯示標籤)
$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;
}
?>
All input data in the form are :
Name = Peter ParkerGraduate Year = 2026
Alumni = true
Comments = I love PHP programming!
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)
<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)
// 定義自定義函式
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>";
?>
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)
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>";
}
}
?>
Welcome! Peter Parker
You are now 26 years old.
Hello, first name is invalid!
Please re-enter the information
任務說明
建立一個名為 Lab04_1.php 的檔案,連接至本機 MySQL 資料庫並從 customers 資料表中讀取所有的客戶記錄,最後使用標準的 HTML 表格將所有數據完整顯示在瀏覽器上。
顯示欄位要求: Cust ID、Cust Name、Cust Password、Cust Gender。
資料庫結構參考 (lab04.sql):
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)
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>
| Cust ID | Cust Name | Cust Password | Cust Gender |
|---|---|---|---|
| 1001 | Stanley | pass01 | M |
| 1002 | Jennifer | pass02 | F |
| 1003 | Kevin | pass03 | M |
| 1004 | Fiona | pass04 | F |
任務說明
重新改寫 Task 1 的資料讀取網頁。這次從資料庫讀取出資料後,不能直接顯示成純文字表格,而是必須**將資料與 HTML 表單元件(Form Controls)進行數據綁定**:
- 客戶姓名與密碼必須顯示在可修改的輸入方塊(
<input type="text">)內。 - 性別欄位必須改為兩個單選按鈕(Male 和 Female),並且系統要根據資料庫取出的性別值,自動將正確的選項加上
checked="checked"的勾選標記。
完成後將檔案儲存為 Lab04_2.php。
建議解答程式碼 (Lab04_2.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>
| Cust ID | Cust Name | Cust Password | Cust 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)
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 } ?>
Add a new customer
Customer ID
Customer Name
Password
Gender:
A record is added successfully
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)
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)
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");
?>
| Action | Cust ID | Cust Name | Cust Password | Cust Gender |
|---|---|---|---|---|
| Delete Record | 1001 | Stanley | pass01 | M |
| Delete Record | 1002 | Jennifer | pass02 | F |
| Delete Record | 1003 | Kevin | pass03 | M |
任務說明
將 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)
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)
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");
?>
| Action | Cust ID | Cust Name | Cust Password | Cust Gender |
|---|---|---|---|---|
| 1001 | Stanley | pass01 | M | |
| 1002 | Jennifer | pass02 | F |
任務說明 (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)
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)
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");
?>
| Action | Cust ID | Cust Name | Cust Password | Cust Gender |
|---|---|---|---|---|
| Update Record | 1001 | Stanley | pass01 | M |
| Update Record | 1002 | Jennifer | pass02 | F |
修改資料表單 (已自動回填 CustID: 1001 的舊資料)
Customer ID
Customer Name
Password
Gender: