php数据库面试重实践:须掌握pdo预处理防注入、慢查询定位、事务场景与隔离级别、连接管理及索引优化,理解原理而非死记语法。

PHP 数据库面试不考死记硬背,重点看是否真正用过、调过、防过。面试官想确认你能不能安全、稳定、高效地把 PHP 和数据库连起来干活——不是写个 mysql_connect() 就完事,而是知道为什么选 PDO、怎么避免 SQL 注入、慢查询怎么定位、事务在什么场景下必须加、连接太多怎么收口。
数据库连接与操作:PDO 是底线,MySQLi 是加分项
PHP 7+ 已移除 mysql_* 函数,PDO 和 MySQLi 是唯二主流选择。PDO 更通用(支持多种数据库),MySQLi 更贴近 MySQL 特性(如预处理、异步查询、SSL 连接)。
- 必须会用 PDO 的预处理(
prepare()+execute()),并清楚它防注入的本质是“参数与 SQL 逻辑分离”,不是“加了 prepare 就绝对安全” - 能说出
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION的作用:让错误抛异常而非静默失败,便于统一捕获和日志记录 - 了解长连接(
PDO::ATTR_PERSISTENT => true)的利弊:减少握手开销,但可能引发连接数爆满、事务状态残留等问题,线上慎用
SQL 安全:注入不是“加个 htmlspecialchars 就行”
HTML 转义防 XSS,对 SQL 注入完全无效。真正的防线在数据进入查询前就切断拼接路径。
- 所有用户输入(GET/POST/COOKIE/文件名/路由参数)进 SQL 前,必须走预处理或白名单校验;数字 ID 用
(int)或filter_var($id, FILTER_VALIDATE_INT)强制转换 - 动态表名、字段名不能参数化,需用白名单严格限制:
in_array($table, ['user', 'order', 'log'], true) - 知道
mysqli_real_escape_string()是过时方案,仅适用于极老系统且必须配合单引号包裹,现代项目禁用
性能与调试:从慢查询日志到执行计划
面试常问“列表页变慢怎么查”,答案不是换 Redis,而是先看 SQL 本身。
齐博B2B系统是一款基于PHP程序和Mysql数据库为基础的开源B2B行业门户电子商务网站建站系统, 系统代码完整、开源,功能全面,架构优秀,提供良好的用户体验、及管理平台,是目前搭建B2B行业门户网站最好的程序之一。齐博B2B具有的功能特点包括:通行证整合功能通过通行证的整合,可以与流行的PHPWIND论坛或Discuz论坛以及Ucenter中心等进行通讯,从而为用户提供更多的交流场所,增加网站
立即学习“PHP免费学习笔记(深入)”;
- 开启 MySQL 慢查询日志(
slow_query_log=ON,long_query_time=1),用mysqldumpslow或 pt-query-digest 分析热点 SQL - 对慢 SQL 执行
EXPLAIN,重点关注type(是否用到索引)、key(用了哪个索引)、rows(扫描行数)、Extra(是否 Using filesort / Using temporary) - 理解复合索引最左前缀原则:
INDEX(a,b,c)可用于WHERE a=1、WHERE a=1 AND b=2,但无法用于WHERE b=2
事务与并发:什么时候该上事务,什么时候不该
事务不是银弹。滥用会导致锁等待、死锁、性能下降;不用则可能引发资金错乱、库存超卖等严重问题。
- 必须加事务的典型场景:转账(扣A余额+加B余额)、下单(减库存+写订单+写日志)、多表关联更新
- 明确事务边界:PHP 中用
$pdo->beginTransaction()/commit()/rollback()控制,避免在循环内反复开启 - 了解隔离级别影响:
READ COMMITTED防脏读,REPEATABLE READ(MySQL 默认)防不可重复读,但幻读需靠间隙锁或SELECT ... FOR UPDATE
不复杂但容易忽略:连接未关闭、事务没回滚、错误没日志、索引没覆盖查询字段——这些才是线上事故高频原因。把每一步操作背后的“为什么”想清楚,比背十句语法管用得多。










