学习PHP最有效的方式不是背语法,而是动手写可运行的小实例。下面三个例子覆盖Web开发中最常见的场景,代码可直接在本地环境测试。
实例一:接收并校验表单数据
先写一个简单的留言表单,提交到 save.php。服务端用 filterinput 取数据,避免直接信任 $POST。
$name = trim(filterinput(INPUTPOST, ‘name’, FILTERSANITIZESPECIAL_CHARS));
$email = filterinput(INPUTPOST, ’email’, FILTERVALIDATEEMAIL);
if (!$name || !$email) {
exit(‘请填写有效的姓名和邮箱’);
}
要点:FILTERVALIDATEEMAIL 返回 false 时说明格式不合法;输出到页面时用 htmlspecialchars 转义,防止XSS。这个实例虽小,却体现了“输入校验 + 输出转义”的基本安全思路。
实例二:用PDO查询数据
假设有一张 articles 表,按关键词搜索标题。不要拼接SQL字符串,改用预处理语句。
$pdo = new PDO(‘mysql:host=localhost;dbname=demo;charset=utf8mb4’, $user, $pass, [
PDO::ATTRERRMODE => PDO::ERRMODEEXCEPTION,
]);
$stmt = $pdo->prepare(‘SELECT id, title FROM articles WHERE title LIKE ? ORDER BY id DESC LIMIT 10’);
$stmt->execute([‘%’ . $keyword . ‘%’]);
foreach ($stmt->fetchAll(PDO::FETCH_ASSOC) as $row) {
echo htmlspecialchars($row[‘title’], ENT_QUOTES, ‘UTF-8’);
}
预处理能有效阻断SQL注入,charset=utf8mb4 则兼顾中文与表情符号。注意把连接参数放到配置文件,不要硬编码在业务代码里。
实例三:文件上传与目录遍历
上传实例要关注三点:类型白名单、大小限制、重命名存储。
$allow = [‘image/jpeg’ => ‘jpg’, ‘image/png’ => ‘png’];
$info = finfoopen(FILEINFOMIME_TYPE);
$mime = finfofile($info, $FILES[‘pic’][‘tmp_name’]);
if (!isset($allow[$mime]) || $_FILES[‘pic’][‘size’] > 2 * 1024 * 1024) {
exit(‘仅支持2MB以内的JPG/PNG’);
}
$newName = bin2hex(random_bytes(16)) . ‘.’ . $allow[$mime];
moveuploadedfile($FILES[‘pic’][‘tmpname’], DIR . ‘/uploads/’ . $newName);
用MIME检测而非文件后缀判断类型,随机文件名避免覆盖与路径猜测。展示上传目录时,配合 glob('uploads/*.jpg') 遍历即可,不要直接暴露用户可控路径。
让实例更接近项目
把重复的数据库连接抽成 db.php,表单校验封装为函数,上传配置写入数组。小实例的价值在于可复用:先跑通,再重构,最后补上错误日志与异常处理。这样写出来的PHP代码,才经得起真实流量的检验。