Grupowanie wyniku zapytania

0

Witam serdecznie,

Mam problem z dopasowaniem wartości uzyskanych z sql do wyświetlenia na stronie.
Dane które otrzymałem:
screenshot-20210105204211.png
Opis: Zalogowany pracodawca widzi użytkowników którzy aplikowali do jego własnych ofert. Przykładowo do oferty nr 39 aplikował użytkownik usr1 i usr2.

Otrzymałem dane w tabeli chcialbym je dopasować do takiej postaci:
screenshot-20210105205226.png

Każda "karta" zawierałaby ofertę pracodawcy, a w jej środku zamiast treści czy lokaliacji będzie podane imie i nazwisko kandydata oraz z jego id.

Prawdopodobnie trzeba zastosować pętle do wyświetlenia, nie mam pojęcia od czego zacząć.

Mam tylko dane wyprowadzone do tabeli z pomocą pętli if oraz while

 if (mysqli_num_rows($result) > 0) {
        $output .= '
  <div class="table-responsive">
   <table class="table ">
    <tr>
     <th>Id Oferty</th>
     <th>Id Usera</th>
     itd.....
    </tr>
 ';
        while ($row = mysqli_fetch_array($result)) {
          $output .= '

<td>' . $row["id_oferty"] . '</td>

screenshot-20210105205443.png

Proszę o podpowiedź jak mam zastosować pętlę aby wyświetlić tak jak jest pokazane na kartach

0

Zrób sobie DIV-a z polami jak na przykładowych kartach i wrzuć w pętlę wyświetlanie kolejnych DIV-ów z oparciu o jego szablon.

0

@Freja Draco: Nie bardzo rozumiem o co chodzi. Te karty już mam okodowane, tylko muszę dopasować wartości


      if (mysqli_num_rows($result) > 0) {
       
        while ($row = mysqli_fetch_array($result)) {
          $output .= '

          <div class="card ">
          <div class="card-header">'. $row["nazwa_kat"] . '</div>
          <div class="card-body">
          </a>

           
           
           <p>Imie</p>
           <p>Nazwisko</p>




           </div>




          </div><br>
   
  ';
0

Przy prostym zapytaniu, byłoby to coś w stylu:

  while($row  = $result -> fetch_assoc()) {
    echo "<b>k1:</b> " . $row["nazwa_kolumny1"]. " - <b>k2:</b> " . $row["nazwa_kolumny2"]. "<br>";
  }

Ale ty masz tam jakieś JOIN podpinające chyba dane z innych tabel. Nigdy czegoś takiego nie robiłam. Spróbuj może w pętli formatu:
nazwa_tabeli.nazwa kolumny
a jeśli nie zadziała, to guglaj za rozwiązaniem albo czekaj, aż ci odpowie ktoś bardziej uczony w piśmie ;)

3

Po pierwsze "Primo", "wincej" kodu mniej screenów. Chcesz użyj jakiegoś DB fiddle np. https://www.db-fiddle.com/

in.in2 napisał(a):

Mam problem z dopasowaniem wartości uzyskanych z sql do wyświetlenia na stronie.
Dane które otrzymałem:

Opis: Zalogowany pracodawca widzi użytkowników którzy aplikowali do jego własnych ofert. Przykładowo do oferty nr 39 aplikował użytkownik usr1 i usr2.

Otrzymałem dane w tabeli chcialbym je dopasować do takiej postaci:

No i tu problem bo np. masz w tych kartach jakieś wynagrodzenie a nie masz tego w wynikach SQL.

Każda "karta" zawierałaby ofertę pracodawcy, a w jej środku zamiast treści czy lokaliacji będzie podane imie i nazwisko kandydata oraz z jego id.

Prawdopodobnie trzeba zastosować pętle do wyświetlenia, nie mam pojęcia od czego zacząć.

Mam tylko dane wyprowadzone do tabeli z pomocą pętli if oraz while

If to instrukcja warunkowa, nie pętla. Sprawdza warunek raz, wykonuje się raz.

Proszę o podpowiedź jak mam zastosować pętlę aby wyświetlić tak jak jest pokazane na kartach

A teraz dałeś screen jakiejś tabelki.

Z czym dokładnie masz problem?
Zapytanie "wypluwa" to co chcesz?

Jak robisz "ręcznie" tabelę czy te karty to popatrz co się powtarza. To co się powtarza wykonujesz w pętli.
Czyli dla tabeli w pętli będziesz wypisywał wiersze. W HTML wiersz ma znacznik <tr>, a komórka <td>

while ($row = mysqli_fetch_array($result)) {
    $output .= '<tr>'; //otwieramy wiersz
    $output .= '<td>'; //otwieramy komórkę
    $output .= $row['kolumna']; //wypełniamy komórkę
    $output .= '</td>'; //zamykamy komórkę
    $output .= '<td>'; //otwieramy następną komórkę
    $output .= $row['następnaKolumna']; //wypełniamy następną komórkę
    $output .= '</td>'; //zamykamy komórkę
    $output .= '</tr>'; //zamykamy wiersz
}// i wykonuj to aż pętla odczyta wszystkie wiesze tablicy otrzymanej z zapytania SQL

Oczywiście rozbiłem Ci to na poszczególne linie dla łatwiejszego opisu i żebyś widział co gdzie się dzieje.
To samo tyczy się tych kart. Do ciała pętli "wkładasz" to co się powtarza i w ten sposób generujesz HTML.

P.S. Jak dobrze przygotujesz zapytanie to i komórki może wypisywać w drugiej, zagnieżdżonej pętli.

0

@jurek1980: Zapytanie które jest na 1 screenie przedstawia to co powinno znajdować się w kartach. Oczywiście można przerobić tak aby jeszcze bardziej dopasować i ułatwić sobie sprawę.

Te karty które są na 2 screenie umieściłem tylko dla podglądu sytuacji :) Wiem że nie będzie tam wynagrodzenia itd.(screen pochodzi z zakładki dla kandydatów i przedstawia oferty na które sami aplikowali). Chciałem zobrazować jak to ma wyglądać tzn 1 karta do jednej oferty, a w tej karcie imię i nazwisko kandydata do tej oferty.

Nie mam pomysłu jak to już zrobić. To co wstawiłeś z pętlą while (dziękuję :) ) juz dawno to opanowałem i wykorzystałem nawet do stworzenia tabelki z ostatniego screena :)

