php 7.4 已移除 mysql_* 扩展,须彻底清理代码并启用 pdo_mysql;配置需显式指定 charset=utf8mb4、关闭模拟预处理、设错误模式为异常,确保安全与兼容。

确认残留 mysql_* 调用并停用旧扩展
PHP 7.4 已完全移除 mysql 扩展,任何调用 mysql_connect()、mysql_query()、mysql_fetch_array() 等函数都会触发致命错误。迁移前必须彻底清理代码中所有 mysql_* 函数。
在项目根目录执行命令快速扫描:
- grep -rn "mysql_" --include="*.php" .
- grep -rn "mysql_query\|mysql_connect\|mysql_select_db" --include="*.php" .
同时检查运行环境是否还加载了旧扩展:在 PHP 5.6 环境中查看 php.ini 是否含 extension=php_mysql.dll(Windows)或 extension=mysql.so(Linux),如有则注释掉;PHP 7.4 中该配置无效且可能引发警告。
启用 PDO_MySQL 并验证连接
PDO 是 PHP 7.4 官方推荐的数据库访问方式,需确保 pdo 和 pdo_mysql 两个扩展均已启用。
验证方法:
- 运行 php -m | grep pdo,应输出 pdo 和 pdo_mysql
- 或创建测试脚本:
if (extension_loaded('pdo') && in_array('mysql', PDO::getAvailableDrivers())) {
echo "PDO + MySQL driver OK";
} else {
die("PDO or MySQL driver missing");
}
?>
若未启用,需根据系统安装 PDO_MySQL 扩展(如 Ubuntu 使用 apt install php7.4-mysql,CentOS 使用 yum install php-pdo php-mysqlnd),然后重启 PHP-FPM 或 Web 服务。
统一重构数据库操作为 PDO 面向对象模式
不建议保留过程式 mysqli 或混用旧风格。应集中初始化一个 PDO 实例,并全程使用预处理语句。
典型改造示例:
-
连接初始化(推荐放在 config.php 或 DI 容器中):
$pdo = new PDO(
"mysql:host=localhost;dbname=myapp;charset=utf8mb4",
$user, $pass,
[
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
PDO::ATTR_EMULATE_PREPARES => false
]
); -
查询(带参数绑定,杜绝 SQL 注入):
$stmt = $pdo->prepare("SELECT * FROM users WHERE status = ? AND created_at > ?");
$stmt->execute(['active', '2025-01-01']);
$users = $stmt->fetchAll(); -
写入(自动处理转义与类型):
$stmt = $pdo->prepare("INSERT INTO logs (level, msg, ip) VALUES (?, ?, ?)");
$stmt->execute(['error', 'Login failed', $_SERVER['REMOTE_ADDR']]);
重点修复三类易忽略的兼容细节
仅替换函数名常导致上线后乱码、空结果或报错。以下三点必须逐项核对:
- 字符集声明必须显式指定 utf8mb4:DSN 中写 charset=utf8mb4,而非 utf8(MySQL 的 utf8 实际是 utf8mb3,不支持 emoji)
- 关闭模拟预处理(PDO::ATTR_EMULATE_PREPARES => false):否则参数绑定失效,仍可能被注入;同时避免整数参数被强制转为字符串导致索引失效
- 错误模式设为异常(PDO::ERRMODE_EXCEPTION):否则 execute() 失败静默返回 false,需手动 if (!$stmt->execute()) 判断,极易遗漏
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











