php怎么连接数据库:两种主流写法对比
php怎么连接数据库,项目开发优先选用PDO方式,废弃mysql扩展,mysqli分为面向对象与面向过程写法,PDO支持多种数据库切换,mysqli仅适配MySQL系列数据库;你本地环境需要提前开启对应php扩展,PHP7.0及以上版本已经移除旧mysql扩展,若仍使用该扩展代码会直接报致命错误,适合新手快速上手的是mysqli面向对象写法,需要跨数据库兼容的业务场景选择PDO,单机小型网站两种方案都能稳定运行,分布式多数据库业务优先PDO。
php连接数据库的扩展对比
| 连接方式 | 支持数据库 | 防SQL注入能力 | 适用PHP版本 |
|---|---|---|---|
| PDO | MySQL、PostgreSQL等 | 支持预编译,防护较强 | PHP5.1及以上 |
| mysqli面向对象 | 仅MySQL | 支持预编译,防护较强 | PHP5.0及以上 |
| mysql扩展 | 仅MySQL | 不支持预编译,不推荐 | PHP5废弃,PHP7直接移除 |
开启扩展的操作在php.ini配置文件内,找到对应行,删除行首分号即可启用,启用后重启web服务,Apache或者Nginx,修改才会生效。PDO对应的配置项是extension=pdo_mysql,mysqli对应extension=mysqli,你可以通过phpinfo()函数查看扩展是否加载成功,页面搜索pdo_mysql或mysqli关键词,找到模块信息就代表开启完成。
mysqli面向对象连接示例代码,变量依次填写数据库地址、账号、密码、数据库名,主机地址本地一般写localhost或者127.0.0.1,localhost会走socket通信,127.0.0.1走TCP连接,本地开发两种填写方式大多都能正常连通。代码执行newmysqli创建实例,之后判断连接错误号,不为0代表连接失败,读取错误信息排查问题,连接成功后设置字符集为utf8mb4,完整支持emoji表情存储。
字符集必须设置utf8mb4。
PDO连接数据库的代码,使用newPDO创建实例,DSN字符串定义数据库类型、地址、库名和端口,端口默认3306,数据库修改端口后需要手动填写。创建实例时加上异常错误模式配置,数据库连接失败会抛出异常,方便捕获错误,同样执行SQL前设置字符集utf8mb4,PDO使用预编译prepare方法,参数绑定可以减少SQL注入风险,不要直接拼接用户输入内容到SQL语句字符串。
连接完成后,查询数据时,mysqli用query执行查询,fetch_assoc读取单行数组,PDO执行execute之后调用fetch获取结果集。查询结束不需要手动关闭连接,PHP脚本执行完毕会自动释放数据库连接,长时间运行的守护进程脚本,才需要手动调用close方法断开连接,减少数据库连接池占用。
连接失败常见原因有账号密码错误、数据库服务未启动、服务器防火墙拦截3306端口、数据库用户不允许当前IP访问。数据库账号默认仅允许本地访问,远程服务器访问时,需要在MySQL授权语句里指定客户端IP,否则会持续报访问拒绝错误,不要直接授予%所有IP权限,会扩大数据库安全风险。
该方法的适用边界是运行环境具备对应php数据库扩展,数据库服务正常运行,网络层面可以连通数据库端口。如果是虚拟主机,服务商可能禁用PDO或者mysqli扩展,这种情况你无法自行修改php.ini,只能更换主机套餐,或者使用服务商提供的数据库代理接口。PHP8.0之后对mysqli的部分函数参数做了严格校验,旧代码不做错误判断,会出现更多警告信息,编写代码时建议增加异常捕获逻辑。
SQL注入防护不能只依靠数据库连接代码,就算使用PDO和mysqli预编译,直接拼接用户输入到SQL语句,依旧存在注入风险。你接收前端提交的表单数据,全部通过预编译绑定参数传入SQL,不要把用户变量拼进SQL字符串,这是php数据库开发里基础且有效的安全手段。
