Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL][PHP]Wyświetlenie z BD w tabelce
Forum PHP.pl > Forum > Przedszkole
aisha
Dzień dobry, z góry przepraszam jeśli coś zrobiłam nie tak jak powinnam, ale to pierwszy raz kiedy korzystam z forum.

Mój problem wygląda następująco.
Mam bazę w której jest kilka tabel. Przechowują one dane z normalnej tabelki gdzie są wiersze i kolumny.

Udało mi się napisać zapytanie, które łączy tabele, które są w bazie. W phpmyadmin po wpisaniu kodu sql wydaje mi się,że wygląda wszystko tak jak powinno. Teraz muszę wyświetlić to co jest w bazie na stronie w formie tabelki. I tu pojawia się mój problem, bo nie umiem sobie z tym poradzić. Każda nazwa obiektu i atrybutu powinna pojawić się tylko raz. I każda para obiekt atrybut powinna mieć przypisaną do siebie wartość.


Ogólnie schematycznie tabelka powinna wyglądać tak:

| Nazwa atrybutu | Nazwa atrybutu | Nazwa atrybutu | Nazwa atrybutu
___________________________________________________________
Nazwa obiektu | Nazwa wartości | Nazwa wartości | Nazwa wartości | Nazwa wartości |
Nazwa obiektu | Nazwa wartości | Nazwa wartości | Nazwa wartości | Nazwa wartości |
Nazwa obiektu | Nazwa wartości | Nazwa wartości | Nazwa wartości | Nazwa wartości |
Nazwa obiektu | Nazwa wartości | Nazwa wartości | Nazwa wartości | Nazwa wartości |
Nazwa obiektu | Nazwa wartości | Nazwa wartości | Nazwa wartości | Nazwa wartości |
Nazwa obiektu | Nazwa wartości | Nazwa wartości | Nazwa wartości | Nazwa wartości |


Tutaj są screeny konkretów
Wynik zapytania mysql

Wygąd po wyświetleniu na stronie


Na chwile obecną żeby wyświetlić nazwę obiektu i nazwę atrybutu z bazy używam osobnych dwóch zapytań, bo inaczej nie potrafię.


Prosiła bym o:
- powiedzenie mi czy to zapytanie waszym zdaniem jest poprawne żeby wyświetlić to w takiej formie jak potrzebuję?
- jakieś wskazówki/wytłumaczenie odnośnie tego jak to wyświetlić w tabelce za pomocą php i htmla. Proszę o pisanie na chłopski rozum gdyż niestety w tej tematyce dopiero raczkuje sad.gif

Jeżeli zapomniałam coś dopisać lub napisałam niezrozumiale proszę mnie poinformować

Z góry dziękuje za każdą pomoc.




  1. <!--c1--><div class='codetop'>Kod</div><div class='codemain'><!--ec1--><?php
  2. echo'<table class="table table-bordered">';
  3. echo'<table class="table table-striped">';
  4. echo"<tbody>";
  5.  
  6. /*
  7. $zapytanie = "select nazwa_atrybutu, nazwa_obiektu, nazwa_wartosci from atrybut
  8. join pozycja on atrybut.id_atrybutu=pozycja.atrybut_id_atrybutu
  9. join obiekt on
  10. obiekt.id_obiektu= pozycja.obiekt_id_obiektu
  11. join wartosc on wartosc.id_wartosci=pozycja.wartosc_id_wartosci ";
  12. */
  13.  
  14.  
  15.  
  16. $zapytanie = "select nazwa_obiektu, nazwa_atrybutu,`wartosc_num`, nazwa_wartosci,nr_kolumny from atrybut
  17. left join pozycja on atrybut.id_atrybutu=pozycja.atrybut_id_atrybutu
  18. left join obiekt on obiekt.id_obiektu= pozycja.obiekt_id_obiektu
  19. left join wartosc on wartosc.id_wartosci=pozycja.wartosc_id_wartosci
  20. where nr_kolumny = wartosc_num";
  21.  
  22.  
  23.  
  24. $wynik = mysql_query($zapytanie);
  25.  
  26. $ilosc_wszystkich_wierszy = mysql_num_rows($wynik);
  27. echo "Ilosc wszytskich wierszy dla zapytania: $ilosc_wszystkich_wierszy";
  28. echo "</br>";
  29.  
  30. $zapytanie_liczba_obiektow = "select * from obiekt";
  31.  
  32. $wynik_obiekty = mysql_query($zapytanie_liczba_obiektow);
  33. $ilosc_obiektow = mysql_num_rows($wynik_obiekty);
  34. echo "Ilosc obiektow:  $ilosc_obiektow";
  35. echo "</br>";
  36.  
  37. $zapytanie_liczba_atrybutow = "select * from atrybut";
  38.  
  39. $wynik_atrybuty = mysql_query($zapytanie_liczba_atrybutow);
  40. $ilosc_atrybutow = mysql_num_rows($wynik_atrybuty);
  41.  
  42.  
  43.  
  44. echo "Ilosc atrybutow: $ilosc_atrybutow";
  45. echo "</br>";
  46. echo "</br>";
  47.  
  48. echo '<tr>';    
  49. echo '<th>';    
  50.  
  51. while ($row = mysql_fetch_assoc($wynik_atrybuty)){
  52.  
  53.  
  54.  
  55. echo "<td>{$row['nazwa_atrybutu']}</td>\n";
  56.     
  57. }
  58. echo '</th>';
  59. echo '</tr>';    
  60.  
  61. while ($row = mysql_fetch_assoc($wynik_obiekty)){    
  62.  
  63. echo '<tr>';    
  64. echo "<th>{$row['nazwa_obiektu']}</th>\n";
  65.  
  66. while ($row = mysql_fetch_assoc($wynik)){    
  67.  
  68. echo  "<td>{$row['nazwa_wartosci']}</td>";    
  69.  
  70. }
  71.  
  72.  
  73. echo '</tr>';    
  74. }
  75.  
  76.  
  77.  
  78. echo"</tbody>";
  79. echo" </table>";
  80. echo" </table>";
  81.  
  82. ?><!--c2--></div><!--ec2-->
