Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP][MySQL] Pobieranie wyników z dwóch tabel
Forum PHP.pl > Forum > Przedszkole
rja
Witam,
Jest jedna tabela1(id,typ) gdzie typy to np. A, B, C, itd
Druga tabela2(id,typ,element), która zawiera Elementy danego typu.

Jak wykonać zapytanie SQL oraz jak wyświetlić zawartość w postaci listy:

Typ A
Element 1
Element 2
Typ B
Element 3
Typ C
Element 4

itd.

Z wyświetleniem typu radzę sobie tak:
  1. <?php
  2. $stmt = $dbh->prepare("SELECT * FROM tabela1");
  3. $stmt->execute();
  4. $typy = $stmt->fetchAll(PDO::FETCH_ASSOC);
  5. foreach ($typy as $row => $link) {
  6. echo $link['typ']. '</br>';
  7. }
  8. unset($dbh);
  9. unset($stmt);
  10. ?>
nospor
Popraw tytul na zgodny z regulaminem

Co do probelmu
http://nospor.pl/grupowanie-wynikow.html
rja
Dzięki wielkie za link do rozwiązania, o które mi chodziło.
Jednak dalej walczę z problemem. Próbuję to rozwiązanie wdrożyć w pewien framework (którego nie jestem autorem), a który opiera się o model MVC i chyba o bibliotekę PEAR.
W skrócie wygląda to tak, że mam plik model.php:
  1. class Produkty {
  2.  
  3. protected function pobierzHtml() {
  4. $html = '';
  5.  
  6. if(empty($_GET['akcja'])) {
  7. $html = $this->listaProduktow();
  8. }
  9.  
  10. if(empty($html)) {
  11. Response::NotFound();
  12. }
  13.  
  14. return $html;
  15. }
  16. public function listaProduktow(){
  17. $rows = db()->queryAll("select p.NAME PNAME,p.ID PID, c.ID CID, c.NAME CNAME from category c
  18. left join product p on p.FK_CATEGORY = c.ID
  19. order by c.NAME asc, p.NAME asc ")
  20. //później mamy coś takiego - wzorując się na innych modelach
  21. foreach ((array)$rows as $row){
  22. $this->data['produkty'][]= $row;
  23. //z tą zawartością mam problem
  24. //wstawienie podobnie jak w przykładzie z linku nie daje efektu
  25. }
  26. return $this->view('produkty');
  27. }
  28. }

Wyniki wyświetlane są przez plik produkty.html, w którym mam narazie:
  1. <?php
  2. echo '<pre>';
  3. print_r($produkty);
  4. echo '</pre>';
  5. ?>

Samo zapytanie do bazy jest poprawne. Potrafię wyświetlić pewne pojedyncze rzeczy z bazy, ,ale niestety nie wiem jak zapisać pętlę FOREACH tak aby otrzymać właściwą tablicę (jak w przykładzie z linku).
nospor
Za bardzo nie wiem w czym masz problem. Sposob rozwiazania jest taki sam niezaleznie czy uzywasz mysql_query() jak ja w przykladzie czy queryAll() jak u ciebie
rja
No mam problem z zapisaniem pętli foreach.
Przy zachowaniu w pętli tylko zapisu: $this->data['produkty'][]= $row;
moja tablica wygląda mniej więcej tak:
  1. Array
  2. (
  3. [1] => Array
  4. (
  5. [name] => kategoria 1
  6. [name] => Produkt1 z kategori 1
  7. [id] => 1
  8. [name] => Produkt2 z kategori 1
  9. [id] => 2
  10.  
  11.  
  12. )
  13.  
  14. [2] => Array
  15. itd....


Tak się zastanawiam czy w mojej pętli nie brakuje czasem KLUCZA.
nospor
No przeciez w moim kodzie wyraznie masz pokazane, ze produkty przypisane sa do kategorii. Ty zas wszystko walisz do produktow
rja
No właśnie nie wiem jak przenieść to Twoje rozwiązanie.
Nie radzę sobie z tablicami a już z Obiektowym to jeszcze trudniej.
nospor
Tutaj nie ma nic obiektowego.
$this->costam to naprawde zadna obiektowka. Tablica jak kazda inna.

Jak masz to zrobic masz dokladnie pokazane na moim przykladzie. Ty zas u ciebie wsadziles cos ode mnie ze srodka kodu, ignorujac cala reszte i zdziwiony ze cos brakuje. No nie przesadzaj. Wszystko masz podane. Nawet nie musisz zmieniac nazw zmiennych
rja
Próbowałem wstawiać dokładnie to co u Ciebie ale wtedy Widok nie wyświetlał nic. Nie rozumiem do końca przekazywania tej tablicy do widoku.
Powalczę jeszcze z tym jutro ale rozumiem że pętla w modelu musi być jeszcze uzupełniona?
nospor
Cytat
ale rozumiem że pętla w modelu musi być jeszcze uzupełniona?
Tak. zjadles caly blok z kategoriami.

Skoro nie ogarniasz narazie swojego widoku to poprostu zrob tak jak u mnie, zmienne lokalne. print_r mozesz dac rownie dobrze w modelu a nie w widoku by sprawdzac czy dane masz juz takie jakie chcesz.
Jak juz to osiagniesz to wowczas sie bedziesz martwil jak to przekazac do widoku
rja
OK. A czy w tym modelu ogarnie mi to jedna pętla czy też muszę dodać drugą?

Chyba tego nie ogarnę. sad.gif
Przy pętli:
  1. foreach($rows as $key => $row){
  2. $this->data['categories'][]= $row;
  3. }

mam tak:
  1. Array
  2. (
  3. [0] => Array
  4. (
  5. [pname] => Produkt1 z kategori 1
  6. [pid] => 1
  7. [cid] => 1
  8. [cname] => kategoria 1
  9. )
  10.  
  11. [1] => Array
  12. (
  13. [pname] => Produkt1 z kategori 1
  14. [pid] => 2
  15. [cid] => 1
  16. [cname] => kategoria 1
  17. )
  18.  
  19. [2] => Array
  20. (
  21. [pname] => Produkt1 z kategori 2
  22. [pid] => 3
  23. [cid] => 2
  24. [cname] => kategoria 2
  25. )
  26.  
  27. [3] => Array
  28. (
  29. [pname] => Produkt1 z kategori 3
  30. [pid] => 4
  31. [cid] => 3
  32. [cname] => kategoria 3
  33. )
  34.  
  35. [4] => Array
  36. (
  37. [pname] => Produkt2 z kategori 3
  38. [pid] => 5
  39. [cid] => 3
  40. [cname] => kategoria 3
  41. )
  42.  
  43. [5] => Array
  44. (
  45. [pname] => Produkt3 z kategori 3
  46. [pid] => 6
  47. [cid] => 3
  48. [cname] => kategoria 3
  49. )
  50.  
  51. [6] => Array
  52. (
  53. [pname] =>
  54. [pid] =>
  55. [cid] => 4
  56. [cname] => kategoria bez produktów
  57. )
  58.  
  59. )


Przy pętli:
  1. foreach($rows as $key => $row){
  2. $cid = $row['CID'];
  3. $this->data['categories'][$cid] = array('name' => $row['CNAME'], 'products' => array());
  4. }


Mam tylko tyle:
  1. Array
  2. (
  3. [] => Array
  4. (
  5. [name] =>
  6. [products] => Array
  7. (
  8. )
  9.  
  10. )
  11.  
  12. )


A przy pętli:
  1. foreach($rows as $key => $row){
  2. $cid = $row['CID'];
  3. $this->data['categories'][$key] = array('name' => $row['CNAME'], 'products' => array());
  4. }


Mam to:
  1. Array
  2. (
  3. [0] => Array
  4. (
  5. [name] =>
  6. [products] => Array
  7. (
  8. )
  9.  
  10. )
  11.  
  12. [1] => Array
  13. (
  14. [name] =>
  15. [products] => Array
  16. (
  17. )
  18.  
  19. )
  20.  
  21. [2] => Array
  22. (
  23. [name] =>
  24. [products] => Array
  25. (
  26. )
  27.  
  28. )
  29.  
  30. [3] => Array
  31. (
  32. [name] =>
  33. [products] => Array
  34. (
  35. )
  36.  
  37. )
  38.  
  39. [4] => Array
  40. (
  41. [name] =>
  42. [products] => Array
  43. (
  44. )
  45.  
  46. )
  47.  
  48. [5] => Array
  49. (
  50. [name] =>
  51. [products] => Array
  52. (
  53. )
  54.  
  55. )
  56.  
  57. [6] => Array
  58. (
  59. [name] =>
  60. [products] => Array
  61. (
  62. )
  63.  
  64. )
  65.  
  66. )


OK. Coś ruszyło.
Przy warunku:
  1. foreach((array)$rows as $row) {
  2. $cid = $row['cid'];
  3. $cname = $row['cname'];
  4. $this->data['kategorie'][$cid] = array(
  5. 'c_id' => $cid,
  6. 'c_name' => $row['cname']
  7. );


Mam tablice kategorii:
  1. Array
  2. (
  3. [1] => Array
  4. (
  5. [c_id] => 1
  6. [c_name] => kategoria 1
  7. )
  8.  
  9. [2] => Array
  10. (
  11. [c_id] => 2
  12. [c_name] => kategoria 2
  13. )
  14.  
  15. [3] => Array
  16. (
  17. [c_id] => 3
  18. [c_name] => kategoria 3
  19. )
  20.  
  21. [4] => Array
  22. (
  23. [c_id] => 4
  24. [c_name] => kategoria bez produktów
  25. )
  26.  
  27. )


Jak to ugryźć dalej?
nospor
Wszystko masz napisane w moim kodzie. W moim kodzie w jednej petli masz tworzenie kategorii oraz dodawanie produktow dla niej. Z niewyjasnionego dla mnie powodu ty ciagle to ignorujesz te dwie rzeczy na raz, albo robisz kategorie, albo produkty, podczas gdy w moim krotkim kodzie masz te dwie obie rzeczy naraz. Czemu ignorujesz fakt, ze te dwie rzeczy istniaja razem a nie kazda z osobna?
rja
Uwierz mi, naprawdę nie ignoruję.
Jest mały postęp:
  1. foreach((array)$rows as $row) {
  2. $cid = $row['cid'];
  3. $cname = $row['cname'];
  4. $pname = $row['pname'];
  5. $pid = $row['pid'];
  6. $this->data['kategorie'][$cid] = array(
  7. 'c_id' => $cid,
  8. 'c_name' => $row['cname'],
  9. 'produkty' => array()
  10. );
  11. if (!empty($pname))
  12. $this->data['kategorie'][$cid]['produkty'][] = array(
  13. 'p_name' => $pname,
  14. 'p_id' => $pid
  15. );
  16. }

Przy tym warunku mam:
  1. Array
  2. (
  3. [1] => Array
  4. (
  5. [c_id] => 1
  6. [c_name] => kategoria 1
  7. [produkty] => Array
  8. (
  9. [0] => Array
  10. (
  11. [p_name] => Produkt1 z kategori 1
  12. [p_id] => 2
  13. )
  14.  
  15. )
  16.  
  17. )
  18.  
  19. [2] => Array
  20. (
  21. [c_id] => 2
  22. [c_name] => kategoria 2
  23. [produkty] => Array
  24. (
  25. [0] => Array
  26. (
  27. [p_name] => Produkt1 z kategori 2
  28. [p_id] => 3
  29. )
  30.  
  31. )
  32.  
  33. )
  34.  
  35. [3] => Array
  36. (
  37. [c_id] => 3
  38. [c_name] => kategoria 3
  39. [produkty] => Array
  40. (
  41. [0] => Array
  42. (
  43. [p_name] => Produkt3 z kategori 3
  44. [p_id] => 6
  45. )
  46.  
  47. )
  48.  
  49. )
  50.  
  51. [4] => Array
  52. (
  53. [c_id] => 4
  54. [c_name] => kategoria bez produktów
  55. [produkty] => Array
  56. (
  57. )
  58.  
  59. )
  60.  
  61. )


Dlaczego dla 3 kategorii mam tylko jeden produkt? W bazie na pewno jest trzy.
nospor
Cytat
Uwierz mi, naprawdę nie ignoruję.
W poprzednim poscie pokazywales kilka kodow i kazdy zawieral kazda z tych rzeczy oddzielnie, ani razu razem, wiec tak, ignorowales.

Czemu masz jeden produkt? Bo w petli ciagle nadpisujesz wszystko. W moim kodzie masz isset(), ktore tylko raz tworza kategorie. Ty za kazdym razem nadpisujesz kategorie. To jest kolejny dobry przyklad jak ignorujesz to co dostales.

Moj kod petli ma raptem pare linijek a ty radosnie losowo z niego cos bierzesze ignorujac cala reszte.
rja
Nie ignoruję tylko się uczę.
Naprawdę doceniam Twoją pomoc.

Ok daję isset:
  1. foreach((array)$rows as $row) {
  2. $cid = $row['cid'];
  3. $cname = $row['cname'];
  4. $pname = $row['pname'];
  5. $pid = $row['pid'];
  6. if (!isset($cid))
  7. $this->data['kategorie'][$cid] = array(
  8. 'c_id' => $cid,
  9. 'c_name' => $row['cname'],
  10. 'produkty' => array()
  11. );
  12. if (!empty($pname))
  13. $this->data['kategorie'][$cid]['produkty'][] = array(
  14. 'p_name' => $pname,
  15. 'p_id' => $pid
  16. );
  17. }

I mam tablice
  1. Array
  2. (
  3. [1] => Array
  4. (
  5. [produkty] => Array
  6. (
  7. [0] => Array
  8. (
  9. [p_name] => Produkt1 z kategori 1
  10. [p_id] => 1
  11. )
  12.  
  13. [1] => Array
  14. (
  15. [p_name] => Produkt1 z kategori 1
  16. [p_id] => 2
  17. )
  18.  
  19. )
  20.  
  21. )
  22.  
  23. [2] => Array
  24. (
  25. [produkty] => Array
  26. (
  27. [0] => Array
  28. (
  29. [p_name] => Produkt1 z kategori 2
  30. [p_id] => 3
  31. )
  32.  
  33. )
  34.  
  35. )
  36.  
  37. [3] => Array
  38. (
  39. [produkty] => Array
  40. (
  41. [0] => Array
  42. (
  43. [p_name] => Produkt1 z kategori 3
  44. [p_id] => 4
  45. )
  46.  
  47. [1] => Array
  48. (
  49. [p_name] => Produkt2 z kategori 3
  50. [p_id] => 5
  51. )
  52.  
  53. [2] => Array
  54. (
  55. [p_name] => Produkt3 z kategori 3
  56. [p_id] => 6
  57. )
  58.  
  59. )
  60.  
  61. )
  62.  
  63. )

Mam wszystkie produkty z 3 ale wcięło 4 kategorie.
Czego znowu brakuje?

Korekta - jak się przyjrzeć to tablica się rozsypała.
nospor
Czy ty naprawde nie widzisz roznicy miedzy tymi dwoma kodami?



if (!isset($categories[$cid])) - moj
if (!isset($cid)) - twoj

Naprawde za kazdym razem mam ci pisac ze ignorujesz to co masz podane? Ze losowo bierzesz sobie kawalek kodu i tylko go wstawiasz?
rja
No dobra, z if (!isset($categories[$cid]))
mam dalej 3 z jednym produktem.

jak pisałem wszystko mi się miesza przez to całe $this->data
nospor
Cytat
jak pisałem wszystko mi się miesza przez to całe $this->data
A ja ci skolei napisalem bys poki co olal $this->data skoro tego nie ogarniasz i bys operowal jak ja na zmiennych lokalnych. Ale nawet to do ciebie nie dociera
rja
Patrząc na inne modele w tym frameworku to dane do widoków przekazywane są w ten właśnie sposób $this->data.
W moim widoku nawet się to teraz wyświetla ale oczywiście jak w tablicy.
nospor
Cytat
Patrząc na inne modele w tym frameworku to dane do widoków przekazywane są w ten właśnie sposób $this->data.

Ok, skup sie teraz choc przez moment:

Zapomnij na moment o $this->data. Skoro tego nie ogarniasz ,to zostaw to na chwile. Zrob dokladnie jak w moim kodzie - zmienne lokalne a nie zadne $this.
Jak juz zrobisz to poprawnie, wowczas powiem ci jak to przekazac do $this->data.

A teraz przeczytaj ten post jeszcze dwa razy, bys mial 100% pewnosci ze dotarlo co napisalem.
rja
Ok. Zapominam o $this ale mogę to dalej robić to w mojej Metodzie/funkcji i na końcu zawracam : return $categories, tak?
nospor
Tak, ma byc w tej samej funkcji co bylo

NIe, nie masz nic zwracac. Na koncu ma byc

print_r($categories);
exit;

I ma tak byc do czasu az nie bedziesz mial w $categories tego co chcesz
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.