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:
+-------------------------+ | NAGŁÓWEK | +-----------+-------------+ | RAL C: | 8028 | | NCS 1950: | ~8010-Y30R | | | ~8010-Y50R | | Pantone: | ~2322 C | | | ~7533 C | | | ~476 C | | | ~7554 C | | RGB | 078-059-049 | | HEX | 4E3B31 | +-----------+-------------+
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
CREATE TABLE `kolor` ( `id` int(11) NOT NULL AUTO_INCREMENT, `ral` smallint(4) NOT NULL, `ncs` tinytext NOT NULL, `pantone` text NOT NULL, `r` char(3) NOT NULL, `g` char(3) NOT NULL, `b` char(3) NOT NULL, `hex` char(6) NOT NULL, PRIMARY KEY (`id_kol`) ) ENGINE=MyISAM;
Pokaż jakąś swoją próbę uzyskania tego efektu.
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:
<td width="80px" style="text-align: right; border-right: hidden"> <b>RAL C:</b><br /> <b>NCS 1950:</b><br /> <b>Pantone:</b><br /> <b>RGB:</b><br /> <b>HEX:</b> </td> <td width="100px" style="text-align: left"> <?php http://www.php.net/echo $kolor['ral']; ?><br /> <?php http://www.php.net/echo $kolor['ncs']; ?><br /> <?php http://www.php.net/echo $kolor['pantone']; ?><br /> <?php http://www.php.net/echo $kolor['k_r']."-".$kolor['k_g']."-".$kolor['k_b'] ?><br /> <?php http://www.php.net/echo $kolor['k_hex']; ?> </td>
A NCS i Pantone jak se zapisujesz w bazie? Jak są pooddzielane?
W jednej komórce, w liniach, potem nl2br.
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
Oczywiście, że lepiej. Krzysiowa tabela jest źle zaprojektowana, zresztą baza danych również.
Ale co ma schemat bazy (bo zapewne to miałeś na myśli) do sposobu wyświetlania?
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).
@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.
Postanowiłem przenieść te dane do nowej tabeli. Będzie łatwiej ale i trudniej
Jak to kiedyś powiedział kolega gdy jechaliśmy tramwajem i zasugerował by wysiąść na dalszym przystanku: „tam dalej będzie bliżej”
Nie do końca wiem, jak mam zmienić bazę. Czy tak wystarczy?
+------------+----------------+ | id_alt | int(11) | // ID | color | int(4) | // ID koloru z poprzedniej tabeli | a_range | enum('0', '1') | // 0 - NCS, 1 - Pantone | alternativ | tinytext | // wartość | a_rating | int(1) | // wartość +------------+----------------+
[alterna] => Array ( [0] => 4525 C [1] => 2020-Y [2] => 2020-G90Y [3] => 5855 C [4] => 4535 C [5] => 2020-G80Y [6] => 7502 C [7] => 2020-Y10R ) [range] => Array ( [0] => 1 [1] => 0 [2] => 0 [3] => 1 [4] => 1 [5] => 0 [6] => 1 [7] => 0 )
+-----------+-----------+ | NCS 1950: | 2020-Y | | | 2020-G90Y | | | 2020-G80Y | | | 2020-Y10R | | Pantone: | 4525 C | | | 5855 C | | | 4535 C | | | 7502 C | +-----------+-----------+
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.
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...
Jeśli jesteś w stanie wyświetlić swoje dane w ten sposób:
,
+-----------+-----------+ | NCS 1950: | 2020-Y | | NCS 1950: | 2020-G90Y | | NCS 1950: | 2020-G80Y | | NCS 1950: | 2020-Y10R | | Pantone: | 4525 C | | Pantone: | 5855 C | | Pantone: | 4535 C | | Pantone: | 7502 C | +-----------+-----------+
No właśnie nie wiem, jak tą tablicę rozdzielić, czyli range[0] i range[1] osobno.
A nie możesz mieć zamiast tych dwóch tablic w PHP jednej?
Nie zgadniesz, ile czasu zajęło mi pobranie do tej postaci
..GROUP_CONCAT(a.alternativ ORDER BY a.id_alt ASC SEPARATOR '|') ALETNATIVS,...
$alternativs = http://www.php.net/explode('|', $row['ALETNATIVS']); foreach ($alternativs as $alternativ) { $colors[$cid]['alternativs'][] = $alternativ; } $aranges = http://www.php.net/explode('|', $row['ARANGES']); foreach ($aranges as $arange) { $colors[$cid]['aranges'][] = $arange; } $aratings = http://www.php.net/explode('|', $row['ARATINGS']); foreach ($aratings as $arating) { $colors[$cid]['aratings'][] = $arating; }
A nie lepiej takie zapytanie?
SELECT a_range, alternativ FROM tabela WHERE id_alt=1 ORDER BY a_range
No tak było na początku, ale nie umiałem tego wklepać w tabele HTML.
To wróć do tego i zerknij w mój post #19.
No to mam 2 osobne zapytania robić?
Jedno, takie jak podałem wyżej.
Ale to mi nie pobierze danych z pierwszej tabeli...
Dodałeś drugą tabelę, ale dane masz nadal w postaci skumulowanej w pierwszej tabeli?
Nie, mam dwie tabele...
Pokaż strukturę drugiej tabeli. Wydaje mi się, że pokazywałeś tylko jedną.
Potem przerzucilem do drugiej tabeli dane dla alternatywnych kolorów. Pokażę, jak wrócę do domu...
Nazwa Typ ------------------------------ id_col int(11) ral smallint(4) c_r char(3) c_g char(3) c_b char(3) c_hex char(6) Nazwa Typ ----------------------------- id_alt int(11) color int(4) alternativ tinytext a_range enum('0', '1') a_rating int(1)
SELECT GROUP_CONCAT(a.alternativ ORDER BY a.id_alt ASC SEPARATOR '|') ALETNATIVS, GROUP_CONCAT(a.a_range ORDER BY a.id_alt ASC SEPARATOR '|') ARANGES, GROUP_CONCAT(a.a_rating ORDER BY a.id_alt ASC SEPARATOR '|') ARATINGS, c.id_col CID, c.ral CRAL, c.c_r CR, c.c_g CG, c.c_b CB, c.c_hex CHEX, a.id_alt, a.color FROM color c LEFT JOIN alterna a ON a.color = c.id_col GROUP BY c.id_col ORDER BY c.id_col ASC
Najlepiej by było abyś zmienił strukturę bazy/tabel.
Pokaż jaki wynik daje:
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 FROM color c LEFT JOIN alterna a ON a.color = c.id_col WHERE c.id_col=XXX ORDER BY a.id_alt
Podstaw jakiekolwiek id, aby wybrało jeden kolor.
Podawałem Ci wcześniej strukturę tabel.
To otrzymuję dane konkretnego koloru:
CID CRAL CR CG CB CHEX alternativ a_range a_rating id_alt color 1 1000 190 189 127 BEBD7F 4525 C 1 4 1 1 1 1000 190 189 127 BEBD7F 2020-Y 0 4 2 1 1 1000 190 189 127 BEBD7F 2020-G90Y 0 2 3 1 1 1000 190 189 127 BEBD7F 5855 C 1 2 4 1 1 1000 190 189 127 BEBD7F 4535 C 1 2 5 1 1 1000 190 189 127 BEBD7F 2020-G80Y 0 1 6 1 1 1000 190 189 127 BEBD7F 7502 C 1 1 7 1 1 1000 190 189 127 BEBD7F 2020-Y10R 0 1 8 1
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.
W taj chwili mam tak:
Nazwa Typ id_col int(11) --------------- ral smallint(4) | c_r char(3) | c_g char(3) | c_b char(3) | c_hex char(6) | l_pl tinytext | | Nazwa Typ | id_alt int(11) | color int(4) -------- alternativ tinytext a_range enum('0', '1') a_rating int(1)
Array ( [1] => Array ( [cral] => 1000 [cr] => 190 [cg] => 189 [cb] => 127 [chex] => BEBD7F [clpl] => beżowo-zielony [alternativs] => Array ( [0] => 4525 C [1] => 2020-Y [2] => 2020-G90Y [3] => 5855 C [4] => 4535 C [5] => 2020-G80Y [6] => 7502 C [7] => 2020-Y10R ) [aranges] => Array ( [0] => 1 [1] => 0 [2] => 0 [3] => 1 [4] => 1 [5] => 0 [6] => 1 [7] => 0 ) [aratings] => Array ( [0] => 4 [1] => 4 [2] => 2 [3] => 2 [4] => 2 [5] => 1 [6] => 1 [7] => 1 ) ) )
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.
No właśnie nie wszystko rozumiem w twojej propozycji struktury bazy.
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)