0

Czyli masz problem ze zbudowanie HTMLa dla tych "kart"?

0

@jurek1980: Problem mam z powtarzającymi się kartami. Teraz mam tych kart tyle ile mam rekordów z zapytania. Tzn. mam 6 "aplikacji" -> Jestem właścicielem 3 ofert, 3 różnych użytkowników aplikowało na te oferty i np. "usr1" aplikował do oferty nr 39 i 40; a "usr2" do ofert 38,39,40.
screenshot-20210106110344.png

Pokazało mi się 6 kart dla 6 "aplikacji.
Powinienem mieć 3 karty, ponieważ tyle mam ofert.
A w każdej z tych kart powinienem mieć imię i nazwisko oraz id_usera który aplikował na tą ofertę.

Czyli:
screenshot-20210106110820.png

Przepraszam ale nie jestem mistrzem grafiki :)
Załączam też kod który używam:

$query = " SELECT aplikacje.id_oferty, logowanie.id_usera, logowanie.imie, logowanie.nazwisko, oferty.tytul, kategorie.nazwa_kategorii, oferty.lokalizacja FROM aplikacje LEFT JOIN logowanie ON logowanie.id_usera=aplikacje.id_uzytkownika LEFT JOIN oferty ON aplikacje.id_oferty=oferty.id JOIN kategorie on oferty.kategoria=kategorie.id_kategoria WHERE oferty.pracodawca=41";
      $result = $conn->query($query);
      if (mysqli_num_rows($result) > 0) {
       
        while ($row = mysqli_fetch_array($result)) {
          $output .= '

          <div class="card border-info">
          <div class="card-header">'. $row["lokalizacja"] . '</div>
          <div class="card-body">
           <a href="post.php?id='.$row["id_oferty"].'"><h4 class="card-title">'. $row["tytul"] . '</h4></a>

           
           <p>'.$row["nazwa_kategorii"].'</p>
           <p>Imię i Nazwisko kandydata: '.$row["imie"].' '.$row["nazwisko"].'</p>
           <p>Lokalizacja: '.$row["lokalizacja"].'</p>


           </div>

          </div><br>
   
  ';

        }

0

Najlepiej doprowadź sobie zapytanie SQL do postaci takiej jak chciałbyś uzyskać dane.
Rozwiązanie nr 2 przeiterować po wynikach tworząc nową tablicę z właściwym formatem danych. Coś w stylu

$data = [];
if (mysqli_num_rows($result) > 0) {
    while ($row = mysqli_fetch_array($result)) {
        $data[$row["id_oferty"]][] = $row;
    }
}
var_dump($data);// zobacz co jest zawartością takiej tablicy, żebyś potem wiedział jak się odnieść do jej elementów
foreach ($data as $offerID => $details) {
    $output .= '<div class="card border-info">
        <a href="post.php?id='.$offerID.'"><h4 class="card-title">'. $details[0]["tytul"] . '</h4></a>';
    foreach($details as $offerRow) {
        $output.=  '<p>Imię i Nazwisko kandydata: '.$offerRow["imie"].' '.$offerRow["nazwisko"].'</p>';
    }
}
0

@jurek1980: Cześć :) pozwól że odświeżę ten wątek bo potrzebuję wyciągnąć informacje na zewnątrz.
Potrzebuję id użytkownika w zmiennej sesyjnej do wysłania wiadomości temu użytkownikowi. Za pomocą okien dialogowych i sql napiszę wiadomość do kandydata jednak potrzeuję jego id. W tej pętli stworzyłem zmienną sesyjną **$_SESSION['id_uzytkownikaW']= $offerRow["id"] ** jednak pobiera tylko id ostatniego użytkownika z całej pętli.

foreach ($data as $offerID => $details) {
    $output .= '<div class="card border-info">
        <a href="post.php?id='.$offerID.'"><h4 class="card-title">'. $details[0]["tytul"] . '</h4></a>';
    foreach($details as $offerRow) {
        $output.=  '<p>Imię i Nazwisko kandydata: '.$offerRow["imie"].' '.$offerRow["nazwisko"].'</p>
<p><button>Wyślij wiadomość do ' . $offerRow["imie"] . '</button></p>';
$_SESSION['id_uzytkownikaW']= $offerRow["id"]; 
    }
}
2
foreach ($data as $offerID => $details) {
    foreach($details as $offerRow) {
        $_SESSION['id_uzytkownikaW']= $offerRow["id"]; 
    }
}

Przypisujesz w pętli do zmiennej sesyjnej kolejne wartości. W efekcie po wszystkich przebiegach pętli jej wartość będzie równa ostatniemu przypisaniu.
Musiałbyś użyć tablicy, jako zmiennej sesyjnej, podobno się da:
https://stackoverflow.com/questions/2306159/array-as-session-variable

1 użytkowników online, w tym zalogowanych: 0, gości: 1