首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 綜合知識

PHP 面試題大全集:從基礎語法到架構設計

     編輯:PHP 綜合知識

面試題組一:核心基礎(同 67978 題組一,此處精簡)

  1. 前一天日期格式化輸出
  2. echo/print/print_r 差異
  3. 模板引擎:Smarty、Twig、Blade 等
  4. PHP 與 JSP 交互:SOAP、REST API、Message Queue、PHP Java Bridge
  5. 版本控制:Git(主流)、SVN
  6. 字串反轉:strrev() 或手寫遞迴
  7. MySQL 優化:索引、SQL、架構、快取、硬體多維度
  8. 事務 ACID、隔離級別、InnoDB 支援
  9. 高負載架構:無狀態、讀寫分離、分庫分表、多層快取
  10. 中文截取: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

面試題組三:資料庫設計與 SQL 實戰

1. 建立 message 表

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;

2. 文章標題列表含回覆數,按回覆數降序(含無回覆文章)

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;

3. 分類下拉選單實作

<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>

面試題組四:檔案操作與靜態化

1. 產生靜態 HTML 基本流程

  1. 取得動態內容(資料庫查詢)
  2. 載入模板檔或組裝 HTML 字串
  3. file_put_contents('article_123.html', $html) 寫入靜態檔
  4. 設定 Nginx/Apache 重寫規則優先讀取靜態檔
  5. 發布/更新時重新產生,或使用快取機制自動失效重建

2. 修改已發布內容流程

  1. 後台編輯表單提交新內容
  2. 驗證權限、過濾 XSS、更新資料庫
  3. 觸發靜態檔重新產生(同步或非同步佇列)
  4. 清除 CDN/反向代理快取
  5. 回傳成功訊息

面試題組五:程式碼追蹤輸出結果

1. 三元運算子

<?php
$b = 201; $c = 40;
$a = $b > $c ? 4 : 5;
echo $a; // 輸出:4

2. 變數變數與字串連接

<?php
$str = "cd";
$$str = "hotdog";  // $cd = "hotdog"
$$str .= "ok";     // $cd = "hotdogok" (注意:$$str 此時解析為 $cd)
echo $cd;          // 輸出:hotdogok

解析: $$str 先解析為 $cd,第二行 $$str .= "ok" 等同 $cd .= "ok"。

面試題組六:簡答題精選

  1. 傳值 vs 傳引用:預設傳值(複製),函式參數加 & 為傳引用。大型陣列/物件建議傳引用避免複製開銷;需修改原值時必須傳引用。
  2. error_reporting:設定錯誤回報層級。開發環境 E_ALL,生產環境 E_ALL & ~E_NOTICE & ~E_DEPRECATED 並關閉 display_errors、開啟 log_errors。
  3. Email 格式驗證:filter_var($email, FILTER_VALIDATE_EMAIL)(PHP 5.2+),或 RFC 5322 相容正則(極複雜),實務建議:簡單正則 + 發送驗證信。
  4. 取得當前腳本完整 URL 含參數:
    $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'];
  5. 修改 Session 生命週期:ini_set('session.gc_maxlifetime', 3600) + session_set_cookie_params(3600) + 設定 session.save_path 避免被系統 gc 清除。
  6. 取得遠端網頁內容:file_get_contents($url)(需 allow_url_fopen=On)、cURL(支援 POST、Header、Timeout、Cookie 等完整控制)。
  7. 高效排序整數陣列(不得用內建函式):快速排序、計數排序(資料範圍已知時 O(n))、基數排序。PHP 內建 rsort() 採 QuickSort + 插入排序混合,極難超越。
  8. 加速頁面載入方法:Opcode 快取、資料庫索引/慢查詢優化、Redis 快取熱點資料、CDN 靜態資源、減少 HTTP 請求、啟用 Gzip/HTTP2、非同步載入 JS/CSS、SSR/預渲染。

面試題組七:資料庫設計實戰——圖書館借閱系統

ER 關係與表結構(6 表以內)

表名欄位說明
usersid (PK), username, email, password_hash, max_books, created_at用戶,唯一性由 PK 保證
booksisbn (PK), title, author, publisher, publish_year, total_copies書目資訊,ISBN 唯一
book_copiescopy_id (PK), isbn (FK), status (available/borrowed/lost), location實體冊次,每本唯一 copy_id
borrow_recordsid (PK), user_id (FK), copy_id (FK), borrow_date, due_date, return_date, status借還記錄,FK 保證參照完整性
categoriesid (PK), name, parent_id分類支援無限層級
book_categoriesisbn (FK), category_id (FK)多對多關聯

關鍵業務 SQL

-- 借書(事務)
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);

MVC 認識

  • Model:資料邏輯、業務規則、持久化
  • View:呈現邏輯、模板渲染
  • Controller:請求分發、協調 Model/View、輸入驗證
  • 優點:關注點分離、可測試、團隊分工、易維護

發文數前十會員

SELECT username, posts FROM members ORDER BY posts DESC LIMIT 10;

JavaScript 判斷彈窗被攔截

var win = window.open(url, '_blank');
if (!win || win.closed || typeof win.closed === 'undefined') {
    alert('請允許彈出視窗');
}

Session 運作機制

  1. session_start() 檢查 Cookie 中 PHPSESSID
  2. 有 ID → 讀取儲存器(檔案/Redis/DB)還原 $_SESSION
  3. 無 ID → 產生新 ID、建立儲存項目、Set-Cookie 回應
  4. 腳本結束 → 序列化 $_SESSION 寫回儲存器
  5. GC 機率性清理過期 Session(session.gc_probability/divisor)

陣列排序

$a = [4,3,8,9,2];
sort($a); // [2,3,4,8,9] 重新索引
// 保持鍵值關聯用 asort/ksort

防 SQL 注入

參數化查詢(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 個完整專案案例,能從架構、效能、安全、維運多維度闡述,遠勝刷百道題目。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved