Drukowana wersja tematu

Kliknij tu, aby zobaczyć temat w orginalnym formacie

Forum PHP.pl _ Przedszkole _ [PHP][MySQL] Wyświetlanie danych w komórce

Napisany przez: Kshyhoo 30.01.2018, 20:56:40

Postanowiłem zmienić sposób wyświetlania danych, kiedyś HTML a teraz chciałbym użyć PHP/MySQL. I borykam się z pewnym problemem, mianowicie tak było:

  1. +-------------------------+
  2. | NAGŁÓWEK |
  3. +-----------+-------------+
  4. | RAL C: | 8028 |
  5. | NCS 1950: | ~8010-Y30R |
  6. | | ~8010-Y50R |
  7. | Pantone: | ~2322 C |
  8. | | ~7533 C |
  9. | | ~476 C |
  10. | | ~7554 C |
  11. | RGB | 078-059-049 |
  12. | HEX | 4E3B31 |
  13. +-----------+-------------+

W HTML miałem dwie komórki i w nagłówkowej colspan="2". Teraz mam problem z dynamicznym wyświetlaniem, tym bardziej, że NCS i Pantone może być kilka albo wcale.
Jakieś pomysły?

Napisany przez: SmokAnalog 30.01.2018, 21:02:04

Ale o co chodzi? Co ma PHP/MySQL do wyświetlania tabeli w HTML? Może podaj chociaż strukturę bazy czy cokolwiek i napisz o co Ci chodzi haha.gif

Napisany przez: Kshyhoo 30.01.2018, 21:32:31

  1. CREATE TABLE `kolor` (
  2. `id` int(11) NOT NULL AUTO_INCREMENT,
  3. `ral` smallint(4) NOT NULL,
  4. `ncs` tinytext NOT NULL,
  5. `pantone` text NOT NULL,
  6. `r` char(3) NOT NULL,
  7. `g` char(3) NOT NULL,
  8. `b` char(3) NOT NULL,
  9. `hex` char(6) NOT NULL,
  10. PRIMARY KEY (`id_kol`)
  11. ) ENGINE=MyISAM;

Chodzi o to, że nie wiem jak pętlę spłodzić, żeby wyświetlić dane...

Napisany przez: SmokAnalog 30.01.2018, 21:56:23

Pokaż jakąś swoją próbę uzyskania tego efektu.

Napisany przez: Kshyhoo 30.01.2018, 21:59:25

Jakbym wiedział, jak, to bym se napisał kod, nie mam pojęcia jak go zrobić. Wyświetlam w ten deseń, ale to tylko wyświetla dane:

  1. <td width="80px" style="text-align: right; border-right: hidden">
  2. <b>RAL C:</b><br />
  3. <b>NCS 1950:</b><br />
  4. <b>Pantone:</b><br />
  5. <b>RGB:</b><br />
  6. <b>HEX:</b>
  7. </td>
  8. <td width="100px" style="text-align: left">
  9. <?php http://www.php.net/echo $kolor['ral']; ?><br />
  10. <?php http://www.php.net/echo $kolor['ncs']; ?><br />
  11. <?php http://www.php.net/echo $kolor['pantone']; ?><br />
  12. <?php http://www.php.net/echo $kolor['k_r']."-".$kolor['k_g']."-".$kolor['k_b'] ?><br />
  13. <?php http://www.php.net/echo $kolor['k_hex']; ?>
  14. </td>

Napisany przez: SmokAnalog 30.01.2018, 22:10:17

A NCS i Pantone jak se zapisujesz w bazie? Jak są pooddzielane?

Napisany przez: Kshyhoo 30.01.2018, 22:13:58

W jednej komórce, w liniach, potem nl2br.

Napisany przez: phpion 30.01.2018, 22:18:01

Nie prościej zrobić to po bożemu za pomocą wierszy tabeli i tylko odpowiednio ostylowac obramowania? Ale jeśli chcesz byc hardkorem to po lewej stronie dawaj tyle br ile jest znaków nowej linii po prawej. Chyba ze może dojść do złamania linii po prawej to wtedy sprawa sie komplikuje. No ale co to dla hardkora smile.gif

