Mysqli Select查询异常:仅返回单条数据问题排查
嘿,我来帮你分析下这个问题。先理清楚你的代码和输出情况:
你的PHP代码
$sql = "select company_name, salary, experience from company"; echo $sql; $result = mysqli_query($con,$sql); while($row = mysqli_fetch_array($result)) { print_r($row); }
实际输出
select company_name, salary, experience from company Array ( [0] => xyz [company_name] => xyz [1] => 2 Lac - 3 Lac [salary] => 2 Lac - 3 Lac [2] => 2 Years - 3 Years [experience] => 2 Years - 3 Years )
从你的描述来看,表中明明有多条数据,但代码只输出了一条,我给你列几个最可能的排查方向,按顺序试就行:
1. 先确认数据库里的实际查询结果
别先纠结PHP代码,直接打开你的数据库客户端(比如phpMyAdmin、MySQL命令行、Navicat),手动执行这条SQL:
select company_name, salary, experience from company
如果执行后也只返回一条数据,那问题就出在数据库本身——要么你记错了表的数据,要么表确实只有这一条(比如之前的插入操作没成功)。如果数据库里能返回多条,那再看PHP这边的问题。
2. 检查结果集的实际行数
在PHP代码里加一行,看看查询到底返回了多少行:
$sql = "select company_name, salary, experience from company"; echo $sql; $result = mysqli_query($con,$sql); // 新增这行,查看结果集行数 echo "返回行数:" . mysqli_num_rows($result) . "<br>"; while($row = mysqli_fetch_array($result)) { print_r($row); }
如果这里输出的行数是1,那说明MySQL确实只返回了一行;如果行数大于1,那就是输出的问题——比如多个数组挤在一起没分开,看起来像一条。
3. 优化输出,避免混淆
如果结果集行数大于1,但输出看起来只有一条,那是因为print_r的数组没有分隔符,多个数组连在一起你分不清。给循环加个分隔符:
while($row = mysqli_fetch_array($result)) { print_r($row); // 加个分隔线,方便区分不同行 echo "<hr>"; // 如果是命令行环境,用这个:echo PHP_EOL . "---分割线---" . PHP_EOL; }
这样就能清楚看到是不是有多行输出了。
4. 检查数据库连接是否正确
有没有可能你的$con连接的不是你以为的数据库?比如你本地有多个库,或者测试环境和生产环境搞混了,连接到了一个只有一条数据的company表?可以在代码里加一行输出当前数据库名:
echo "当前数据库:" . mysqli_get_db($con);
确认下是不是连接到了正确的库。
5. 排查结果集指针是否被提前移动
有没有在这段代码之前,对同一个$con执行过其他查询或读取操作?比如之前调用过mysqli_fetch_array或者mysqli_data_seek,导致结果集的指针已经到了最后,后面的循环只能读到一行(甚至读不到)。如果是这种情况,在循环前重置指针就行:
mysqli_data_seek($result, 0);
按这个顺序排查,应该能很快找到问题所在。
内容的提问来源于stack exchange,提问作者omkara

