開發中遭遇報錯別慌,錯誤信息其實已經告訴你「哪裡錯、為什麼錯、怎麼改」。本文整理 17 類高頻錯誤,附帶原因分析與修復模式,建議收藏備查。
| # | 錯誤輸出關鍵字 | 核心原因 | 典型修復 |
|---|---|---|---|
| 1 | Notice: Undefined variable: xxx | 使用未定義變量 | 先 isset()/?? 判斷,或初始化默認值 |
| 2 | Parse error: syntax error, unexpected 'else' (T_ELSE) | if...elseif...else 結構錯誤 (如 if(){ }else if(){ } echo 1; else{ }) | 檢查大括號配對、elseif 不能拆行、中間不可有輸出語句 |
| 3 | Parse error: syntax error, unexpected end of file | 大括號 {} 不匹配 (少寫 }) | IDE 自動縮進/括號高亮、逐段註釋定位 |
| 4 | Parse error: syntax error, unexpected 'string' (T_STRING) | 語句末尾漏分號 ; | 養成每行結尾加分號習慣 |
| 5 | Warning: Invalid argument supplied for foreach() | foreach 參數非數組/Traversable (如 null、false、標量) | is_array() 或 (array) 強制轉換前判斷 |
| 6 | Warning: mysql_fetch_assoc(): supplied argument is not a valid MySQL result resource | SQL 執行失敗返回 false,未判斷直接取數據 | $res = mysqli_query(...) or die(mysqli_error($conn)); 必檢查 |
| 7 | No database selected | 連接成功但未選庫 | mysqli_select_db($conn, $dbname) 或 DSN 帶 dbname=xxx |
| 8 | Access denied for user 'root'@'localhost' (using password: YES) | 用戶名/密碼錯、主機不匹配、權限不足 | 檢查 user 表 host 欄、FLUSH PRIVILEGES、密碼策略 |
| 9 | Unknown database 'xxx' | 數據庫不存在 | 創建庫、檢查拼寫、確認連接參數 |
| 10 | Table 'db.table' doesn't exist | 表不存在 | 執行建表 SQL、檢查大小寫敏感 (Linux 區分) |
| 11 | Unknown column 'abc' in 'field list' | 字段不存在 | 檢查表結構 DESC table、遷移腳本是否執行 |
| 12 | Column count doesn't match value count at row 1 | INSERT 字段數與值數不一致 | 顯式寫字段名 INSERT INTO t(a,b) VALUES(1,2) |
| 13 | Warning: Wrong parameter count for func() | 函數調用參數個數不匹配定義 | 檢查函數簽名、可選參數默認值 |
| 14 | Smarty error: 'foreach: item' must be a variable name | 模板 {foreach $arr as $item} 寫成 {foreach $arr as item} (漏 $) | 模板變量必須帶 $ 符號 |
| 15 | Smarty error: unrecognized tag: msg.message_id | 模板變量漏 $ (如 {$msg.message_id} 寫成 {msg.message_id}) | 同 14 |
| 16 | Smarty error: unable to read resource: "xxx.tpl" | 模板文件路徑錯、未放入模板目錄、權限不足 | 檢查 $smarty->template_dir、文件是否存在 |
| 17 | Fatal error: Cannot redeclare func() | 同名函數/類重複定義 | 用 include_once/require_once、PSR-4 自動載入、命名空間隔離 |
| 級別 | 嚴重度 | 腳本行為 | 建議 |
|---|---|---|---|
| E_NOTICE / E_WARNING | 低/中 | 繼續執行 | 開發環境全顯示,生產環境記錄日誌,代碼修復消除 |
| E_ERROR / E_PARSE / E_CORE_ERROR | 致命 | 立即終止 | 必須修復,上線前零容忍 |
| E_RECOVERABLE_ERROR | 可捕獲致命 | 若無處理器則終止 | set_error_handler 捕獲並轉為異常 |
in /path/file.php on line 42,直接定位。error_log(print_r($var, true))、Xdebug 斷點單步跟蹤。error_reporting(E_ALL) + display_errors=On (開發)。declare(strict_types=1) + 類型聲明,編譯期攔截類型錯誤。PHP_CodeSniffer (PSR-12) + PHPStan/Psalm 靜態分析,CI 攔截低級錯誤。$smarty->strict_mode = true。錯誤是編譯器/解釋器送給開發者的「精準定位提示」,讀懂它、修好它、防住它,是從「寫出能跑的代碼」到「寫出健壯代碼」的必經之路。