Napisany przez: SmokAnalog 30.01.2018, 22:19:52

Oczywiście, że lepiej. Krzysiowa tabela jest źle zaprojektowana, zresztą baza danych również.

Napisany przez: phpion 30.01.2018, 22:22:00

Ale co ma schemat bazy (bo zapewne to miałeś na myśli) do sposobu wyświetlania?

Napisany przez: Kshyhoo 30.01.2018, 22:22:20

Cytat(SmokAnalog @ 30.01.2018, 22:19:52 ) *
Oczywiście, że lepiej. Krzysiowa tabela jest źle zaprojektowana.

Oczekiwałbym raczej konstruktywnej podpowiedzi, niż sarkazmu...

Napisany przez: SmokAnalog 30.01.2018, 22:25:01

A musi coś mieć wspólnego? Poruszam tu po prostu dodatkowy problem.

Zacznij od tego, żeby pozamieniać <br> na osobne wiersze w tabeli. Nowe linie będą w porządku w ramach tej samej grupy (czyli np. jako separator dla Pantone).

Napisany przez: phpion 31.01.2018, 06:38:59

@Smok:
Patrząc na schemat tabeli wyglada na to ze właśnie znaki nowej linii są w obrębie danej grupy.

@Kshyshoo:
Przeczytaj moja pierwsza odpowiedz - tam masz rozwiazanie.

Napisany przez: Kshyhoo 31.01.2018, 07:04:34

Postanowiłem przenieść te dane do nowej tabeli. Będzie łatwiej ale i trudniej wink.gif

Napisany przez: phpion 31.01.2018, 07:14:18

Jak to kiedyś powiedział kolega gdy jechaliśmy tramwajem i zasugerował by wysiąść na dalszym przystanku: „tam dalej będzie bliżej” smile.gif

Napisany przez: Kshyhoo 4.02.2018, 21:42:54

Nie do końca wiem, jak mam zmienić bazę. Czy tak wystarczy?

  1. +------------+----------------+
  2. | id_alt | int(11) | // ID
  3. | color | int(4) | // ID koloru z poprzedniej tabeli
  4. | a_range | enum('0', '1') | // 0 - NCS, 1 - Pantone
  5. | alternativ | tinytext | // wartość
  6. | a_rating | int(1) | // wartość
  7. +------------+----------------+

Czy dobrze myślę?

Bo jak mam pobrać dane kolorów alternatywnych? Z dwu tabel nie miałbym problemu, ale z jednej? Jak mam rozróżnić dane NCS i Pantone?

Jakoś poradziłem sobie, ale mam kolejny problem. Otrzymuję taką tablicę:
  1. [alterna] => Array (
  2. [0] => 4525 C
  3. [1] => 2020-Y
  4. [2] => 2020-G90Y
  5. [3] => 5855 C
  6. [4] => 4535 C
  7. [5] => 2020-G80Y
  8. [6] => 7502 C
  9. [7] => 2020-Y10R
  10. )
  11. [range] => Array (
  12. [0] => 1
  13. [1] => 0
  14. [2] => 0
  15. [3] => 1
  16. [4] => 1
  17. [5] => 0
  18. [6] => 1
  19. [7] => 0
  20. )

Chciałbym to upakować tak:
  1. +-----------+-----------+
  2. | NCS 1950: | 2020-Y |
  3. | | 2020-G90Y |
  4. | | 2020-G80Y |
  5. | | 2020-Y10R |
  6. | Pantone: | 4525 C |
  7. | | 5855 C |
  8. | | 4535 C |
  9. | | 7502 C |
  10. +-----------+-----------+

Czyli w jednej komórce range[0] a w drugiej range[1].
Podpowie jakaś mądra głowa?

Napisany przez: trueblue 4.02.2018, 21:53:45

Najlepiej by było gdybyś rozbił to na 3 tabele w MySQL.

Tabela kolor:
id_kolor
nazwa ew. tu już reprezentacja hex, abyś w razie czego wiedział jakiego faktycznie koloru dotyczy id_kolor gdybyś przeglądał tabelę ręcznie

