如何从数据库检索数据并赋值到数组?PHP代码解析
代码逐行解析
咱们一行一行拆解这段代码的逻辑:
function get_name(){:定义一个无参数的函数,命名为get_name。global $con;:把全局作用域里的数据库连接变量$con引入到函数内部,这样函数就能用这个连接来执行数据库操作。$sql= "SELECT name FROMhotels";:构造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
相关产品推荐
相关产品推荐

