写代码不怕出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;

四、二分法注释,缩小范围

不知道哪行出问题,就把代码一半注释掉:

  1. 注释掉后半段,看还报不报错
  2. 不报错 → 问题在后半段
  3. 还报错 → 问题在前半段
  4. 继续对半分,直到定位到具体某一行

这个方法最笨但最有效,比你一行行盯着看快多了。

五、常见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

  1. 先报错再排查:别猜,让PHP告诉你哪里错了
  2. 变量先初始化:用之前先赋值,避免Undefined variable
  3. 数据库操作先打印SQL:复制到phpMyAdmin手动执行,看结果
  4. 改代码前先备份:改坏了能回退
  5. 写完一段测一段:别写完一大段再测,出问题不知道是哪段

八、总结

排查BUG的核心就三句话:

打开错误显示 → 看报错信息 → 打印变量确认

别盯着代码想为什么,让代码自己告诉你问题在哪。

遇到BUG不可怕,可怕的是不知道BUG在哪。会排查BUG,比会写代码更重要。