透過一個簡易的 PHP 訪客計數器範例,帶領初學者認識 MySQL 四大核心操作:SELECT 查詢、INSERT 插入、UPDATE 更新、DELETE 刪除,並說明常用子句與進階用法。
<?php
$ip = $_SERVER['REMOTE_ADDR'];
$conn = mysqli_connect('localhost', 'root', 'pwd', 'db');
-- 1. 查詢該 IP 是否存在
$sql = "SELECT * FROM counter WHERE ip = '$ip'";
$res = mysqli_query($conn, $sql);
$num = mysqli_num_rows($res);
-- 2. 統計總訪客數
$total_res = mysqli_query($conn, "SELECT * FROM counter");
$total = mysqli_num_rows($total_res);
if ($num == 0) {
-- 首次訪問:插入新紀錄
$sql = "INSERT INTO counter (ip, sum, countdata) VALUES ('$ip', 1, $total+1)";
mysqli_query($conn, $sql);
} else {
-- 回頭客:更新個人計數
$row = mysqli_fetch_assoc(mysqli_query($conn, "SELECT sum FROM counter WHERE ip='$ip'"));
$new_sum = $row['sum'] + 1;
mysqli_query($conn, "UPDATE counter SET sum=$new_sum WHERE ip='$ip'");
}
mysqli_close($conn);
?>
| 場景 | SQL 範例 |
|---|---|
| 查所有欄位 | SELECT * FROM table1; |
| 查指定欄位 | SELECT field1, field2 FROM table1; |
| 統計筆數 | SELECT COUNT(*) FROM table2; |
| 多表連接 | SELECT t1.f1, t2.f2 FROM table1 t1, table2 t2 WHERE t1.f1='val'; |
| 條件篩選+排序 | SELECT * FROM table1 WHERE f1='v1' AND f2='v2' ORDER BY f1; |
| 排序+限制筆數 | SELECT * FROM table1 WHERE f1='v1' ORDER BY f1 DESC LIMIT n; |
| 模糊查詢 | SELECT * FROM table2 WHERE name LIKE '%$keyword%'; |
| 子查詢 | SELECT * FROM table1 WHERE id IN (SELECT id FROM table2 ...); |
| 最大值 | SELECT MAX(field1) AS field1 FROM table1; |
UPDATE table1
SET field1='value1', field2='value2'
WHERE field3='value3';
SET 指定要修改的欄位與新值。WHERE 限定更新範圍;省略 WHERE 將更新全表,極度危險。SET counter = counter + 1。INSERT INTO table1 VALUES ('val1', 'val2', ...);
INSERT INTO table1 (col1, col2) VALUES ('val1', 'val2');
REPLACE INTO tbl_name (col1, col2) VALUES ('val1', 'val2');
INSERT INTO target_table (col1, col2)
SELECT col1, col2 FROM source_table WHERE condition;
DELETE FROM table1
WHERE field1='value1' AND field2='value2';
TRUNCATE TABLE 更快、不可回滾)。LIMIT 限制刪除筆數:DELETE FROM logs WHERE created_at < '2020-01-01' LIMIT 10000;WHERE id IN (SELECT id FROM ...)、WHERE EXISTS (SELECT 1 FROM ...)。FILE 權限)。SELECT * INTO OUTFILE '/tmp/data.csv' FIELDS TERMINATED BY ',' FROM table1;SELECT ... INTO TABLE(MySQL 不支援)。mysqli_prepare / PDO::prepare 參數化查詢,勿直接拼接變數。mysqli_query($conn, $sql) or die(mysqli_error($conn)) 僅供開發除錯,生產環境應記錄日誌、回傳友善錯誤。mysqli_free_result($res)、mysqli_close($conn),或依賴腳本結束自動釋放。SET NAMES utf8mb4,表/欄位字元集同為 utf8mb4。掌握 CRUD 四大核心語法,並養成參數化、索引意識、錯誤處理習慣,即能建立健壯的資料庫應用。