Разрыв цикла PHP While в Mysqli_fetch_array - PullRequest
0 голосов
/ 24 мая 2019

Я пытался получить список штатов, городов и счет из базы данных и отобразить их, как показано ниже. Нажатие кнопки «больше» расширит остальные города в каждом штате. К сожалению, все штаты, их города и графы были в одном столбце, и я не могу отделить штаты друг от друга. Я не могу разделить штаты с их конкретными городами на отдельные колонки. Любая помощь с благодарностью.

Alaska(46)
Anchorage(22)
Eagle River(2)
Elmendorf Afb(1)
Fairbanks(7)
Juneau(4)
More...

После нажатия на ссылку:

Alaska(46)
Anchorage(22)
Eagle River(2)
Elmendorf Afb(1)
Fairbanks(7)
Juneau(4)
Ketchikan(1)
Kodiak(1)
Alabama(54) <-- next state loaded in output, I want this separate
Auburn(1)
Bessemer(1)
Birmingham(52)
Less...

Вот мой запрос:

  $query = "
    SELECT 
      stateAbv,
      stateName,
      '' AS cityName,
      count(*) AS state_count 
    from
      my_data 
    GROUP BY stateAbv, stateName 
    union
    SELECT 
      stateAbv,
      stateName,
      city AS cityName,
      COUNT(*) AS city_count 
    FROM
      my_data 
    GROUP BY stateAbv, stateName,
      city 
    ORDER BY stateAbv,
      cityName asc
  ";
  $sqlResult = mysqli_query($con, $query);


 $i = 0;


 while ($row = mysqli_fetch_array($sqlResult)) {
    if ($i++ == 6) break;
    if ($row['cityName']) {
        echo $row['cityName'] . "(" . $row['state_count'] . ")" . "<br/>";
    } else {
        echo $row['stateName'] . "(" . $row['state_count'] . ")" . "<br/>";
    }
 }
 echo "<a class='more-detail' style='cursor: pointer; font-color:#0000ff;'>More...</a>";

 echo "<div class='detail-section' style='display: none;'>";
  while ($row = mysqli_fetch_array($sqlResult)) {
    if ($i++ > 6) {
        if ($row['cityName']) {
            echo $row['cityName'] . "(" . $row['state_count'] . ")" . "<br/>";
        } else {
            echo $row['stateName'] . "(" . $row['state_count'] . ")" . "<br/>";
        }
    }

 }
 echo "<a class='less-detail' style='cursor: pointer; font-color:#0000ff;'>Less...</a>";
 echo "</div>";

?>

Вот мой JS, чтобы развернуть / свернуть список:

<script>
$(document).ready(function(){

  $(".more-detail").click(function(){
    $(".detail-section").css("display", "block");
    $(".more-detail").css("display", "none");
  });

  $(".less-detail").click(function(){
    $(".detail-section").css("display", "none");
    $(".more-detail").css("display", "block");
  });

});
</script>

Ответы [ 2 ]

2 голосов
/ 24 мая 2019

Проблема этого подхода в том, что mysqli_fetch_array уже получил результаты в первом цикле. Проще всего сделать что-то вроде:

  $query = "
    SELECT 
      stateAbv,
      stateName,
      '' AS cityName,
      count(*) AS state_count 
    from
      my_data 
    GROUP BY stateAbv, stateName 
    union
    SELECT 
      stateAbv,
      stateName,
      city AS cityName,
      COUNT(*) AS city_count 
    FROM
      my_data 
    GROUP BY stateAbv, stateName,
      city 
    ORDER BY stateAbv,
      cityName asc
  ";
  $sqlResult = mysqli_query($con, $query);


 $i = 0;


 while ($row = mysqli_fetch_array($sqlResult)) {

    if ($row['cityName']) {
        echo $row['cityName'] . "(" . $row['state_count'] . ")" . "<br/>";
    } else {
        echo $row['stateName'] . "(" . $row['state_count'] . ")" . "<br/>";
    }

    if ($i == 6){
     echo "<a class='more-detail' style='cursor: pointer; font-color:#0000ff;'>More...</a>";

     echo "<div class='detail-section' style='display: none;'>";
     }
    $i++;
 }

 echo "<a class='less-detail' style='cursor: pointer; font-color:#0000ff;'>Less...</a>";
 echo "</div>";

?>
0 голосов
/ 25 мая 2019
$query = "
    SELECT
          stateAbv
        , stateName
        , city AS cityName
        , COUNT(city) As city_count
        , COUNT(stateName) As state_count
    FROM
        my_data
    GROUP BY
          stateName
        , city
    ORDER BY
          stateName
        , city      
";
$sqlResult = mysqli_query($con, $query);
while ($row = mysqli_fetch_array($sqlResult)) {
    $state_name = "{$row['stateName']} ({$row['state_count']})"
    $city_name = "{$row['cityName']} ({$row['city_count']})"
    $cities[$state_name][{$row['cityName']}] = $city_name;
}

foreach ( $cities As $state ) {
    echo "<p>State: $state </p>";
    foreach ( $state As $city ) {
        echo "$city<br />";
    }
    echo '<br />';
}

?>

Ничего из этого не было проверено, у меня нет образцов данных для тестирования, и невозможно щелкнуть, чтобы показать и скрыть детали.Что он делает, так это создает многомерный массив из результатов запроса.Вы бы использовали javascript, чтобы при щелчке по состоянию он расширял детализацию состояния (думаю, техника называется аккордеоном)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...