php数据库怎么进用mysql扩展进库_php老扩展连库法【教程】

发布时间 - 2026-01-26 00:00:00    点击率:
mysql_connect() 在 PHP 7.0+ 中已被彻底移除,必须改用 mysqli 或 PDO;需显式设置 utf8mb4 字符集并使用预处理语句防止 SQL 注入。

mysql_connect() 已被彻底移除,PHP 7.0+ 无法使用

PHP 7.0 起,mysql_* 系列函数(如 mysql_connect()mysql_query())已被完全删除,不是“不推荐”,而是**根本不存在**。如果你在 PHP 7.x 或 8.x 环境下看到 Fatal error: Uncaught Error: Call to undefined function mysql_connect(),这就是原因。

这不是配置问题,也不是 extension 没开启——它连源码里都没了。强行降级到 PHP 5.6 并非可行方案,该版本早已停止安全更新,生产环境严禁使用。

替代方案只有两个:mysqli 或 PDO

必须改用现代扩展。两者都支持面向对象和过程式调用,但行为细节差异明

显:

  • mysqli 是 MySQL 官方维护的专用扩展,语法更贴近老 mysql_* 风格,迁移成本略低;
  • PDO 是通用数据库抽象层,支持 MySQL、PostgreSQL、SQLite 等多种驱动,参数绑定更安全,是长期项目首选。

示例对比(连接本地 test 库):

// mysqli 过程式
$conn = mysqli_connect('localhost', 'root', 'pass', 'test');
if (!$conn) die('连接失败:' . mysqli_error($conn));

// PDO(推荐用 try/catch + 异常模式) try { $pdo = new PDO('mysql:host=localhost;dbname=test;charset=utf8mb4', 'root', 'pass', [ PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC ]); } catch (PDOException $e) { die('连接失败:' . $e->getMessage()); }

字符集必须显式声明,否则中文乱码大概率发生

mysql_* 扩展默认不设字符集,靠 MySQL 服务端配置兜底,极易出错。新扩展必须主动指定:

  • mysqli:连接后立即执行 mysqli_set_charset($conn, 'utf8mb4'),或在 DSN 中加 ;charset=utf8mb4(仅限面向对象方式);
  • PDO:必须在 DSN 中写明 charset=utf8mb4,且不能只写 utf8(MySQL 的 utf8 实际是 utf8mb3,不支持 emoji);
  • 同时确认 MySQL 服务端 character_set_server 和库/表的 COLLATE 也设为 utf8mb4_unicode_ci 级别。

查询语句不能再直接拼接变量,SQL 注入风险极高

老写法 "SELECT * FROM user WHERE id = " . $_GET['id'] 在新扩展中依然能运行,但等于裸奔。必须用预处理:

  • mysqli:用 mysqli_prepare() + mysqli_stmt_bind_param()
  • PDO:用 prepare() + execute(),支持命名参数(:id)和问号占位符;
  • 即使只是整数 ID,也别信“过滤 intval 就安全”——类型绕过、逻辑漏洞仍存在,预处理是唯一可靠路径。

老代码里满屏的 mysql_real_escape_string() 全部删掉,它对新扩展无效,且本身防不住所有注入场景。

真正卡住人的往往不是语法转换,而是隐性依赖:比如某些老 CMS 的数据库类封装了 mysql_* 调用,直接替换函数名会崩;或者错误处理逻辑硬编码了 mysql_error() 返回格式。这类情况必须逐层检查调用链,不能只改入口连接代码。


# mysql  # php  # cms  # 编码  # 中文乱码  # sql  # 面向对象  # 封装  # select  # Error  # mysqli  # pdo  # undefined  # function  # 对象  # sqlite  # postgresql  # 数据库  # 已被  # 服务端  # 移除  # 这就是  # 你在  # 设为  # 这类  # 这不是  # 不存在 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: EditPlus中的正则表达式实战(6)  ,怎么在广州志愿者网站注册?  CSS3怎么给轮播图加过渡动画_transition加transform实现【技巧】  潮流网站制作头像软件下载,适合母子的网名有哪些?  Laravel如何配置和使用队列处理异步任务_Laravel队列驱动与任务分发实例  Laravel如何自定义分页视图?(Pagination示例)  如何在阿里云虚拟主机上快速搭建个人网站?  微信小程序 canvas开发实例及注意事项  如何在橙子建站中快速调整背景颜色?  Laravel 419 page expired怎么解决_Laravel CSRF令牌过期处理  Laravel怎么调用外部API_Laravel Http Client客户端使用  矢量图网站制作软件,用千图网的一张矢量图做公司app首页,该网站并未说明版权等问题,这样做算不算侵权?应该如何解决?  如何用已有域名快速搭建网站?  EditPlus中的正则表达式 实战(2)  ChatGPT常用指令模板大全 新手快速上手的万能Prompt合集  laravel怎么配置Redis作为缓存驱动_laravel Redis缓存配置教程  JavaScript如何实现路由_前端路由原理是什么  Android使用GridView实现日历的简单功能  Laravel怎么自定义错误页面_Laravel修改404和500页面模板  Laravel如何配置Horizon来管理队列?(安装和使用)  Laravel中DTO是什么概念_在Laravel项目中使用数据传输对象(DTO)  如何正确下载安装西数主机建站助手?  如何安全更换建站之星模板并保留数据?  香港服务器租用费用高吗?如何避免常见误区?  Laravel如何处理跨站请求伪造(CSRF)保护_Laravel表单安全机制与令牌校验  如何选择可靠的免备案建站服务器?  Laravel如何实现一对一模型关联?(Eloquent示例)  高端建站三要素:定制模板、企业官网与响应式设计优化  Laravel怎么实现模型属性的自动加密  Laravel怎么实现一对多关联查询_Laravel Eloquent模型关系定义与预加载【实战】  如何快速启动建站代理加盟业务?  阿里云高弹*务器配置方案|支持分布式架构与多节点部署  Laravel如何实现模型的全局作用域?(Global Scope示例)  公司网站制作需要多少钱,找人做公司网站需要多少钱?  Laravel Eloquent:优雅地将关联模型字段扁平化到主模型中  深圳网站制作公司好吗,在深圳找工作哪个网站最好啊?  javascript基于原型链的继承及call和apply函数用法分析  Python图片处理进阶教程_Pillow滤镜与图像增强  如何撰写建站申请书?关键要点有哪些?  为什么要用作用域操作符_php中访问类常量与静态属性的优势【解答】  Laravel API路由如何设计_Laravel构建RESTful API的路由最佳实践  Internet Explorer官网直接进入 IE浏览器在线体验版网址  Win10如何卸载预装Edge扩展_Win10卸载Edge扩展教程【方法】  如何获取PHP WAP自助建站系统源码?  微信小程序制作网站有哪些,微信小程序需要做网站吗?  如何在 Go 中优雅地映射具有动态字段的 JSON 对象到结构体  如何在不使用负向后查找的情况下匹配特定条件前的换行符  什么是javascript作用域_全局和局部作用域有什么区别?  制作旅游网站html,怎样注册旅游网站?  如何快速选择适合个人网站的云服务器配置?