PHP调用MySQL查询订单数据时结果丢失第一行如何解决
问题原因
- 调用
mysqli_result::fetch_assoc()方法时,每执行一次就会从结果集中取出一条记录,同时将结果集的内部指针向后移动一位 - 你在while循环开始前额外执行了一次
$row = $result->fetch_assoc(),该代码取出了按倒序排序后的第一条订单数据,但没有存入$ordersArray,相当于直接丢弃了该条记录 - 后续while循环从第二条记录开始读取,最终导致你看到的结果缺失了本该排在最前面的记录
修复方案
直接删除while循环前多余的$row = $result->fetch_assoc();代码即可,修正后的完整代码如下:
$servername = "localhost"; $username = "root"; $password = ""; $dbname = "myDatabase"; $db = new mysqli($servername, $username, $password, $dbname); $counter = 0; $query = "SELECT * FROM `orders` WHERE `supplier` = '".session('email')."' ORDER BY `id_order` DESC"; if ($result = $db->query($query)){ if($result->num_rows > 0) { $ordersArray = array(); // Set orders data to ordersArray while($row = $result->fetch_assoc()){ $name = $row["name"]; $orderID = $row["id_order"]; $ordersArray[] = array( 'id_order'=> $orderID, 'name'=> $name ); } foreach($ordersArray as $row){ if( $counter <= 4 ){ echo ($row["name"]); echo ($row["id_order"]); $counter = $counter + 1; } } } else { echo ('<tr><td>No tienes ordenes recientes</td></tr>'); } } $db->close();
额外优化建议
当前你直接将session('email')拼接进SQL语句的写法存在SQL注入风险,建议使用mysqli的预处理语句参数绑定来实现查询,避免安全问题。
内容的提问来源于stack exchange,提问作者Ignacio Corball
相关产品推荐
相关产品推荐

