You need to enable JavaScript to run this app. PHP升级至5.6后原有mysql代码迁移为MySQLi的连接与查询实现咨询
优惠活动
大模型
产品
解决方案
定价
更多

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个核心差异:

  1. 所有mysqli的函数,都要把数据库连接对象$link作为第一个参数传入
  2. 取结果数组时要明确指定返回的索引类型,避免内存浪费

新旧函数映射关系:

  • 旧: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.23 05:45:09