【问题标题】:Why is my PHP nested while loop not working?为什么我的 PHP 嵌套 while 循环不起作用?
【发布时间】:2020-02-10 16:46:58
【问题描述】:

我试图使用 PDO 从 mysql 获取一些数据。例如,有一张表用于存放 Mercedes、Audi、Bently、Toyota 等品牌名称。每个品牌的汽车名称还有另一个表格。 'brand' 表中的 id 是 'cars' 表中的外键。现在我想获取每个品牌名称中的所有汽车名称。这是我的代码:

  // Outer loop for Brands
  $query = "SELECT * FROM brand";
  $result = $db->query($query);
  while($row=$result->fetch(PDO::FETCH_OBJ)){
    $brand_name = $row->brand_name;
    $brand_id = $row->id;

    echo $brand_name;
    echo "<br>";

    // Inner loop for Cars
    $query = "SELECT * FROM cars WHERE brand_id = $brand_id";
    $result = $db->query($query);
       while($row=$result->fetch(PDO::FETCH_OBJ)){
       $car_name = $row->car_name;

       echo $car_name;
       echo "<br>";

       } // Ending of inner loop

   } // Ending of outer loop

但是我在这里遇到了问题。获取第一个品牌名称,然后内部循环运行并获取该品牌中的汽车名称。当内循环完成获取所有汽车名称时,它应该再次转到外循环并找到下一个品牌名称。但它也没有获取其余的品牌名称和汽车名称。例如,如果它完成了获取丰田内部的所有汽车名称,它就不会去获取下一个品牌名称,即奥迪。

但是,如果我删除了内部 while 循环,它会毫无错误地获取所有品牌名称。请帮助我提供最好的解决方案。提前致谢。

【问题讨论】:

  • 不是 'fetch try 'fetchAll',对于两个循环。
  • 您使用的是相同的 $result$row 变量,这就是为什么它无法工作,因为 var 值被覆盖

标签: php mysql while-loop fetch nested-loops


【解决方案1】:

尝试使用不同的变量名,否则你会覆盖第一个变量 例如 $sql, $result 和 $row 以及第二个 $sql2, $result2, $row2

  $query = "SELECT * FROM brand";
    $result = $db->query($query);
    while($row=$result->fetch(PDO::FETCH_OBJ)){
      $brand_name = $row->brand_name;
      $brand_id = $row->id;

      echo $brand_name;
      echo "<br>";

      // Inner loop for Cars
      $query2 = "SELECT * FROM cars WHERE brand_id = $brand_id";
      $result2 = $db->query($query2);
         while($row2=$result2->fetch(PDO::FETCH_OBJ)){
         $car_name = $row2->car_name;

         echo $car_name;
         echo "<br>";

         } // Ending of inner loop

     } // Ending of outer loop

【讨论】:

    【解决方案2】:

    您需要更改内部循环的变量名称。 现在,您正在内部循环(结果和行)中覆盖外部循环的值。

    // Loop for Brands
    $query = "SELECT * FROM brand";
    $result = $db->query($query);
    while($row=$result->fetch(PDO::FETCH_OBJ)){
    $brand_name = $row->brand_name;
    $brand_id = $row->id;
    
    echo $brand_name;
    echo "<br>";
    
    // Loop for Cars
    $query = "SELECT * FROM cars WHERE brand_id = $brand_id";
    $result = $db->query($query);
       while($row=$result->fetch(PDO::FETCH_OBJ)){
       $car_name = $row->car_name;
    
       echo $car_name;
       echo "<br>";
    
       } // Ending of inner loop
    
    } // Ending of outer loop
    

    使用 PDO 在 PHP 中提供的 bindParam 来设置变量 https://www.php.net/manual/en/pdostatement.bindparam.php

    【讨论】:

      【解决方案3】:

      只需更改内部查询的变量名称 $query、$row 和 $result,一切都会正常工作。 您在 $result 中保存的第一个查询的结果被内部查询的结果覆盖

        // Outer loop for Brands
        $query = "SELECT * FROM brand";
        $result = $db->query($query);
        while($row=$result->fetch(PDO::FETCH_OBJ)){
          $brand_name = $row->brand_name;
          $brand_id = $row->id;
      
          echo $brand_name;
          echo "<br>";
      
          // Inner loop for Cars
          $query1 = "SELECT * FROM cars WHERE brand_id = $brand_id";
          $result1 = $db->query($query1);
             while($row1=$result1->fetch(PDO::FETCH_OBJ)){
             $car_name = $row1->car_name;
      
             echo $car_name;
             echo "<br>";
      
             } // Ending of inner loop
      
         } 
      

      【讨论】:

        【解决方案4】:
        1. 您的变量名称会相互覆盖,您应该重命名它们
        2. 也可以考虑使用closeCursor()来释放资源。

        上面的应用如下所示:

        // Loop for Brands
        $sql = "SELECT * FROM brand";
        $brandQuery = $db->query($sql);
        while ($brandRow = $brandQuery->fetch(PDO::FETCH_OBJ))
        {
          $brand_name = $brandRow->brand_name;
          $brand_id = $brandRow->id;
        
          echo $brand_name;
          echo "<br>";
        
          // Loop for Cars
          $sql = "SELECT * FROM cars WHERE brand_id = $brand_id";
          $carQuery = $db->query($sql);
          while ($carRow = $carQuery->fetch(PDO::FETCH_OBJ))
          {
            $car_name = $carRow->car_name;
        
            echo $car_name;
            echo "<br>";
        
          } // Ending of inner loop
          $carQuery->closeCursor();
        
        } // Ending of outer loop
        $brandQuery->closeCursor();
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-04-02
          • 1970-01-01
          • 2022-01-26
          • 2022-12-12
          • 1970-01-01
          • 1970-01-01
          • 2022-01-03
          • 1970-01-01
          相关资源
          最近更新 更多