mysql_fetch_assoc()仅适用于WHILE循环中的一次迭代

时间:2011-06-13 04:02:56

标签: php mysql while-loop fetch

请考虑以下事项:

$query = "SELECT legIDs FROM trip";
$result = mysql_query($query) or die("SELECT TRIPS ERROR: " . mysql_error());
while($row = mysql_fetch_assoc($result) or die("fetch error " . mysql_error())) {
    echo "<div style=\"border: 1px solid blue;float:left;\">Trip: <div style=\"float:right;\">";
    $legID = explode(",", $row['legIDs']);
        foreach($legID as $leg) {
            $query = "SELECT dep, arr FROM leg WHERE `Key` = " . $leg;
            $result = mysql_query($query) or die("SELECT LEGS ERROR: " . mysql_error());
            $row2 = mysql_fetch_assoc($result) or die("FILL ARRAY ERROR: " . mysql_error());
            echo $row2['dep'] . " - " . $row2['arr'] . "<br />";
    }
    echo "</div></div>";
}

由于某种原因,这只会返回一个结果,即使从WHILE()循环返回了多个值也是如此。 FOREACH()循环适用于返回的一行。我做错了什么只让这一行返回?直接在服务器上执行$result中包含的查询会返回几行。

2 个答案:

答案 0 :(得分:7)

你在内循环和外循环中使用$result两次。当内循环完成时,$ result将是一个“空”结果集,因此外循环将终止。将内循环归为$result2,事情应该没问题。

但是,由于内部循环只是根据外部循环产生的结果获取更多结果,因此您应该考虑将其重写为连接查询。运行单个“大结果”查询几乎总是比一系列“小结果”单个查询更有效。你最终会有相当大的开销来解析/编译每个内部查询。

答案 1 :(得分:1)

那里的东西非常混乱。

  1. while($row = mysql_fetch_assoc($result) or die("FETCH ERROR: " . mysql_error()))

    不需要or die()。如果mysql_fetch_assoc返回false,则while循环应该结束,您也不需要die

  2. 基于其他SQL查询的循环内的SQL查询通常可以通过原始查询中更好的JOIN或更智能的辅助查询来更好地处理。
  3. 您正在覆盖内循环中外循环的$result变量,这可能是您询问的特定问题的原因。
  4. 您应该将数据提取与输出分开。先查询您的查询以获取所有必要的数据,然后将其输出到<div>。混合表示逻辑和后端逻辑会非常快速地混乱。
相关问题