如何从MySQL查询结果循环中获取指定值的序号
问题描述
- 现有如下MySQL查询语句,执行后会返回若干结果(示例为11条):
$sel_sub = $conn->query("SELECT p.id AS pID , p.pack_id, p.tender_id, p.item_name,s.total_volume AS tv FROM pack_items p LEFT JOIN suppling_details s ON s.pack_item = p.id WHERE p.tender_id = $tender ");
- 需要定义一个匹配某条查询结果的变量,在查询结果中搜索该变量对应的值,并输出它在循环中的排序序号。当前使用的循环代码如下:
$i = 0; while ($rec = mysqli_fetch_assoc($sel_sub)) { $i++; $pdf->Cell(200, 15, $i . $rec['item_name'].$user['item_name'], 1, 1, 'C', 1); }
实现方案
方法1:先存储结果集与序号映射
先将所有查询结果存入数组并记录序号,后续直接通过变量值查找对应序号,不影响原有PDF输出逻辑:
// 存储结果集及对应序号 $results = []; $i = 0; while ($rec = mysqli_fetch_assoc($sel_sub)) { $i++; $rec['sort_order'] = $i; // 为每条结果添加序号字段 $results[] = $rec; // 保留原有的PDF输出代码 $pdf->Cell(200, 15, $i . $rec['item_name'].$user['item_name'], 1, 1, 'C', 1); } // 定义要搜索的目标变量值(示例为匹配item_name字段) $target_value = "你要匹配的目标值"; $target_order = null; // 遍历结果集查找序号 foreach ($results as $item) { if ($item['item_name'] === $target_value) { $target_order = $item['sort_order']; break; // 找到第一个匹配项后停止遍历 } } // 输出结果 if ($target_order !== null) { echo "匹配项的排序序号:" . $target_order; } else { echo "未找到匹配项"; }
方法2:用关联数组直接映射(适用于匹配字段唯一的场景)
如果用来匹配的字段(比如item_name或pID)是唯一的,可以直接构建关联数组,提升查找效率:
$results_map = []; $i = 0; while ($rec = mysqli_fetch_assoc($sel_sub)) { $i++; // 用匹配字段作为键,序号作为值 $results_map[$rec['item_name']] = $i; // 保留原有的PDF输出代码 $pdf->Cell(200, 15, $i . $rec['item_name'].$user['item_name'], 1, 1, 'C', 1); } // 查找序号 $target_value = "你要匹配的目标值"; if (isset($results_map[$target_value])) { echo "匹配项的排序序号:" . $results_map[$target_value]; } else { echo "未找到匹配项"; }
重要提示
- 若匹配字段存在重复值,方法1会返回第一个匹配项的序号;如果需要收集所有匹配项的序号,可去掉
break并将序号存入数组。 - 原查询语句存在SQL注入风险,建议改用预处理语句:
$stmt = $conn->prepare("SELECT p.id AS pID , p.pack_id, p.tender_id, p.item_name,s.total_volume AS tv FROM pack_items p LEFT JOIN suppling_details s ON s.pack_item = p.id WHERE p.tender_id = ?"); $stmt->bind_param("i", $tender); // 若$tender是字符串类型,将"i"改为"s" $stmt->execute(); $sel_sub = $stmt->get_result();
内容的提问来源于stack exchange,提问作者Dilara Adams
相关产品推荐
相关产品推荐