pmir13
Trudno określić co w tych tabelach siedzi, zazwyczaj podanie struktury tabel to pierwsze co robią ludzie szukający pomocy. Zwłaszcza jeśli wyniki ze screena z phpmyadmina wyglądają podejrzanie jeśli chodzi o wartosc_num. Może to miały być numeryczne odpowiedniki słów TAK NIE WYSOKA itp? W ogóle to zapytanie wygląda dziwnie, choć bez struktury ciężko powiedzieć.

Ogólnie do wyświetlania takich tabelek należałoby dodać sortowanie w zapytaniu typu ORDER BY wiersz,kolumna czyli przykładowo ORDER BY nazwa_obiektu, nr_kolumny po czym ciągnąc z bazy poszczególne rekordy przy zmianie nazwy obiektu wstawiamy htmlowy koniec i początek nowego wiersza tabelki. Ewentualnie znając konkretne ilości można dwie pętle jedna w drugiej zrobić. Ale to pod warunkiem absolutnej pewności że jest dokładnie tyle ile trzeba w bazie.

Do wyciągania ilości rekordów lepiej używać zapytań typu "SELECT COUNT(*) FROM obiekt" niż brać wszystko z tabeli i odczytywać num_rows.

Jeśli się uczysz to staraj się unikać funkcji mysql_ , które są mocno przestarzałe i od razu ucz się przynajmniej mysqli_ , nawet jeśli obiektowe podejście wydaje się na początku niezrozumiałe. Do znalezienia w sieci jest masę poradników z gotowymi kawałkami kodu do podstawowych operacji na bazie.
aisha
Wiedziałam, że o czymś zapomniałam. Już uzupełniam to czego brakowało.

Screeny bazy i tabel:

Baza schemat.jpg

Tabele: tabela, atrybut, obiekt

Tabela pozycja

Tabela wartość


Kod sql bazy:
Baza plik.sql


wartosc_num na chwile obecną to po prostu numer kolumny.

Każdy obiekt i atrybut ma mieć przypisaną odpowiednią wartość z bazy. Tabela pozycja jest po to żeby wiedzieć, w którym miejscu (na jakiej pozycji) jest jaka wartość.
Ważne jest to, że nazwy obiektów, atrybutów i wartości muszą być w takiej kolejności jak są na zdjęciu z pierwszego postu czyli atrbybuty w kolejności: bół mięsni, ból głowy, gorączka, grypa obiekty w kolejności: 1, 2, 3, 4, 5, 6 (i wartości jak na zdjęciu z Wygąd po wyświetleniu na stronie ). Po wyświetleniu na stronie muszę mieć możliwość porównania przykładowo dajmy na to: obiekt 1 i 6 mają te sama wartości dla atrybutów ból głowy, ból mięśni, temperatura ale inną wartość dla atrybutu grypa lub obiekt x i y mają rożne wartości dla wszystkich atrybutów.


Może teraz jest jaśniej i uda się stwierdzić czy tym zapytaniem jestem w stanie to wyświetlić a jeśli tak to sugestie jak to zrobić żeby użyć jednego zapytania a nie kilku no chyba, że się nie da jednym i trzeba użyć kilku.





pmir13
Pomijając zasadność takiej struktury danych, jeśli tak ma być to wystarczy jedno zapytanie
  1. SELECT o.nazwa_obiektu, a.nazwa_atrybutu, a.nr_kolumny, w.nazwa_wartosci
  2. FROM pozycja p
  3. JOIN atrybut a ON p.atrybut_id_atrybutu = a.id_atrybutu
  4. JOIN obiekt o ON p.obiekt_id_obiektu = o.id_obiektu
  5. JOIN wartosc w ON p.wartosc_id_wartosci = w.id_wartosci
  6. WHERE a.tabela_id_tabeli = 1 AND o.tabela_id_tabeli = 1
  7. ORDER BY o.nazwa_obiektu, a.nr_kolumny

I do zbudowania tabelki w html to jest wszystko co trzeba. Można sobie całość zapisać w tablicy lub też tylko pierwszy wiersz żeby zrobić th a potem po kolei sprawdzamy rekordy i jeśli zmienia się nazwa obiektu to zamykamy tr, otwieramy nowe i wstawiamy na początek dodatkowe td z nazwą obiektu a oprócz tego dla każdego rekordu dodajemy td z nazwą wartości.
aisha
Dziękuje bardzo, w takim razie muszę pokombinować jak to wyświetlić żeby wyglądało tak jak powinno.
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.