Web 伺服器(Apache/Nginx)預設僅對 .php 副檔名啟用 PHP 解析器。.html 檔案會直接作為靜態內容輸出,不會經過 PHP 引擎。若要在 HTML 中動態載入 PHP 執行結果,必須透過**客戶端技術**發起額外請求。
<script src="xxx.php"> 模式(傳統、簡單)利用瀏覽器載入 JS 檔案的特性,實際請求 PHP,由 PHP 輸出 JavaScript 程式碼(如 document.write())回傳給瀏覽器執行。
<!-- a.html -->
<script type="text/javascript" src="b.php?action=test"></script>
<?php
// b.php
$action = $_GET['action'] ?? '';
// 輸出 JS 程式碼,注意雙引號轉義
echo "document.write('$action');\n";
?>
執行流程:瀏覽器解析 HTML → 遇到 <script src> → 請求 b.php?action=test → PHP 輸出 document.write('test'); → 瀏覽器執行該 JS → 頁面顯示 "test"。
缺點:僅能輸出純文字/HTML 片段,難以處理複雜 DOM 操作;需注意輸出內容的 JS 語法安全(單引號、換行轉義)。
.load() 載入片段(最常用、支援參數傳遞)jQuery 的 load(url, data, callback) 可發起 GET/POST 請求,將回傳的 HTML 片段直接插入指定 DOM 元素。
<div id="myID">載入中...</div>
<script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
<script>
// 1. 載入無參數 PHP
$("#myID").load("test.php");
// 2. 單一參數(自動轉為 GET 字串 ?name=Adam)
$("#myID").load("test.php", {"name": "Adam"});
// 3. 多參數(逗號分隔,jQuery 內部轉為 &name=Adam&site=xxx)
$("#myID").load("test.php", {"name": "Adam", "site": "www.example.com"});
// 4. 陣列參數(PHP 端以 $_GET['myinfo'] 接收陣列)
$("#myID").load("test.php", {'myinfo[]': ["Adam", "www.example.com"]});
</script>
<?php
// 1. 無參數
// 2. $_GET['name'] = 'Adam'
// 3. $_GET['name']='Adam', $_GET['site']='www.example.com'
// 4. $_GET['myinfo'] = ['Adam', 'www.example.com']
echo "<p>伺服器時間:" . date('Y-m-d H:i:s') . "</p>";
echo "<p>收到參數:" . htmlspecialchars(json_encode($_REQUEST)) . "</p>";
?>
<script>
// 明確使用 POST
$("#myID").load("api.php", {token: "abc123", act: "refresh"}, function(response, status, xhr) {
if (status === "error") {
console.error("載入失敗:", xhr.status, xhr.statusText);
$("#myID").html("<span class='error'>資料載入失敗,請重試</span>");
}
});
</script>
fetch() / XMLHttpRequest(現代、無依賴)不想引入 jQuery 時,可使用瀏覽器原生 API,靈活度最高。
fetch()(推薦)<div id="result"></div>
<script>
async function loadPhpContent() {
try {
const res = await fetch('api.php', {
method: 'POST',
headers: {'Content-Type': 'application/x-www-form-urlencoded'},
body: new URLSearchParams({action: 'getData', id: 123})
});
if (!res.ok) throw new Error(`HTTP ${res.status}`);
const html = await res.text();
document.getElementById('result').innerHTML = html;
} catch (e) {
console.error(e);
document.getElementById('result').textContent = '載入失敗';
}
}
loadPhpContent();
</script>
<?php
// api.php
header('Content-Type: application/json; charset=utf-8');
$action = $_POST['action'] ?? $_GET['action'] ?? '';
$id = (int)($_POST['id'] ?? $_GET['id'] ?? 0);
$data = [
'code' => 200,
'msg' => 'success',
'data' => [
'id' => $id,
'time' => date('c'),
'info' => "處理動作:$action"
]
];
echo json_encode($data);
?>
| 方案 | 優點 | 缺點 | 適用場景 |
|---|---|---|---|
<script src> | 無需 JS 库、極簡單 | 只能輸出 JS、難除錯、阻塞渲染 | 極簡單計數器、廣告投放 |
jQuery .load() | 語法簡潔、自動處理參數、插入 DOM 方便 | 需引入 jQuery、較難控制請求細節 | 後台管理系統、局部刷新、快速開發 |
fetch()/AJAX | 原生、支援 Promise/async、完整控制 Header/Body/錯誤 | 程式碼較多、需自行處理 DOM 更新 | 現代前端專案、API 串接、SPA 架構 |
htmlspecialchars() 防 XSS。header('Cache-Control: no-store, must-revalidate'); 避免瀏覽器快取舊資料。靜態 HTML 調用 PHP 的本質是「客戶端發起第二次 HTTP 請求」。專案若已使用 jQuery,.load() 是最快上手的方案;現代專案建議改用 fetch() 搭配 JSON API,實現前後端分離,維護性與擴展性更佳。