Tabela typ_koloru:
id_typ_koloru
id_kolor (klucz obcy)
reprezentacja_koloru (RAL, Pantone, HEX, RGB)

Tabela wartosc_koloru:
id_typ_koloru (klucz obcy)
wartosc

W tabeli typ_koloru ostania kolumna może być type ENUM (tak jak tu) lub kluczem obcym do tabeli stricte reprezentującej... reprezentacje. Gdyby doszła nowa reprezentacja nie musisz modyfikować pola ENUM tylko dodać ją w tej dodatkowej tabeli.


Napisany przez: Kshyhoo 4.02.2018, 22:03:14

No mam tak prawie, mam 2 tabele, pierwszą z tymi danymi + RAL, w drugiej alternatywy do RAL, gdzie enum to reprezentacja NCS/Pantone. Uporałem się z pobraniem danych i właśnie stoję na etapie wklepywania w tabele HTML. Niestety, moja wiedza nie pozwala mi na szaleństwa...

Napisany przez: trueblue 4.02.2018, 22:12:23

Jeśli jesteś w stanie wyświetlić swoje dane w ten sposób:

  1. +-----------+-----------+
  2. | NCS 1950: | 2020-Y |
  3. | NCS 1950: | 2020-G90Y |
  4. | NCS 1950: | 2020-G80Y |
  5. | NCS 1950: | 2020-Y10R |
  6. | Pantone: | 4525 C |
  7. | Pantone: | 5855 C |
  8. | Pantone: | 4535 C |
  9. | Pantone: | 7502 C |
  10. +-----------+-----------+
,
to jesteś bliski rozwiązania. Wystarczy, że będziesz sprawdzał czy reprezentacja w danym wierszu jest takim jak poprzedni, jeśli inna to ją wyświetlasz, jeśli nie, to nie wyświetlasz.

1. $poprzednia = '';
2. Dla każdego wiersza:
3. Jeśli $aktualna!=$poprzednia, to $poprzednia=$aktualna i druk $aktualna.
4. Druk wartości.
5. Wróć do 2.

Napisany przez: Kshyhoo 4.02.2018, 22:17:01

No właśnie nie wiem, jak tą tablicę rozdzielić, czyli range[0] i range[1] osobno.

Napisany przez: trueblue 4.02.2018, 22:25:59

A nie możesz mieć zamiast tych dwóch tablic w PHP jednej?

Kod
[0] => array([0] => '2020-Y')
[1] => array([0] => '2020-G90Y')
[2] => array([1] => '4525 C')
...

W ten sposób klucz jest reprezentacją, a wartość wartością koloru.

Napisany przez: Kshyhoo 4.02.2018, 22:31:02

Nie zgadniesz, ile czasu zajęło mi pobranie do tej postaci smile.gif

  1. ..GROUP_CONCAT(a.alternativ ORDER BY a.id_alt ASC SEPARATOR '|') ALETNATIVS,...

Potem robię z tego tablicę:
  1. $alternativs = http://www.php.net/explode('|', $row['ALETNATIVS']);
  2. foreach ($alternativs as $alternativ) {
  3. $colors[$cid]['alternativs'][] = $alternativ;
  4. }
  5. $aranges = http://www.php.net/explode('|', $row['ARANGES']);
  6. foreach ($aranges as $arange) {
  7. $colors[$cid]['aranges'][] = $arange;
  8. }
  9. $aratings = http://www.php.net/explode('|', $row['ARATINGS']);
  10. foreach ($aratings as $arating) {
  11. $colors[$cid]['aratings'][] = $arating;
  12. }

A ja wklepać to w jedną?

Napisany przez: trueblue 4.02.2018, 22:44:26

A nie lepiej takie zapytanie?

  1. SELECT a_range, alternativ FROM tabela WHERE id_alt=1 ORDER BY a_range

Każdy rekord będzie stanowił właśnie reprezentację i wartość.

Napisany przez: Kshyhoo 4.02.2018, 22:48:47

