【问题标题】:mysql_fetch_assoc() only works for one iteration in WHILE loopmysql_fetch_assoc() 仅适用于 WHILE 循环中的一次迭代
【发布时间】:2011-09-13 16:04:09
【问题描述】:

请考虑以下几点:

$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 中的查询会返回几行。

【问题讨论】:

  • The FOREACH() loop works on the one row that's returned. - 实际上不,它没有。你永远不会使用$row。这可能是错误吗?
  • 你的顺序有点奇怪。您在查询之前从 $result 获取。通常,您首先进行查询,然后循环从结果中获取。
  • 抱歉,从我的问题中删除了似乎不相关的一行。 $row 用于以下行:$legID = explode(",", $row['legIDs']); 紧接在 FOREACH() 之前。

标签: php mysql while-loop fetch


【解决方案1】:

您在内循环和外循环中使用了两次$result。当内循环完成时,$result 将是一个“空”结果集,因此外循环将终止。将内部循环更改为$result2,一切都会好起来的。

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

【讨论】:

  • 谢谢 Marc,我认为这是问题的一部分。您能否进一步说明如何将其组合成一个查询?我意识到我需要将查询保持在最低限度,但查询到 trip 表的一个结果可能对应于 leg 表的多个结果。
  • @Chris:当我意识到您在一个字段中存储多个值时,我很高兴为您编写一个组合查询。应该将其分离到另一个表中......否则这样的查询将成为一场噩梦。
  • 我最终更改了两次使用的所有变量(不知道我一开始怎么没想到!)它解决了这个问题。谢谢!!
  • 鉴于您的两个查询,select trip.legIDs, leg.dep, leg.arr FROM trip JOIN leg ON trip.legIDs = leg.Key 之类的东西就可以解决问题。然后,您可以在一个查询中获得所有三个值。一些简单的状态检查来检查您正在使用哪些legID,以便在它更改时输出新的&lt;div&gt;,您应该一切顺利。
  • 这个问题很难被注意到。感谢您指出这一点。
【解决方案2】:

那里的东西很乱。

  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. 您应该将数据提取与输出分开。首先进行查询以获取所有必要的数据,然后将其输出到&lt;div&gt;s。混合表示逻辑和后端逻辑很快就会变得非常混乱。

【讨论】:

  • 扩展 (1) 你通常会写 while(($row = mysql_fetch_assoc($result))!==false) { ... }
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-25
  • 1970-01-01
  • 2015-09-20
  • 2016-06-19
  • 2015-03-23
  • 1970-01-01
相关资源
最近更新 更多