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:
+-------------------------+
| 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 |
+-----------+-------------+
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?
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
Kshyhoo
30.01.2018, 21:32:31
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;
Chodzi o to, że nie wiem jak pętlę spłodzić, żeby wyświetlić dane...
SmokAnalog
30.01.2018, 21:56:23
Pokaż jakąś swoją próbę uzyskania tego efektu.
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:
<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 echo $kolor['ral']; ?><br />
<?php echo $kolor['ncs']; ?><br />
<?php echo $kolor['pantone']; ?><br />
<?php echo $kolor['k_r']."-".$kolor['k_g']."-".$kolor['k_b'] ?><br />
<?php echo $kolor['k_hex']; ?> </td>
SmokAnalog
30.01.2018, 22:10:17
A NCS i Pantone jak se zapisujesz w bazie? Jak są pooddzielane?
Kshyhoo
30.01.2018, 22:13:58
W jednej komórce, w liniach, potem nl2br.
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
SmokAnalog
30.01.2018, 22:19:52
Oczywiście, że lepiej. Krzysiowa tabela jest źle zaprojektowana, zresztą baza danych również.
phpion
30.01.2018, 22:22:00
Ale co ma schemat bazy (bo zapewne to miałeś na myśli) do sposobu wyświetlania?
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...
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).
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.
Kshyhoo
31.01.2018, 07:04:34
Postanowiłem przenieść te dane do nowej tabeli. Będzie łatwiej ale i trudniej
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”
Kshyhoo
4.02.2018, 21:42:54
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ść
+------------+----------------+
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ę:
[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
)
Chciałbym to upakować tak:
+-----------+-----------+
| NCS 1950: | 2020-Y |
| | 2020-G90Y |
| | 2020-G80Y |
| | 2020-Y10R |
| Pantone: | 4525 C |
| | 5855 C |
| | 4535 C |
| | 7502 C |
+-----------+-----------+
Czyli w jednej komórce
range[0] a w drugiej
range[1].
Podpowie jakaś mądra głowa?
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.
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...
trueblue
4.02.2018, 22:12:23
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 |
+-----------+-----------+
,
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.
Kshyhoo
4.02.2018, 22:17:01
No właśnie nie wiem, jak tą tablicę rozdzielić, czyli range[0] i range[1] osobno.
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.
Kshyhoo
4.02.2018, 22:31:02
Nie zgadniesz, ile czasu zajęło mi pobranie do tej postaci

..GROUP_CONCAT(a.alternativ ORDER BY a.id_alt ASC SEPARATOR '|') ALETNATIVS,...
Potem robię z tego tablicę:
$alternativs = explode('|', $row['ALETNATIVS']); foreach ($alternativs as $alternativ) {
$colors[$cid]['alternativs'][] = $alternativ;
}
$aranges = explode('|', $row['ARANGES']); foreach ($aranges as $arange) {
$colors[$cid]['aranges'][] = $arange;
}
$aratings = explode('|', $row['ARATINGS']); foreach ($aratings as $arating) {
$colors[$cid]['aratings'][] = $arating;
}
A ja wklepać to w jedną?
trueblue
4.02.2018, 22:44:26
A nie lepiej takie zapytanie?
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ść.
Kshyhoo
4.02.2018, 22:48:47
No tak było na początku, ale nie umiałem tego wklepać w tabele HTML.
trueblue
4.02.2018, 22:52:02
To wróć do tego i zerknij w mój post #19.
Kshyhoo
4.02.2018, 22:53:48
No to mam 2 osobne zapytania robić?
trueblue
4.02.2018, 22:55:20
Jedno, takie jak podałem wyżej.
Kshyhoo
4.02.2018, 22:58:00
Ale to mi nie pobierze danych z pierwszej tabeli...
trueblue
5.02.2018, 08:18:18
Dodałeś drugą tabelę, ale dane masz nadal w postaci skumulowanej w pierwszej tabeli?
Kshyhoo
5.02.2018, 09:39:58
Nie, mam dwie tabele...
trueblue
5.02.2018, 09:45:37
Pokaż strukturę drugiej tabeli. Wydaje mi się, że pokazywałeś tylko jedną.
Kshyhoo
6.02.2018, 20:40:12
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)
Pobieram to tak:
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
I otrzymuję tablicę.
Jakiś pomysł?
trueblue
6.02.2018, 20:50:41
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
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...
trueblue
6.02.2018, 21:12:17
Podstaw jakiekolwiek id, aby wybrało jeden kolor.
Podawałem Ci wcześniej strukturę tabel.
Kshyhoo
6.02.2018, 21:18:49
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
W
tym poście? Nie wszystko kumam.
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.
Kshyhoo
6.02.2018, 21:27:39
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)
I po zapytaniu mam taką tablicę:
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
)
)
)
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.
Kshyhoo
6.02.2018, 21:37:06
No właśnie nie wszystko rozumiem w twojej propozycji struktury bazy.
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.
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.