【问题标题】:Why is my container while loop only cycling the first item?为什么我的容器 while 循环只循环第一项?
【发布时间】:2012-08-31 23:35:39
【问题描述】:
// current session id
$sid = session_id();

// get current cart session
$sql = "SELECT * FROM tbl_cart WHERE ct_session_id =  '$sid'";
$result = dbQuery($sql);

// get all the items in the car category
$query = "SELECT pd_id FROM tbl_product WHERE cat_id ='28'";
$r = dbQuery($query);

//Cycle through the cart and compare each cart item to the cars to determine
  if the cart contains a car in it.
         while($cart = dbFetchAssoc($result)){
    while($product = dbFetchAssoc($r)){
        echo $cart['pd_id'] . " - ";
        echo $product['pd_id']. "<br>";
    }
}

dbFetchAssoc() 是一个自定义数据库层,基本上是 (mysql_fetch_assoc)。

我试图从查询中获取行并使用该信息进行比较。上面带有 echo 语句的代码只是为了调试目的而回显。 while 循环在嵌套循环之后退出是否有特殊原因?

【问题讨论】:

  • sizeof(dbFetchAssoc($r)) 说什么?

标签: php mysql


【解决方案1】:

是的。您需要再次运行查询,因为每次调用 dbFetchAssoc($r) 时,您都在推进该光标。

$sql = "SELECT * FROM tbl_cart WHERE ct_session_id =  '$sid'";
$result = dbQuery($sql);

// get all the items in the car category
$query = "SELECT pd_id FROM tbl_product WHERE cat_id ='28'";

while($cart = dbFetchAssoc($result)){
    $r = dbQuery($query);
    while($product = dbFetchAssoc($r)){
        echo $cart['pd_id'] . " - ";
        echo $product['pd_id']. "<br>";
    }
}

这是一个优化版本,它不会对数据库造成太多影响。但是,它是针对这个特定问题的,如果查询集特别大,这将是一个同样糟糕的选择——它会遇到内存问题而不是速度问题。

$sql = "SELECT * FROM tbl_cart WHERE ct_session_id =  '$sid'";
$result = dbQuery($sql);

// get all the items in the car category
$query = "SELECT pd_id FROM tbl_product WHERE cat_id ='28'";
$r = dbQuery($query);

// cache the product results into an array
$products = Array();
while($product = dbFetchAssoc($r)){
    $products[] = $product['pd_id']
}

while($cart = dbFetchAssoc($result)){
    $index = 0;
    while($product = dbFetchAssoc($r)){
        echo $cart['pd_id'] . " - ";
        echo $product[$index]. "<br>";
        $index++;
    }
}

第二个代码我没有测试过,但是思路应该够清楚了。

【讨论】:

  • 或者也许运行一次该查询,因为它似乎是静态的,并且将结果缓存在一个数组或其他东西中。
  • 我会注意到,可能有更有效的方法来做你想做的事,但这是问题中问题的答案。
  • *UPDATE 这是我的问题的解决方案。谢谢你。 Moopet 如果您有时间展示如何更好地处理此问题的示例,请分享它是否有助于提高整个应用程序的速度。
  • 这个特定的实例有点做作——它只是列出了两个查询集中的所有内容,第二个没有改变。所以将内部查询的结果加载到一个数组中并循环它会有所帮助。但在实践中,查询很可能是相关的——第二个查询并不总是会给出相同的结果——所以这不会那么有用。在其他情况下,您可能可以通过 SQL 中的 JOIN 提取所有您想要的信息。同样,这与这个特定案例无关。我会更新我的答案,给你一个优化的替代方案
  • 谢谢,这是一个重要的业务应用程序,我第一次尝试以最好的方式做事。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-11-07
  • 2015-09-28
  • 1970-01-01
  • 2018-05-14
  • 1970-01-01
  • 1970-01-01
  • 2016-08-21
相关资源
最近更新 更多