作者從零開始學 PHP 並邊做專案邊整理的實戰筆記,涵蓋 SQL 分頁、查詢字串取得、日期比較、MySQL 日期格式、時區設定、intval 型別轉換陷阱、中文編碼等 12 個高頻踩坑點,適合入門開發者快速查閱。
SELECT LEFT(content, 20) AS summary FROM articles;
-- 從第 0 筆起取 30 筆(第 1 頁)
SELECT * FROM posts LIMIT 0, 30;
-- 第 2 頁
SELECT * FROM posts LIMIT 30, 30;
-- 共同欄位名相同
SELECT * FROM t1 JOIN t2 USING (uid);
-- 欄位名不同
SELECT * FROM t1 JOIN t2 ON t1.uid = t2.user_id;
// 推薦:$_GET 只抓 GET
$page = $_GET['page'] ?? 1;
// 也可用 $_REQUEST 同時吃 GET/POST/COOKIE(注意安全性)
$page = $_REQUEST['page'] ?? 1;
// 早期笨做法(不推薦)
parse_str($_SERVER['QUERY_STRING'], $out);
$page = $out['page'] ?? 1;
MySQL DATE、DATETIME 欄位在 SQL 中以 `'YYYY-MM-DD'` 字串比較即可,格式一致時字典序等同時間序。
以下皆合法:2000-02-03、2002.02.03、2002.2.3、02.02.03。核心規則:必須有月、日,分隔符為 `-` 或 `.`。
兩種修法:
// php.ini
date.timezone = "Asia/Shanghai"
// 或腳本開頭
date_default_timezone_set('PRC'); // 或 'Asia/Shanghai'
$v = 'A5A';
echo intval($v); // 0 !因為開頭非數字
$v = '123abc';
echo intval($v); // 123 只取前導數字
// 結論:欄位為 varchar 存非純數字時,嚴禁用 intval()
欄位為 VARCHAR 卻用數值型別繫結,或反之,可能引發「缺少 )」等誤導性錯誤。務必對應欄位型別繫結。
(int) 3.9 // 3
intval(3.9) // 3
// 不會四捨五入
INSERT INTO t (id, name) VALUES (NULL, 'test'); -- id 自動產生
// 1. 連線後設定字元集
mysqli_query($link, "SET NAMES 'utf8mb4'"); // 或 gb2312
// 2. 資料庫、表、欄位全用 utf8mb4
// 3. PHP 檔案儲存為 UTF-8 無 BOM
// 跨編碼轉換
$utf8 = iconv('GBK', 'UTF-8', $gbk_str);
mysql_* 舊函式(已移除)。PDO::ERRMODE_EXCEPTION,統一 try-catch 處理。password_hash() / password_verify(),別再用 MD5/SHA1。php.ini:display_errors=Off、log_errors=On、expose_php=Off。