PHP 陣列無法直接在 JS 中使用,必須經過序列化、編碼、輸出、解析四步。主流方案三種,各有優劣:
json_encode(推薦)<script> const list = <?= json_encode($data['arr'], JSON_HEX_TAG | JSON_HEX_APOS | JSON_HEX_QUOT | JSON_HEX_AMP) ?>; drawGpsMap(list); </script>
優點:零額外請求、首屏直出、無 XSS 風險(配合 JSON_HEX_* 旗標)。
適用:資料量 < 50KB、首屏必需、非極度敏感資料。
<script>
fetch('/api/get-list')
.then(r => r.json())
.then(list => drawGpsMap(list))
.catch(console.error);
</script>
優點:首屏快、資料隔離、支援分頁/篩選、敏感資料可做權限校驗。
適用:大資料量、非首屏關鍵、需即時更新、權限控制場景。
// 隱藏域
<input type="hidden" id="js-data" value="<?= htmlspecialchars(json_encode($arr)) ?>">
<script> const list = JSON.parse(document.getElementById('js-data').value); </script>
// 生成靜態 .js(需寫入磁碟、快取失效處理)
file_put_contents('public/data/list.js', 'const LIST = ' . json_encode($arr) . ';');
缺點:隱藏域汙染 DOM、全域變量汙染命名空間、生成 .js 增加部署複雜度與快取問題。不推薦新專案使用。
json_encode,禁止手動拼接字串;JSON_HEX_TAG | JSON_HEX_APOS | JSON_HEX_QUOT | JSON_HEX_AMP 防 XSS;application/json; charset=utf-8;| 錯誤寫法 | 風險 | 修正 |
|---|---|---|
var a = '<?= $arr ?>'; | 語法錯誤、XSS | const a = <?= json_encode($arr, $flags) ?>; |
eval('(' + data + ')') | 代碼注入 | JSON.parse(data) |
| 直接輸出中文未編碼 | 亂碼、截斷 | json_encode 自動 Unicode 轉義,安全可靠 |