strrev() 或手寫遞迴mb_substr($str, 0, 10, 'UTF-8')// 1. 參考賦值後 unset
$a = "hello"; $b = &$a; unset($b); $b = "world"; // $a = "hello"
// 2. 參考與後置遞增
$a = 1; $x = &$a; $b = $a++; // $b = 1, $a = 2, $x = 2
// 3. empty 空陣列
$array = []; $x = empty($array); // true
CREATE TABLE message (
id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
title VARCHAR(255) NOT NULL,
content TEXT,
category_id INT UNSIGNED NOT NULL DEFAULT 0,
hits INT UNSIGNED NOT NULL DEFAULT 0,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
SELECT
m.id,
m.title,
m.hits,
COALESCE(c.reply_count, 0) AS reply_count
FROM message m
LEFT JOIN (
SELECT id, COUNT(*) AS reply_count
FROM comment
GROUP BY id
) c ON m.id = c.id
ORDER BY reply_count DESC;
<select name="category_id">
<?php
$sql = "SELECT category_id, category_name FROM category ORDER BY category_id";
$res = mysql_query($sql); // 實務請用 PDO/MySQLi
while ($row = mysql_fetch_assoc($res)) {
echo '<option value="' . $row['category_id'] . '">' . htmlspecialchars($row['category_name']) . '</option>';
}
?>
</select>
file_put_contents('article_123.html', $html) 寫入靜態檔<?php
$b = 201; $c = 40;
$a = $b > $c ? 4 : 5;
echo $a; // 輸出:4
<?php
$str = "cd";
$$str = "hotdog"; // $cd = "hotdog"
$$str .= "ok"; // $cd = "hotdogok" (注意:$$str 此時解析為 $cd)
echo $cd; // 輸出:hotdogok
解析: $$str 先解析為 $cd,第二行 $$str .= "ok" 等同 $cd .= "ok"。
& 為傳引用。大型陣列/物件建議傳引用避免複製開銷;需修改原值時必須傳引用。E_ALL,生產環境 E_ALL & ~E_NOTICE & ~E_DEPRECATED 並關閉 display_errors、開啟 log_errors。filter_var($email, FILTER_VALIDATE_EMAIL)(PHP 5.2+),或 RFC 5322 相容正則(極複雜),實務建議:簡單正則 + 發送驗證信。$url = 'https://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
// 或更完整處理 HTTPS、非標準埠
$scheme = (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off') ? 'https' : 'http';
$port = ($_SERVER['SERVER_PORT'] == '80' || $_SERVER['SERVER_PORT'] == '443') ? '' : ':' . $_SERVER['SERVER_PORT'];
$url = $scheme . '://' . $_SERVER['HTTP_HOST'] . $port . $_SERVER['REQUEST_URI'];
ini_set('session.gc_maxlifetime', 3600) + session_set_cookie_params(3600) + 設定 session.save_path 避免被系統 gc 清除。file_get_contents($url)(需 allow_url_fopen=On)、cURL(支援 POST、Header、Timeout、Cookie 等完整控制)。rsort() 採 QuickSort + 插入排序混合,極難超越。| 表名 | 欄位 | 說明 |
|---|---|---|
| users | id (PK), username, email, password_hash, max_books, created_at | 用戶,唯一性由 PK 保證 |
| books | isbn (PK), title, author, publisher, publish_year, total_copies | 書目資訊,ISBN 唯一 |
| book_copies | copy_id (PK), isbn (FK), status (available/borrowed/lost), location | 實體冊次,每本唯一 copy_id |
| borrow_records | id (PK), user_id (FK), copy_id (FK), borrow_date, due_date, return_date, status | 借還記錄,FK 保證參照完整性 |
| categories | id (PK), name, parent_id | 分類支援無限層級 |
| book_categories | isbn (FK), category_id (FK) | 多對多關聯 |
-- 借書(事務)
START TRANSACTION;
SELECT status FROM book_copies WHERE copy_id = ? FOR UPDATE;
UPDATE book_copies SET status = 'borrowed' WHERE copy_id = ?;
INSERT INTO borrow_records (user_id, copy_id, borrow_date, due_date, status)
VALUES (?, ?, NOW(), DATE_ADD(NOW(), INTERVAL 30 DAY), 'borrowed');
COMMIT;
-- 還書
START TRANSACTION;
UPDATE book_copies SET status = 'available' WHERE copy_id = ?;
UPDATE borrow_records SET return_date = NOW(), status = 'returned'
WHERE user_id = ? AND copy_id = ? AND status = 'borrowed';
COMMIT;
-- 當前每種書借出/可借本數
SELECT b.isbn, b.title,
SUM(bc.status = 'borrowed') AS borrowed,
SUM(bc.status = 'available') AS available
FROM books b
JOIN book_copies bc ON b.isbn = bc.isbn
GROUP BY b.isbn;
-- 超期圖書與用戶
SELECT br.*, u.username, DATEDIFF(NOW(), br.due_date) AS overdue_days
FROM borrow_records br
JOIN users u ON br.user_id = u.id
WHERE br.status = 'borrowed' AND br.due_date < NOW();
-- 所有用戶借書本數(含零借閱)
SELECT u.id, u.username, COUNT(br.id) AS borrow_count
FROM users u
LEFT JOIN borrow_records br ON u.id = br.user_id AND br.status = 'borrowed'
GROUP BY u.id;
function buildTree($items, $parentId = 0, $level = 0) {
$branch = [];
foreach ($items as $item) {
if ($item['parent_id'] == $parentId) {
$item['level'] = $level;
$children = buildTree($items, $item['id'], $level + 1);
if ($children) $item['children'] = $children;
$branch[] = $item;
}
}
return $branch;
}
// 使用範例
$menu = [
['id'=>1, 'parent_id'=>0, 'name'=>'首頁'],
['id'=>2, 'parent_id'=>0, 'name'=>'產品'],
['id'=>3, 'parent_id'=>2, 'name'=>'手機'],
['id'=>4, 'parent_id'=>2, 'name'=>'筆電'],
];
$tree = buildTree($menu);
SELECT username, posts FROM members ORDER BY posts DESC LIMIT 10;
var win = window.open(url, '_blank');
if (!win || win.closed || typeof win.closed === 'undefined') {
alert('請允許彈出視窗');
}
session_start() 檢查 Cookie 中 PHPSESSID$_SESSION$_SESSION 寫回儲存器session.gc_probability/divisor)$a = [4,3,8,9,2];
sort($a); // [2,3,4,8,9] 重新索引
// 保持鍵值關聯用 asort/ksort
參數化查詢(Prepared Statements) 是唯一正解:
$stmt = $pdo->prepare('SELECT * FROM users WHERE id = ?');
$stmt->execute([$id]);
舊式 mysql_real_escape_string、addslashes 均不完整、易繞過、已棄用。
-- 線上紀錄表
CREATE TABLE online_users (
session_id CHAR(32) PRIMARY KEY,
user_id INT,
last_activity TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);
-- 更新心跳
INSERT INTO online_users (session_id, user_id) VALUES (?, ?)
ON DUPLICATE KEY UPDATE last_activity = NOW();
-- 查詢線上人數(5 分鐘內有活動)
SELECT COUNT(*) FROM online_users WHERE last_activity > DATE_SUB(NOW(), INTERVAL 5 MINUTE);
-- 定時清理異常掉線(超過 30 分鐘無活動)
DELETE FROM online_users WHERE last_activity < DATE_SUB(NOW(), INTERVAL 30 MINUTE);
面試核心不在背誦答案,而在展現思考過程:為何這樣設計?有何取捨?如何擴展?遇到瓶頸怎麼辦?準備 3-5 個完整專案案例,能從架構、效能、安全、維運多維度闡述,遠勝刷百道題目。