No tak było na początku, ale nie umiałem tego wklepać w tabele HTML.

Napisany przez: trueblue 4.02.2018, 22:52:02

To wróć do tego i zerknij w mój post #19.

Napisany przez: Kshyhoo 4.02.2018, 22:53:48

No to mam 2 osobne zapytania robić?

Napisany przez: trueblue 4.02.2018, 22:55:20

Jedno, takie jak podałem wyżej.

Napisany przez: Kshyhoo 4.02.2018, 22:58:00

Ale to mi nie pobierze danych z pierwszej tabeli...

Napisany przez: trueblue 5.02.2018, 08:18:18

Dodałeś drugą tabelę, ale dane masz nadal w postaci skumulowanej w pierwszej tabeli?

Napisany przez: Kshyhoo 5.02.2018, 09:39:58

Nie, mam dwie tabele...

Napisany przez: trueblue 5.02.2018, 09:45:37

Pokaż strukturę drugiej tabeli. Wydaje mi się, że pokazywałeś tylko jedną.

Napisany przez: Kshyhoo 6.02.2018, 20:40:12

Potem przerzucilem do drugiej tabeli dane dla alternatywnych kolorów. Pokażę, jak wrócę do domu...

  1. Nazwa Typ
  2. ------------------------------
  3. id_col int(11)
  4. ral smallint(4)
  5. c_r char(3)
  6. c_g char(3)
  7. c_b char(3)
  8. c_hex char(6)
  9.  
  10. Nazwa Typ
  11. -----------------------------
  12. id_alt int(11)
  13. color int(4)
  14. alternativ tinytext
  15. a_range enum('0', '1')
  16. a_rating int(1)

Pobieram to tak:
  1. SELECT
  2. GROUP_CONCAT(a.alternativ ORDER BY a.id_alt ASC SEPARATOR '|') ALETNATIVS,
  3. GROUP_CONCAT(a.a_range ORDER BY a.id_alt ASC SEPARATOR '|') ARANGES,
  4. GROUP_CONCAT(a.a_rating ORDER BY a.id_alt ASC SEPARATOR '|') ARATINGS,
  5. c.id_col CID, c.ral CRAL, c.c_r CR, c.c_g CG, c.c_b CB, c.c_hex CHEX,
  6. a.id_alt, a.color
  7. FROM color c
  8. LEFT JOIN alterna a ON a.color = c.id_col
  9. GROUP BY c.id_col
  10. ORDER BY c.id_col ASC

I otrzymuję tablicę.

Jakiś pomysł?

Napisany przez: trueblue 6.02.2018, 20:50:41

Najlepiej by było abyś zmienił strukturę bazy/tabel.

Pokaż jaki wynik daje:

  1. SELECT c.id_col CID, c.ral CRAL, c.c_r CR, c.c_g CG, c.c_b CB, c.c_hex CHEX, a.alternativ, a.a_range, a.a_rating, a.id_alt, a.color
  2. FROM color c
  3. LEFT JOIN alterna a ON a.color = c.id_col
  4. WHERE c.id_col=XXX
  5. ORDER BY a.id_alt


Napisany przez: Kshyhoo 6.02.2018, 21:06:34

Cytat
#1054 - Nieznana kolumna 'XXX' w where clause

Ale jeżeli podstawię pod xxx jakiś kolor np. 1000, daje pusty wynik.

Cytat(trueblue @ 6.02.2018, 20:50:41 ) *
Najlepiej by było abyś zmienił strukturę bazy/tabel.

Szukałem informacji, jak zbudować taką bazę, ale nic nie znalazłem...

Napisany przez: trueblue 6.02.2018, 21:12:17

Podstaw jakiekolwiek id, aby wybrało jeden kolor.

Podawałem Ci wcześniej strukturę tabel.

Napisany przez: Kshyhoo 6.02.2018, 21:18:49

