Почему мой PHP вложен в то время как цикл не работает? - PullRequest
0 голосов
/ 14 октября 2019

Я пытался получить некоторые данные из MySQL, используя PDO. Например, есть одна таблица для торговых марок, таких как Mercedes, Audi, Bently, Toyota. И есть еще один стол для названий автомобилей каждой марки. Идентификаторы из таблиц 'brand' являются внешними ключами в таблице '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

Но у меня возникла проблема. Извлекается первая марка, а затем запускается внутренний цикл и выбираются названия автомобилей внутри этой марки. Когда внутренняя петля закончила извлекать все названия автомобилей, она должна снова перейти к внешней петле и найти следующую марку. Но это не касается остальных марок и автомобилей. Например, если он заканчивает выборку всех названий автомобилей внутри Toyota, он не идет на следующую марку, которая называется Audi.

Но если я уберу внутренний цикл while, он выберет все названия марок без каких-либо ошибок. Пожалуйста, помогите мне с вашими лучшими возможными решениями. Заранее спасибо.

Ответы [ 4 ]

0 голосов
/ 14 октября 2019
  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();
0 голосов
/ 14 октября 2019

Вам необходимо изменить имена переменных вашего внутреннего цикла. Прямо сейчас вы переопределяете значения вашего внешнего цикла во внутреннем цикле (результат и строка).

// 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

Используйте bindParam, который PDO предлагает в PHP для установки переменных https://www.php.net/manual/en/pdostatement.bindparam.php

0 голосов
/ 14 октября 2019

Просто измените имена переменных $ 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

   } 
0 голосов
/ 14 октября 2019

Попробуйте использовать другое имя переменной, в противном случае вы перезаписываете первые переменные, например, $ 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
...