<p>PHP 8 中必须用 mysqli 或 PDO 连接 MySQL,mysql_* 函数已彻底移除;mysqli 面向对象需检查 $mysqli->connect_error,端口须作第五参数传入,字符集必须用 utf8mb4;PDO 必须设置 ATTR_ERRMODE 为 EXCEPTION 且 DSN 中声明 charset=utf8mb4。</p>

PHP 8 中操作 MySQL,必须用 mysqli 或 PDO,mysql_connect() 等旧函数已彻底移除,硬写会直接报 Fatal error: Uncaught Error: Call to undefined function mysql_connect()。
mysqli 面向对象方式连接失败却没报错?检查这三处
很多问题不是代码写错,而是连接阶段就静默失败了。面向对象方式下,new mysqli() 不会自动抛异常(除非你手动配置 mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT)),所以常见现象是后续调用 $mysqli->query() 时才报错,但错误信息模糊,比如 Call to a member function query() on bool。
- 必须立刻检查
$mysqli->connect_error:它非空即表示连接失败,内容比mysqli_connect_error()更准确 - 端口不能拼在 host 后面:写
localhost:3307会被当成主机名解析失败;正确写法是把端口作为第 5 个参数传入:new mysqli('localhost', $user, $pass, $db, 3307) -
set_charset('utf8')是陷阱:它只支持三字节 UTF-8,存 emoji 或某些生僻字会截断或乱码;必须用set_charset('utf8mb4')
PDO 连接后 SQL 报错却不提示?缺这一行就白连
new PDO() 默认不抛异常,SQL 错误只会返回 false,而你的 if (!$pdo->query(...)) 很可能被忽略,导致逻辑继续执行、数据出错却无感知。
- 必须显式设置:
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION) - DNS 字符集要写在 DSN 里:
mysql:host=localhost;dbname=test;charset=utf8mb4,比连接后再exec("SET NAMES utf8mb4")更可靠,尤其对初始化语句生效 - 别省略
PDO::ATTR_DEFAULT_FETCH_MODE:设成PDO::FETCH_ASSOC后,fetch()直接返回关联数组,避免因键名写错(比如误用数字索引)引发的静默逻辑错误
插入数据后怎么拿到自增 ID?别用 mysql_insert_id()
mysql_insert_id() 已随旧扩展一起消失。现在取决于你用哪种连接方式:
立即学习“PHP免费学习笔记(深入)”;
- mysqli 面向对象:
$mysqli->insert_id—— 必须在query()或execute()插入后立即读取,后续任何其他查询(哪怕只是SELECT 1)都可能覆盖该值 - mysqli 过程式:
mysqli_insert_id($link)—— 同样要求紧接在插入操作之后 - PDO:
$pdo->lastInsertId()—— 它不依赖上一条语句是否为 INSERT,只要当前连接中最近一次 INSERT 成功,就能取到;但注意,如果用了事务且未提交,返回值可能不可靠
预处理语句为什么还是被注入?绑定类型写错就失效
预处理防注入的前提是:用户输入只进 bind_param() 或 bindValue(),绝不能拼进 SQL 字符串。但即使用了预处理,仍有两个易踩坑点:
- mysqli 中
bind_param()的类型字符必须匹配实际数据:s(字符串)、i(整数)、d(浮点)、b(blob);比如把数字用's'绑定,MySQL 会当字符串处理,可能触发隐式类型转换,绕过预期校验 - PDO 中
bindValue()的第三个参数(如PDO::PARAM_INT)不能省略:默认是PDO::PARAM_STR,对数字字段可能导致索引失效或比较异常 - 预处理只保护「数据值」,不保护「SQL 结构」:表名、字段名、ORDER BY 子句等动态部分仍需白名单校验,不能靠绑定解决
字符集、异常模式、ID 获取时机、绑定类型——这四点不抠清楚,再“安全”的写法也会在特定数据或并发场景下翻车。尤其是 utf8mb4 和 PDO::ERRMODE_EXCEPTION,漏一个,线上就可能丢数据或暴露错误细节。



