To otrzymuję dane konkretnego koloru:

  1. CID CRAL CR CG CB CHEX alternativ a_range a_rating id_alt color
  2. 1 1000 190 189 127 BEBD7F 4525 C 1 4 1 1
  3. 1 1000 190 189 127 BEBD7F 2020-Y 0 4 2 1
  4. 1 1000 190 189 127 BEBD7F 2020-G90Y 0 2 3 1
  5. 1 1000 190 189 127 BEBD7F 5855 C 1 2 4 1
  6. 1 1000 190 189 127 BEBD7F 4535 C 1 2 5 1
  7. 1 1000 190 189 127 BEBD7F 2020-G80Y 0 1 6 1
  8. 1 1000 190 189 127 BEBD7F 7502 C 1 1 7 1
  9. 1 1000 190 189 127 BEBD7F 2020-Y10R 0 1 8 1


W http://forum.php.pl/index.php?showtopic=259269&view=findpost&p=1228583? Nie wszystko kumam.

Napisany przez: trueblue 6.02.2018, 21:23:20

Wystarczy, że posortujesz powyższe zapytanie według a_range, ew. drugiego, aby mieć jakąś (nie wiem co jest kluczem) kolejność dla wartości NCS i Pantone.

1. RAL masz od razu, drukujesz.
2. Przechodzisz do drugiego wiersza w komórce.
3. Sprawdzasz czy a_range jest 0 lub 1 i w zależności od tego drukujesz typ (NCS/Pantone).
4. Drukujesz obok wartość.
5. Przechodzisz do kolejnego wiersza.
6. Sprawdzasz czy a_range się zmieniło, jeśli tak, to drukujesz typ (NCS/Pantone).
7. Drukujesz obok wartość.
8. Masz tylko dwa typy a_range, więc drukujesz do końca wyniku.
9. RGB i HEX masz na wierzchu, więc drukujesz.

Napisany przez: Kshyhoo 6.02.2018, 21:27:39

W taj chwili mam tak:

  1. Nazwa Typ
  2. id_col int(11) ---------------
  3. ral smallint(4) |
  4. c_r char(3) |
  5. c_g char(3) |
  6. c_b char(3) |
  7. c_hex char(6) |
  8. l_pl tinytext |
  9. |
  10. Nazwa Typ |
  11. id_alt int(11) |
  12. color int(4) --------
  13. alternativ tinytext
  14. a_range enum('0', '1')
  15. a_rating int(1)


I po zapytaniu mam taką tablicę:
  1. Array (
  2. [1] => Array (
  3. [cral] => 1000
  4. [cr] => 190
  5. [cg] => 189
  6. [cb] => 127
  7. [chex] => BEBD7F
  8. [clpl] => beżowo-zielony
  9. [alternativs] => Array (
  10. [0] => 4525 C
  11. [1] => 2020-Y
  12. [2] => 2020-G90Y
  13. [3] => 5855 C
  14. [4] => 4535 C
  15. [5] => 2020-G80Y
  16. [6] => 7502 C
  17. [7] => 2020-Y10R
  18. )
  19. [aranges] => Array (
  20. [0] => 1
  21. [1] => 0
  22. [2] => 0
  23. [3] => 1
  24. [4] => 1
  25. [5] => 0
  26. [6] => 1
  27. [7] => 0
  28. )
  29. [aratings] => Array (
  30. [0] => 4
  31. [1] => 4
  32. [2] => 2
  33. [3] => 2
  34. [4] => 2
  35. [5] => 1
  36. [6] => 1
  37. [7] => 1
  38. )
  39. )
  40. )

Napisany przez: trueblue 6.02.2018, 21:34:55

Jeśli nie chcesz zmienić struktury na jaką podałem w poście #17, to zmień zapytanie, które podałem w poście #33 zgodnie ze wskazówkami w poście #37.

Napisany przez: Kshyhoo 6.02.2018, 21:37:06

No właśnie nie wszystko rozumiem w twojej propozycji struktury bazy.

Napisany przez: trueblue 6.02.2018, 21:45:13

To trochę jak głuchy telefon.

Jeśli nie chcesz zmienić struktury na jaką podałem w poście #17, to zmień zapytanie, które podałem w poście #33 zgodnie ze wskazówkami w poście #37.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)