Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [MySQL][PHP]Wyświetlenie wielu rekordów z kilku tabel
Przemo75
post 5.07.2011, 18:34:22
Post #1





Grupa: Zarejestrowani
Postów: 66
Pomógł: 2
Dołączył: 9.03.2004
Skąd: POLSKA

Ostrzeżenie: (0%)
-----


Witam,
Mam problem z wyświetleniem wielu danych z dwóch tabel. Jednej kategorii z tabeli KATEGORIA odpowiada kilka(naście) produktów z tabeli ASORTYMENT.
Problem polega na tym, że w tej chwili wyniki wyświetlane są w sposób:
Kategoria1
Nazwa1
Opis1
Produkt1

Kategoria1
Nazwa1
Opis1
Produkt2

... itd.

a chciałbym osiągnąć wynik:

Kategoria1
Nazwa1
Opis1
Produkt1
Produkt2
Produkt3

itd.

  1. <?php
  2. include("connections/baza_pass.php");
  3. $sql = "SELECT * FROM kategoria ORDER BY id_kategorii ASC";
  4.  
  5. $numresults=mysql_query($sql, $link);
  6. $numrows=mysql_num_rows($numresults);
  7.  
  8. if($numrows>0){
  9.  
  10. echo '<form action="" method="post">';
  11. echo '<select name="kategoria" onChange="this.form.submit()">';
  12. echo '<option value="">Wybierz kategorię:</option>';
  13. while($wybor = mysql_fetch_array($numresults))
  14. {
  15. $id_kategorii = $wybor["id_kategorii"];
  16. $nazwa = $wybor["nazwa"];
  17. $opis = $wybor["opis"];
  18.  
  19. echo '<option value="'.$id_kategorii.'">'.$nazwa.'</option>';
  20. }
  21. echo '</select>';
  22. echo '</form>';
  23. }
  24. else
  25. {
  26. echo 'Brak wyników';
  27. }
  28.  
  29.  
  30. @$kategoria = $_POST['kategoria']; // ten warunek musi byc zawsze
  31.  
  32. if ($kategoria)
  33. {
  34.  
  35. echo "<br>\n";
  36. $link=mysql_query("SELECT * FROM kategoria as k, asortyment as a WHERE k.id_kategorii=a.id_kategorii AND a.id_kategorii='$kategoria'");
  37. while($wybor2=mysql_fetch_array($link))
  38. {
  39. $id_kategorii = $wybor2["id_kategorii"];
  40. $nazwa = $wybor2["nazwa"];
  41. $opis = $wybor2["opis"];
  42. $produkt = $wybor2["produkt"];
  43.  
  44. echo "<br>\n";
  45. echo '<p class="text">Nazwa kategorii: <b>'. $nazwa .'</b></p>';
  46. echo '<p class="text">Opis kategorii:</p>';
  47. echo '<p class="text"><b>'. $opis .'</b></p>';
  48. echo '<p class="text">Produkty:</p>';
  49. echo '<p class="text"><b>'. $produkt .'</b></p>';
  50. echo "<br>\n";
  51. }
  52. }
  53. ?>

Zapewne trzeba użyć warunku IF ale nie mam pojęcia w jaki sposób.
Go to the top of the page
+Quote Post
nospor
post 5.07.2011, 18:36:42
Post #2





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




Pisałem o tym:
http://nospor.pl/grupowanie-wynikow.html
może ci się przyda.


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
CuteOne
post 5.07.2011, 18:38:25
Post #3





Grupa: Zarejestrowani
Postów: 2 958
Pomógł: 574
Dołączył: 23.09.2008
Skąd: wiesz, że tu jestem?

Ostrzeżenie: (0%)
-----


google -> LEFT JOIN
Go to the top of the page
+Quote Post
Przemo75
post 6.07.2011, 22:21:45
Post #4





Grupa: Zarejestrowani
Postów: 66
Pomógł: 2
Dołączył: 9.03.2004
Skąd: POLSKA

Ostrzeżenie: (0%)
-----


@nospor
Wielkie dzięki za ogromne wsparcie (linkiem). Początkowo myślałem, że nie dam rady tego przerobić na swoje potrzeby ale na (moje) szczęście się udało.

Poniżej poprawiony kod (może nie wygląda najlepiej ale cóż).

  1. @$kategoria = $_POST['kategoria'];
  2.  
  3. if ($kategoria)
  4. {
  5. $link=mysql_query(" SELECT GROUP_CONCAT(a.produkt ORDER BY a.id_asort ASC SEPARATOR ';;;') PRODUCTS, k.id_kategorii kid, k.nazwa knazwa, k.opis kopis FROM kategoria k LEFT JOIN asortyment a ON a.id_kategorii = k.id_kategorii WHERE k.id_kategorii='$kategoria' GROUP BY a.id_kategorii ORDER BY a.id_asort ASC ");
  6.  
  7. $categories = array();
  8. while ($wybor2 = mysql_fetch_array($link)){
  9. $kid = $wybor2['kid'];
  10.  
  11. $categories[$kid] = array('nazwa' => $wybor2['knazwa'], 'opis' => $wybor2['kopis'], 'products' => array());
  12.  
  13. if (!empty($wybor2['PRODUCTS']))
  14. {
  15. $products = explode(';;;',$wybor2['PRODUCTS']);
  16. foreach ($products as $produkt){
  17. $categories[$kid]['products'][] = $produkt;
  18. }
  19. }
  20. }
  21.  
  22. echo '<br><ul>';
  23. foreach ($categories as $idCat => $category)
  24. {
  25. echo '<li><b>'.$category['nazwa'].'</b><br><br>';
  26. echo '<li>'.$category['opis'].'<ul><br>';
  27. foreach ($category['products'] as $produkt)
  28. {
  29. echo '<li>'.$produkt.'</li>';
  30. }
  31. echo '</ul></li>';
  32. }
  33. echo '</ul>';
  34.  
  35. }


