我有2张桌子。第一个是categories
,第二个是items
。
我需要我的脚本将类别名称及其匹配的“ category_id”类别名称打印到.txt文件。我的代码使用第一个while
循环来遍历类别,然后使用第二个来遍历项目。一切正常,直到我们进入第二个while
循环,因为然后值变为空。
while ($row2 = mysqli_fetch_array($query_for_categories)) {
fwrite($fp, $row2["category_name"].PHP_EOL);
while ($row = mysqli_fetch_array($query_for_items)) {
if ($row2['id_category_from_category'] == $row['id_category_from_items']) {
fwrite($fp, $row["item_name"].PHP_EOL);
}
}
}
答案 0 :(得分:1)
在外部while循环的第一次迭代之后,您将从$query_for_categories
获取所有行。在外部while循环的后续迭代中,不再需要从该查询中获取行。
您可以先将它们全部提取到数组中
while ($row = mysqli_fetch_array($query_for_items)) {
$items[] = $row;
}
然后使用该数组中的行,而不是一会儿...获取循环。
while ($category = mysqli_fetch_array($query_for_categories)) {
fwrite($fp, $category["category_name"].PHP_EOL);
foreach($items as $item) {
if ($category['id_category_from_category'] == $item['id_category_from_items']) {
fwrite($fp, $item["item_name"].PHP_EOL);
}
}
}
不过,您似乎可以使用联接使用一个查询来执行此操作。我建议您检查一下,而不要这样做。根据代码中的列名,查询将如下所示:
SELECT c.category_name, i.item_name
FROM categories c
LEFT JOIN items i on c.id_category_from_category = i.id_category_from_items
ORDER BY c.category_name, i.item_name
然后您可以像这样在一个循环中打印带有类别的项目:
$previous_category = null;
while ($item = mysqli_fetch_array($query)) {
// each time category changes, output the new category name
if ($item['category_name'] != $previous_category) {
fwrite($fp, $item["category_name"].PHP_EOL);
// then current category becomes previous category
$previous_category = $item['category_name'];
}
fwrite($fp, $item["item_name"].PHP_EOL);
}
我确实想知道如何分辨文件中的哪些行是项,哪些是类别。也许您应该为此输出某种指标?