做 PHP 开发多年以来,日常经常遇到新手同事代码跑不起来,报错却看不懂的问题。
很多刚入行的开发都踩过变量未定义、循环卡死、SQL 注入这些坑。
今天给大家整理工作中可直接复用的避坑技巧,全是血泪教训。
本文用大白话讲解,不带废话,实操性强,看懂就能直接用到项目里,建议收藏备用。
一、变量大小写不统一,报错找不到原因
PHP 中变量名区分大小写,但很多新手被函数名不敏感误导,以为 $name 和 $Name 是同一个。
结果页面报“未定义变量”,排查半天发现只是大小写写错了。
下面这段代码会直接报错,因为变量名不一致:
// 定义了一个变量叫 $userName
$userName = "张三";
// 但后面用的是 $username(字母 n 小写了)
echo $username; // 报错:Undefined variable
正确做法:全局统一命名风格,比如全部小写 + 下划线,或者严格驼峰一致:
$user_name = "张三";
echo $user_name; // 一致,没问题
// 或者
$userName = "张三";
echo $userName; // 大小写完全匹配
💡 提醒:函数名、类名不区分大小写,但变量名、数组键名、常量(默认)都区分。养成严谨习惯。
二、变量不初始化,直接判断或使用
新手经常直接从 $_POST 或 $_GET 取值就用,没考虑参数没传的情况。
如果某个分支里才定义变量,后面直接判断就会触发“未定义变量”报错。
下面这种写法,当 age 参数小于等于 18 或没传时,$isAdult 根本不存在:
if ($_POST['age'] > 18) {
$isAdult = true;
}
// 如果上面条件不成立,这里就会报错
if ($isAdult) {
echo"成年人";
}
正确做法:变量先初始化一个默认值,再用 isset 判断输入是否存在:
$isAdult = false; // 先给个默认值
if (isset($_POST['age']) && $_POST['age'] > 18) {
$isAdult = true;
}
if ($isAdult) {
echo"成年人";
}
PHP 7+ 还可以用 null 合并运算符快速设置默认值:
$age = $_POST['age'] ?? 0;
$isAdult = $age > 18;
三、循环内查数据库,页面直接卡死
这是新手最隐蔽的性能杀手:在 foreach 里面写 SQL 查询。
用户列表 100 条,数据库就被查了 100 次,页面响应从毫秒变成秒级。
下面这种“N+1 查询”写法,千万不要用:
$users = $db->query("SELECT * FROM users");
foreach ($users as $user) {
// 每循环一次,执行一次 SQL —— 100个用户就查100次
$orders = $db->query("SELECT * FROM orders WHERE user_id = " . $user['id']);
}
正确做法:把关联数据一次性查出来,再用数组映射关联:
// 1. 查出所有用户
$users = $db->query("SELECT * FROM users");
$userIds = array_column($users, 'id');
$idStr = implode(',', $userIds);
// 2. 一次查询所有订单
$allOrders = $db->query("SELECT * FROM orders WHERE user_id IN ($idStr)");
// 3. 将订单按 user_id 分组
$ordersMap = [];
foreach ($allOrders as $order) {
$ordersMap[$order['user_id']][] = $order;
}
// 4. 循环用户时直接从内存里取订单
foreach ($users as $user) {
$orders = $ordersMap[$user['id']] ?? [];
// 处理该用户的订单...
}
记住:能一次查完,绝不循环查。
四、参数不做过滤,留下安全漏洞
直接把 $_GET['id'] 拼进 SQL 或拼进 HTML,这是最危险的坏习惯。
SQL 注入和 XSS 攻击几乎都源于此。
下面两行代码,每一行都能让服务器被黑客轻松拿下:
// 危险1:SQL注入
$id = $_GET['id'];
$result = $db->query("SELECT * FROM news WHERE id = $id");
// 危险2:XSS攻击
echo"<div>" . $_GET['content'] . "</div>";
正确做法:过滤输入 + 转义输出。
对数字类型的 ID,强制用 intval 转换:
$id = intval($_GET['id']); // 变成纯数字,无法注入
对字符串,必须使用 PDO 预处理语句:
$stmt = $pdo->prepare("SELECT * FROM users WHERE name = ?");
$stmt->execute([$_POST['name']]);
输出到 HTML 时,用 htmlspecialchars 转义:
echo htmlspecialchars($_GET['content'], ENT_QUOTES, 'UTF-8');
🔒 永远不要信任用户输入,这是安全的第一原则。
额外提醒:开发环境一定要开启错误提示
很多新手搭完环境,PHP 报错时页面一片空白,连哪里错了都不知道。
你只需要在开发环境加上这两行,问题就会直接显示在页面上:
ini_set('display_errors', 1);
error_reporting(E_ALL);
等代码上线到生产环境时,再关闭显示、改为记录日志即可。
以上就是本次分享的 PHP 实用技巧,内容都是工作实战总结,觉得有用可以点赞、推荐,方便后续随时回看。
后续持续更新 PHP、ThinkPHP、MySQL 实战干货,有问题欢迎评论区留言交流。
专注分享 PHP、ThinkPHP、MySQL 实战开发干货,只讲工作能用得上的技巧,不堆砌理论、不写废话。
建议收藏本号,后续持续更新避坑教程、实战源码和面试知识点。