Jeszcze jedno pytanie. W jaki sposób trzeba zmodyfikować kod, aby uzyskać nr id (a.id_asort) dla każdego otrzymanego produktu?

Ten post edytował Przemo75 6.07.2011, 14:05:04
Go to the top of the page
+Quote Post
nospor
post 7.07.2011, 07:24:46
Post #5





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




Użyłeś wersji z GROUP_CONCAT... wersję tę napisałem pod "przymusem" po czym podałem jej wady. I ty właśnie chcąc dodatkowych informacji, trafiłeś właśnie na główną wadę tej wersji smile.gif

No nic, miałes do wyboru jeszcze inną wersję, wybrałeś tą więc teraz cierp wink.gif Musisz poprostu dopisać kolejnego GROUP_CONCAT na pole, które chcesz uzyskać.


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
Przemo75
post 7.07.2011, 07:46:14
Post #6





Grupa: Zarejestrowani
Postów: 66
Pomógł: 2
Dołączył: 9.03.2004
Skąd: POLSKA

Ostrzeżenie: (0%)
-----


No to będzie mała jazda.
Wracając do obecnego stanu kodu zauważyłem, niestety, że niektóre wyniki zapytania nie wyświetla w całości, np.
Nazwa produktu 1
Nazwa produktu 2
...
Nazwa produ
a co za tym idzie, nie wyświetla wszystkich rekordów z bazy.
Go to the top of the page
+Quote Post
nospor
post 7.07.2011, 07:48:04
Post #7





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




Użyj pierwszej wersji z mojego arta. Ona jest normalna.
Tą którą użyłeś, napisałem pod wpływem "grupy nacisku" i z niechęcią smile.gif


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
Przemo75
post 7.07.2011, 09:29:47
Post #8





Grupa: Zarejestrowani
Postów: 66
Pomógł: 2
Dołączył: 9.03.2004
Skąd: POLSKA

Ostrzeżenie: (0%)
-----


Bingo smile.gif Teraz działa jak należy.

@nospor
Raz jeszcze wielkie dzięki.
  1. @$kategoria = $_POST['kategoria'];
  2.  
  3. if ($kategoria)
  4. {
  5. $link=mysql_query(" SELECT a.id_kategorii aid, a.produkt aprodukt, a.id_asort aida, k.id_kategorii kid, k.nazwa knazwa, k.opis kopis FROM kategoria k LEFT JOIN asortyment a ON a.id_kategorii = k.id_kategorii WHERE k.id_kategorii='$kategoria' ORDER BY a.id_asort ASC ");
  6.  
  7. $categories = array();
  8. while ($wybor2 = mysql_fetch_array($link))
  9. {
  10. $kid = $wybor2['kid'];
  11.  
  12. if (!isset($categories[$kid]))
  13. $categories[$kid] = array('nazwa' => $wybor2['knazwa'], 'opis' => $wybor2['kopis'], 'products' => array());
  14.  
  15. if (!empty($wybor2['aprodukt']))
  16. $categories[$kid]['products'][] = array('produkt' => $wybor2['aprodukt'], 'id_asort' => $wybor2['aida']);
  17. }
  18. //print_r($categories); //do obejrzenia jak wygląda wygenerowana tablica
  19.  
  20. echo '<br><ul>';
  21. foreach ($categories as $idCat => $category)
  22. {
  23. echo '<li><b>'.$category['nazwa'].'</b><br>';
  24. echo '<li>'.$category['opis'].'<ul>';
  25. foreach ($category['products'] as $produkty)
  26. {
  27. echo '<li>'.$produkty['produkt'].' - id '.$produkty['id_asort'].'</li>';
  28. }
  29. echo '</ul></li>';
  30. }
  31. echo '</ul>';
  32. }

Mam nadzieję, że kolejny krok - edycja - będzie analogiczna i nie będzie stanowiła wielkich problemów.
Go to the top of the page
+Quote Post
nospor
post 7.07.2011, 09:35:04
Post #9





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




A powiedz mi jeszcze ile miałeś produktów w kategorii, gdzie produkty zaczęły ci się źle wyświetlać?


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
Przemo75
post 9.07.2011, 18:29:25
Post #10





Grupa: Zarejestrowani
Postów: 66
Pomógł: 2
Dołączył: 9.03.2004
Skąd: POLSKA

Ostrzeżenie: (0%)
-----


Tylko 13 produktów i chyba w ostatnim był ten błąd. W innej kategorii w 17 produkcie na 28.

Ten post edytował Przemo75 9.07.2011, 18:30:43
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 24.07.2025 - 23:00