写代码不怕出BUG,就怕不知道BUG在哪。下面这套排查方法,日常开发90%的问题都能快速定位。
一、先打开错误显示,别让BUG藏着
很多人一遇到白屏就慌,其实PHP早就把错误信息写在脸上了,只是你没打开。
error_reporting(E_ALL);
ini_set('display_errors', 1);
把这两行放在脚本最开头,任何报错都会直接显示在页面上,不用去翻日志。
上线后记得关掉,防止泄露敏感信息。
二、看错误信息,别瞎猜
报错信息分三部分,逐行读:
Fatal error: Uncaught Error: Call to undefined function xxx() in /var/www/index.php on line 25
- 错误类型:Fatal error(致命错误)/ Warning(警告)/ Notice(提示)
- 错误原因:Call to undefined function xxx() — 函数不存在
- 出错位置:index.php 第25行
90%的BUG,看一眼错误信息就知道怎么回事了。不要盯着代码猜,先看报错。
三、var_dump / print_r,把变量打出来
逻辑不对,就把中间变量打出来看看:
var_dump($user);
var_dump($result);
exit;
加
exit;是为了让程序停在这里,别继续往下跑干扰你看结果。
常用调试小技巧:
// 看数组结构
echo '<pre>';
print_r($data);
echo '</pre>';
// 看变量类型和值
var_dump($id, $name, $list);
// 看SQL执行结果
echo $sql;
四、二分法注释,缩小范围
不知道哪行出问题,就把代码一半注释掉:
- 注释掉后半段,看还报不报错
- 不报错 → 问题在后半段
- 还报错 → 问题在前半段
- 继续对半分,直到定位到具体某一行
这个方法最笨但最有效,比你一行行盯着看快多了。
五、常见BUG速查表
| 报错信息 | 原因 | 解决方法 |
|---|---|---|
| Call to undefined function | 函数没定义/扩展没开 | 检查函数是否存在,扩展是否开启 |
| Undefined index: xxx | 数组键不存在 | 先 isset() 再取值 |
| Undefined variable | 变量没定义就用了 | 先初始化变量 |
| Class not found | 类没加载/命名空间错了 | 检查use和autoload |
| SQLSTATE[xxx] | SQL语法错或字段不存在 | 打印SQL语句,到数据库里手动执行 |
| header already sent | header之前有输出 | 去掉之前的echo/空格/BOM |
| 500 Internal Server Error | PHP致命错误 | 打开display_errors看具体报错 |
六、实战案例:一个BUG的排查全过程
场景:保存文章后,内容丢了
第一步:打开错误显示
error_reporting(E_ALL);
ini_set('display_errors', 1);
第二步:看报错
页面没报错,但保存后内容不对。
第三步:var_dump看变量
var_dump($_POST['content']);
var_dump($content);
exit;
第四步:发现问题
// 错误写法
$content = trim(isset($_POST['content'])?$_POST['title']:'');
// 正确写法
$content = trim(isset($_POST['content'])?$_POST['content']:'');
把
$_POST['content']写成了$_POST['title'],内容当然存成标题了。
第五步:修复,测试
改完重新测试,问题解决。
七、养成好习惯,少出BUG
- 先报错再排查:别猜,让PHP告诉你哪里错了
- 变量先初始化:用之前先赋值,避免Undefined variable
- 数据库操作先打印SQL:复制到phpMyAdmin手动执行,看结果
- 改代码前先备份:改坏了能回退
- 写完一段测一段:别写完一大段再测,出问题不知道是哪段
八、总结
排查BUG的核心就三句话:
打开错误显示 → 看报错信息 → 打印变量确认
别盯着代码想为什么,让代码自己告诉你问题在哪。
遇到BUG不可怕,可怕的是不知道BUG在哪。会排查BUG,比会写代码更重要。