PHP升级至5.6后原有mysql代码迁移为MySQLi的连接与查询实现咨询
第一步:修正你现有
bank.php的连接代码错误 你目前写的连接逻辑有个明显笔误:不存在mysqli_database()这个函数,这是旧版mysql_select_db()的拼写混淆。正确的连接实现可以直接把数据库名作为mysqli_connect()的第4个参数传入,不需要单独执行选库操作;同时必须显式设置连接字符集(旧版mysql扩展会自动按默认设定选字符集,升级到mysqli后会默认用客户端配置的字符集,很容易出现中文乱码)。
正确的bank.php代码:
<?php $link = mysqli_connect($dbhost, $dbuser, $dbpass, $dbname); if (!$link) { die('数据库连接失败:' . mysqli_connect_error()); } // 显式设置连接字符集,适配中文存储 mysqli_set_charset($link, 'utf8mb4'); ?>
第二步:业务查询逻辑的逐函数对应替换
旧mysql扩展和面向过程风格的mysqli扩展函数几乎是一一对应的,只需要注意2个核心差异:
- 所有mysqli的函数,都要把数据库连接对象
$link作为第一个参数传入 - 取结果数组时要明确指定返回的索引类型,避免内存浪费
新旧函数映射关系:
- 旧:
mysql_connect(主机,账号,密码)→ 新:mysqli_connect(主机,账号,密码,库名) - 旧:
mysql_select_db(库名, $link)→ 新:已经集成在上面的连接函数里,不需要单独写 - 旧:
mysql_query($SQL, $link)→ 新:mysqli_query($link, $SQL) - 旧:
mysql_fetch_array($资源)→ 新:mysqli_fetch_array($资源, MYSQLI_NUM),这里传MYSQLI_NUM是为了完全对齐你原来用数字下标($result[1]、$result[8])取结果的逻辑
按照上面的映射关系,你原有的业务页代码改造后如下,可以直接替换使用:
<?php include('req.php'); include('bank.php'); $query = "SELECT * FROM xx WHERE xx IN ('xx')"; // 执行查询,连接对象放在参数第一位 $resource = mysqli_query($link, $query); // 增加结果校验,避免SQL语法错误时输出空白表格 if (!$resource) { die('SQL执行异常:' . mysqli_error($link)); } echo " <table id=\"space\" class=\"sortable\" align=\"center\" border=\"0\" width=\"95%\"> <tr> <td><b>Column 1</b></td><td><b>Column 2</b></td><td><b>Column 3</b></td><td><b>Column 4</b></td><td><b>Column 5</b></td><td><b>Column 6</b></td><td><b>Column 3</b></td> </tr>"; while($result = mysqli_fetch_array($resource, MYSQLI_NUM)) { echo "<tr><td>".$result[1]." </td><td>".$result[8]."</td><td>".$result[15]."</td><td>".$result[21]."</td><td>".$result[17]."</td><td>".$result[16]."</td><td><a href='/pages/things.php?result=$result[24]'>Link</a></td></tr>"; } echo "</table>"; // 主动释放结果集内存 mysqli_free_result($resource); ?>
配套优化建议
- 调整错误输出逻辑:目前的
die()会直接把数据库连接、SQL错误信息抛给前端,容易暴露服务器敏感配置,生产环境可以把错误写到日志文件,前端只输出通用的“系统繁忙”提示 - 消除硬编码数字下标:现在的代码按字段在结果集里的顺序下标取值,一旦后续表结构调整字段顺序,整个页面的输出就会错乱,把
MYSQLI_NUM改成MYSQLI_ASSOC,按字段名取值,稳定性会高很多 - 规避注入风险:现有逻辑里SQL参数、跳转链接的参数都是直接字符串拼接,存在SQL注入、XSS风险,可以用mysqli提供的预处理语句实现参数绑定,动态传入查询值
- 避免重复建连:现在每个页面都要单独引入连接文件创建连接,可以把数据库连接封装成全局单例,整个脚本生命周期只创建一次连接,减少数据库的连接压力
- 主动释放资源:脚本执行结束后调用
mysqli_close($link)释放连接,避免连接数堆积打满数据库的最大连接数限制
内容的提问来源于stack exchange,提问作者KlamsonKrate
相关产品推荐
相关产品推荐

