You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从数据库检索数据并赋值到数组?PHP代码解析

代码逐行解析

咱们一行一行拆解这段代码的逻辑:

  • function get_name(){:定义一个无参数的函数,命名为get_name。
  • global $con;:把全局作用域里的数据库连接变量$con引入到函数内部,这样函数就能用这个连接来执行数据库操作。
  • $sql= "SELECT name FROM hotels";:构造SQL查询语句,指定从hotels表中获取name列的数据。表名用反引号包裹是为了避免和MySQL的关键字冲突(如果表名刚好是关键字的话)。
  • $result = mysqli_query($con, $sql) or die(mysqli_error($con));:执行上面的SQL语句。如果执行失败,die()会直接输出数据库错误信息并终止脚本运行;如果成功,会返回一个结果集对象,存储在$result里。
  • $count = mysqli_num_rows($result);:统计结果集中的总行数,也就是有多少条酒店名称数据。
  • $name=array();:初始化一个空数组,用来存放后续读取到的酒店名称。
  • for($i=0;$i<$count;$i++){:开启一个循环,循环次数等于结果集的行数。
    • while($row=mysqli_fetch_row($result)) {:用mysqli_fetch_row()逐行读取结果集,每次读取一行数据,把它存到$row数组中(因为我们只查了name列,所以$row里只有一个元素,索引为0)。
    • $name[$i]=$row[$i];:尝试把$row数组的第i个元素赋值给$name数组的第i个位置。
  • return $name;:函数执行完毕,返回存储了酒店名称的数组。

代码里的问题&优化建议

这段代码存在一个逻辑错误,会导致数据读取异常:
while循环嵌套在for循环里是完全多余的,甚至会搞砸数据读取。因为mysqli_fetch_row()会一次性把结果集的所有行读完——第一次进入while循环时,就会把所有行都取出来,后续的for循环迭代中,mysqli_fetch_row()已经没有数据可读取了,while循环根本不会执行。

另外,$row[$i]这里还会触发索引越界警告:因为我们只查了name一列,$row数组只有索引0的元素,当i>=1时,$row[$i]是不存在的。

优化后的代码(最简版)

直接去掉外层的for循环,用while循环遍历所有行,把每个name值追加到数组里即可:

function get_name(){
    global $con;
    $sql= "SELECT name FROM `hotels`";
    $result = mysqli_query($con, $sql) or die(mysqli_error($con));
    $name = array();
    // 逐行读取结果集,把name值加入数组
    while($row = mysqli_fetch_row($result)) {
        $name[] = $row[0];
    }
    return $name;
}

更易读的版本(用关联数组)

用mysqli_fetch_assoc()可以通过字段名取值,代码可读性更强:

function get_name(){
    global $con;
    $sql= "SELECT name FROM `hotels`";
    $result = mysqli_query($con, $sql) or die(mysqli_error($con));
    $name = array();
    while($row = mysqli_fetch_assoc($result)) {
        $name[] = $row['name'];
    }
    return $name;
}

进阶优化(避免全局变量)

尽量不要用global引入变量,把数据库连接作为参数传入函数,这样函数的独立性更强,也更符合代码规范:

function get_name($con){
    $sql= "SELECT name FROM `hotels`";
    $result = mysqli_query($con, $sql) or die(mysqli_error($con));
    $name = array();
    while($row = mysqli_fetch_assoc($result)) {
        $name[] = $row['name'];
    }
    return $name;
}

// 调用时传入数据库连接
// $hotelNames = get_name($con);

错误处理优化

生产环境中尽量不要用die()直接终止脚本,建议用异常处理来捕获错误,这样可以更优雅地处理异常情况:

function get_name($con){
    $sql= "SELECT name FROM `hotels`";
    $result = mysqli_query($con, $sql);
    if (!$result) {
        throw new Exception(mysqli_error($con));
    }
    $name = array();
    while($row = mysqli_fetch_assoc($result)) {
        $name[] = $row['name'];
    }
    return $name;
}

// 调用时可以捕获异常
try {
    $hotelNames = get_name($con);
} catch (Exception $e) {
    // 处理错误,比如记录日志、给用户友好提示
    echo "获取数据失败:" . $e->getMessage();
}

内容的提问来源于stack exchange,提问作者ahmed bukeer

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 03:42:39