PHP 開發中最常見的 Notice: Undefined index 和 Notice: Undefined variable 並非致命錯誤,但會污染日誌、暴露代碼缺陷,甚至干擾 AJAX/JSON 輸出。本文提供從代碼規範到配置調優的分級解決方案。
$_POST['act'] 但表單未提交 actecho $var 但 $var 從未定義<?php
// 三元運算符
$act = isset($_POST['act']) ? $_POST['act'] : 'default';
// Null 合並運算符 (PHP 7+)
$act = $_POST['act'] ?? 'default';
// filter_input (最規範,自動過濾)
$act = filter_input(INPUT_POST, 'act', FILTER_SANITIZE_STRING, ['default' => 'default']);
?>
<?php
// 函數/腳本開頭初始化
$name = $email = $content = '';
// 或陣列批量
$data = ['name' => '', 'email' => '', 'content' => ''] + $_POST; // 合併默認值
?>
<?php
function get($array, $key, $default = '') {
return isset($array[$key]) ? $array[$key] : $default;
}
$act = get($_POST, 'act');
$page = get($_GET, 'page', 1);
?>
; 開發環境:顯示所有錯誤除 Notice
error_reporting = E_ALL & ~E_NOTICE
; 生產環境:關閉顯示,記錄日誌
display_errors = Off
log_errors = On
error_log = /var/log/php_errors.log
<?php
// 腳本頂部
ini_set('error_reporting', E_ALL & ~E_NOTICE);
// 或完全關閉顯示
ini_set('display_errors', '0');
?>
php_value error_reporting 32759 ; E_ALL & ~E_NOTICE
php_flag display_errors Off
背景: PHP 4.2+ 默認 register_globals = Off,舊代碼直接使用 $var 而非 $_POST['var'] 導致未定義。
錯誤做法: 開啟 register_globals = On(嚴重安全隱患,PHP 5.4+ 已移除)。
正確遷移:
<?php
// 頂部批量導入(不推薦長期使用)
extract($_POST);
extract($_GET);
// 需先 session_start()
extract($_SESSION);
// 推薦:逐個顯式賦值或使用封裝函數
?>
error_reporting = E_ALL,強迫自己寫嚴謹代碼display_errors = Off + log_errors = On,用戶不見錯誤,開發者能查日誌$_GET/POST/COOKIE/REQUEST)必須經過 isset()/??/filter_input() 處理input() 方法,全項目統一調用session_start() 前嘗試讀取 $_SESSIONContent-Type: application/x-www-form-urlencoded$var 與 $_POST['var'](register_globals 遺留)