/Applications/MAMP/htdocshttps://localhost:8888
# 安裝 PHP(指定版本)
brew tap shivammathur/php
brew install shivammathur/php/php@8.2
# 或安裝舊版(如 5.6/7.4)
brew install php@7.4
# 連結到 PATH
brew link --force --overwrite php@8.2
# 驗證
php -v
which php # /usr/local/bin/php 或 /opt/homebrew/bin/php (M1/M2)

1. 瀏覽器發送 HTTP 請求
2. Web Server (Nginx/Apache) 接收 .php 請求,轉交 PHP-FPM
3. PHP 引擎解析腳本,遇到資料庫操作
4. PHP 建立 MySQL 連線 (mysqli/PDO),發送 SQL
5. MySQL 執行查詢,返回結果集
6. PHP 格式化結果 (JSON/HTML/陣列)
7. Web Server 回傳響應給瀏覽器
| 分類 | 類型 | 說明 |
|---|---|---|
| 整數 | TINYINT | -128~127 / 0~255 |
| SMALLINT | -32768~32767 | |
| INT | 標準整數 | |
| BIGINT | 大整數 | |
| 浮點/定點 | FLOAT | 單精度 |
| DOUBLE | 雙精度 | |
| DECIMAL(M,D) | 精確定點數 (金額必用) | |
| 字串 | CHAR(n) | 固定長度 |
| VARCHAR(n) | 可變長度 | |
| 日期時間 | DATETIME | 日期+時間 (1000-9999) |
| TIMESTAMP | 時間戳 (1970-2038) | |
| DATE | 僅日期 | |
| 大文本 | TINYTEXT | 255 字元 |
| TEXT | 65KB | |
| LONGTEXT | 4GB |
-- 顯示資料庫
SHOW DATABASES;
-- 選擇資料庫
USE mydb;
-- 查看當前資料庫
SELECT DATABASE();
-- 顯示資料表
SHOW TABLES;
-- 查看表結構
DESC users;
-- 或
SHOW COLUMNS FROM users;
-- 設定編碼
SET NAMES utf8mb4;
-- 建立資料庫
CREATE DATABASE mydb CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-- 建立資料表
CREATE TABLE users (
id INT AUTO_INCREMENT PRIMARY KEY,
username VARCHAR(50) NOT NULL UNIQUE,
email VARCHAR(100) NOT NULL,
sex CHAR(1) DEFAULT 'M',
birth DATETIME,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-- 插入資料
INSERT INTO users (username, email, sex, birth) VALUES ('jack', 'jack@example.com', 'M', NOW());
-- 查詢
SELECT * FROM users;
SELECT id, username FROM users WHERE sex = 'F' ORDER BY created_at DESC LIMIT 10;
-- 更新
UPDATE users SET email = 'new@example.com' WHERE id = 1;
-- 刪除
DELETE FROM users WHERE id = 2;
<?php
// 配置常數
define('DB_HOST', '127.0.0.1');
define('DB_NAME', 'mydb');
define('DB_USER', 'root');
define('DB_PASS', 'password');
define('DB_CHARSET', 'utf8mb4');
// DSN
$dsn = "mysql:host={DB_HOST};dbname={DB_NAME};charset={DB_CHARSET}";
try {
// 建立連線
$pdo = new PDO($dsn, DB_USER, DB_PASS, [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
PDO::ATTR_EMULATE_PREPARES => false, // 使用真實預處理
]);
echo "連線成功\n";
// 查詢
$stmt = $pdo->query("SELECT * FROM users");
$users = $stmt->fetchAll();
print_r($users);
// 預處理插入 (防 SQL 注入)
$stmt = $pdo->prepare("INSERT INTO users (username, email, sex, birth) VALUES (?, ?, ?, ?)");
$stmt->execute(['mary', 'mary@example.com', 'F', '1990-05-20']);
echo "新增 ID: " . $pdo->lastInsertId();
// 事務
$pdo->beginTransaction();
try {
$pdo->exec("UPDATE users SET email='a@b.c' WHERE id=1");
$pdo->exec("UPDATE users SET email='d@e.f' WHERE id=2");
$pdo->commit();
} catch (Exception $e) {
$pdo->rollBack();
throw $e;
}
} catch (PDOException $e) {
die("連線失敗: " . $e->getMessage());
}
// 指令碼結束自動關閉連線,或手動:$pdo = null;
PHP 7.0 起完全移除 mysql_connect、mysql_query 等函數。**請勿在新專案使用**。務必改用 PDO 或 mysqli (物件導向風格)。
| 方法 | 說明 |
|---|---|
| query() | 執行 SELECT,返回 PDOStatement |
| exec() | 執行 INSERT/UPDATE/DELETE,返回影響行數 |
| prepare() | 預處理語句,防注入 |
| fetch() | 取得單行 |
| fetchAll() | 取得所有行 |
| fetchColumn() | 取得單一欄位值 |
| lastInsertId() | 取得最後插入自增 ID |
| beginTransaction()/commit()/rollBack() | 事務控制 |