Omezení buňek na řádek v tabulce (HTML a PHP)
Ahojte, řeším takový malý velký problém s tabulkami v HTML (a PHP). Naprogramoval jsem si v PHP polofunkční šmejd, který získá data z tabulky MySQL a "vytiskne" je jako tabulkový element v HTML. Pokud jsou v MySQL tabulce 2 nebo 3 záznamy, je formátování celkem únosné, kdyby tam bylo záznamů více, jak se dá řešit toto formátování?
Pro příklad: Mám v tabulce MySQL 6 záznamů které získám z databáze a chci zobrazit vždy 2 záznamy na jeden řádek. Jde to nějakým způsobem zařídit bez toho, abych musel naprogramovat třeba 20 switchů? Jak říkám, celý kód je v podstatě k ničemu, protože jsem musel získání dat uložit do funkce. Může mi někdo poradit jak tedy pořádně pracovat s daty z MySQL? Do funkcí jsem dal získání dat kvůli tomu, že nemůžu použít 2x u cyklu while mysqli_fetch_array.
Můj stávající PHP kód: pastebin.com
(Moc ten kód neřešte, stejně je celý úplně špatně ...)
Na závěr, vím, jsem hrozný programátor v PHP, ale s tímhle kódem se čtvu už od rána a pořád nic použitelného ...
Asi jsem nepochopil, o co se vlastně snažíš a jak to souvisí s tím kódem.
To je dost možné, primárně se snažím o to aby se vypsaly jenom dvě buňky na jeden řádek a ostatní na další řádky. S kódem to souvisí tak, že je to opravdu kód k ničemu a prakticky nepoužitelný, jestli nikdo neví jak to předělat ...
A v čem je problém? Prostě tag pro ukončení řádku vypíšeš jenom u sudých řádků (a na konci).
Tak jsem se dohrabal k tomuto. Nevím jestli jsem rozpoznávání sudých a lichých čísel pochopil správně, ale každopádně to stejně nefunguje, vypíše to prostě 3 buňky vedle sebe. Někde jsem tam nechal nějakou logickou chybu, ale nevím kde .
Děkuji, zase výplod mé dementní stránky, možná se na vás tady ale obrátím ještě jednou ...
Co takhle ukázka tabulky?
A jak by to pak mělo vypadat na webu?
Promiň, teď jsem na mobilu. Tabulka má jeden nadpis jako <th> a popis (asi 4 věty lorem ipsum) v <td>. Jinak ti to zatím nepopíšu.
Takže jestli to chapu by to pak melo být takhle?
th th
td td
th th
td td
th th
td td
Ano, jen nevím jak to co nejlépe z automatizovat. Nemůže mi někdo napsat menší příklad té funkce (třeba popis())? Už je to na mě trochu hodně.
Takže jsem skončil na tomto nehorázném prasokódu, ukamenujte mě za přetížené MySQL Servery! Budu se muset naučit pořádně pracovat s MySQL, poradí někdo nějaký dobrý článek?
Výsledný kód: pastebin.com
OT: Kdybych si najal programátora, a ten mi napsal tohle tak bych ho asi zbičoval ...
Asi ani netušíš jak velká je to prasárna:
- připojíš se k databázi
- znovu se připojíš k databázi
- načteš z tabulky všechny řádky
- každý z nich načteš ještě jednou
- poslední řádek pro jistotu i potřetí
Ano, v tom je ta sranda, trochu to ještě zredukuji, ale nic lepšího se svými znalostmi asi dohromady nedám. Za 2 dny, během kterých jsem tohle zkoušel metodou pokus omyl jsem rád alespoň za tuhle hovadinu ...
Žádné další znalosti nepotřebuješ, vždyť už tam všechno máš. Prostě tam nech jenom:
- připojíš se k databázi
- načteš z tabulky všechny řádky
A ostatní vyhoď.
Problém je v tom, že já netuším jak se třeba v tabulce vrátím znovu k prvnímu řádku. Jediné co jsem našel je, že si to mám uložit do pole, ale vždyť to už přece dělám? Navíc všechny řešení co jsem našel jsou v objektovém přístupu, taky velký problém když to dělám procedurálně. Ještě to vyspravím, protože je to pořád polofunkční a potom to zkusím udělat tak, jak říkáš. Už mi ten kód leze krkem ...
Proč se potřebuješ vrátit k prvnímu řádku?
Protože nejdříve vypisuji první dva nadpisy, poté se vrátím k prvnímu záznamu a vypíšu první dva popisy. Na konci téhle úlohy bude pointer na třetím řádku který se použije potom, zatím to řeším pomocí těch dotazů.
Nějak si nedokážu představit, proč to vůbec chceš udělat, ale dobře.
Já si to nedovedu představit jinak, schéma tady napsal Banshee, pokud to jde jinak, budu rád za jakoukoliv informaci. Jsem vůbec rád, že se tímto vůbec někdo zajímá
Všechno jde udělat jinak. Jaký má být účel toho všeho?
Tabulka produktů, nadpis (asi ho předělám na klasický <td>), kratší popisek a do celého tohohle bordelu ještě přidám obrázek. Aby toho nebylo málo tak celý tenhle cirkus načítám pomocí AJAXu, což má zase výhodu v tom, že uživatel může čučet na animované kolečko místo prázdné bílé stránky v prohlížeči.
A vážně chceš mít každý druhý řádek nadpis? To se pak skutečná data budou v té záplavě nadpisů ztrácet.
Produktů bude na stránku pár, maximálně počítám tak 5, další kategorie budou v jiné tabulce MySQL. Zvolení té tabulky asi nechám na parametru GET, problém bude ochrana proti SQL Injection, nevím jestli omezení pouze na příkaz SELECT (uživateli kterého mám ve scriptu) bude stačit. To bych musel nějak vykoumat, jako provizorní řešení je jeden skript pro každou tabulku, takže by to nebylo tak bezbranné.
Tak jsem něco zkusil, možná by to šlo i zjednodušit, ale v tuhle hodinu už mi to nemyslí.
PS: požíval jsem mysql místo toho mysqli
Na tohle asi platí text v tvém podpisu
Podařilo se mi ten prasokód udělat funkční. Zkusím si ten tvůj kód projít, jestli ho vůbec pochopím.
Funkční prasovýsledek: pastebin.com
P.S. Asi to víš, ale mysql je starší metoda, která neumožňuje používat všechny funkce MySQL 5, mysqli je MySQL Improved. Pro tenhle kód by v klidu stačila ta tvá
O MySQL Improved sem se dozvěděl kdžy jsem to viděl ve tvém kódu, zatím jsem to nepotřeboval, požívám jen základní dotazy.
Ale něco si o tom nastuduju
Ten muj kód uloží výsledek dotazu do pole, délka pole se vynásobí dvěma, aby for cyklus běžel 2x tak dlouho, protože řádků je 2x tolik co výsledků (řádek s nadpisy, řádek s popisy).. no asi by to šlo zjednodušit.
Mysqli je "novinka" od PHP 5, doporučuje se používat. Tvůj kód zkusím rovnou napíchnout na databázi, uvidíme co z toho vyleze, a možná to i pochopím. Ještě poznámka, $connect se dá upravit pro použití konkrétní databáze, prostě za heslo rovnou napíšeš jméno té databáze a select_db můžeš vypustit. K příkazu query musíš na začátek zase přiřadit $connect.
Fakt to funguje, děkuji. Pomalu i začínám chápat kód, i když pořád tápu v temnotě.
Na jednu věc jsem zapoměl.
Moc děkuji uživateli Banshee, celý kód odedřel za mě a já jsem ani nehnul prstem! Opravdu si vážím někoho, kdo dokáže něco takového.
Kód je 100% funkční, ale mohl bych mít tři otázky?
1. Když jsi si $radek uložil jako asociativní pole, jaký to má účel?
2. $radek je "pole v poli"?
3. Co se zjišťuje u modulo 4? Nevím co udělá modulo 4 ...
Když to shrnu, nechápu prakticky nic
Ještě jednou chci tedy poděkovat Banseemu, ale i Wikianovi který měl tu trpělivost mi vůbec odepisovat.
Téma je vyřešeno.
Modulo je zbytek po dělení. Modulo 4 je tedy zbytek po dělení čtyřmi.
Pokud postupně provádíš mod 4 na za sebou jdoucích číslech, tak ti neustále vychází 0, 1, 2, 3, 0, 1, 2, 3,...
Tohle jakš takš vím, ale děkuji, jde mi spíše o to, jakou to tam má funkci, ale teď to lépe pochopím. Děkuji
ad 1. pak při vypisování položek pole pak nepoužíváš číselné indexy ale jen názvy sloupců (požívám to raději protože pak nedojde k záměně údajů) mysql_fetch_array má zbytečně obojí jak číselné tak stringové indexy v poli a pole 2x tak velké
ad 2. ano, data jsou ve dvou dimensionálním poli (pole v poli)
ad 3. jednou za dva řádky (th th td td) tj. 4 elementy se sníží $k o 2 to protože:
pole je uspořádáno:
v tabulce potřebujeme indexy:
1.nadpis 2.nadpis
1.popis 2.popis
3.nadpis 4.nadpis
3.popis 4.popis
cyklus vypisuje řádek po řádku, buňku po buňce, my tedy potřebujeme indexy: 1 2 1 2 3 4 3 4 5 6 5 6...
ale $k se zvětšuje každým proběhnutím funkce o 1, tedy 1 2 3 4 5 6 7 8...
modulo 4 nám tedy zajistí $k-2 to co potřebujeme 1 2 "$k-2" 1 2 3 4 "$k-2" 3 4 5 6 "$k-2" 5 6 7 8...
Budu si to opravdu muset nechat projít hlavou, zajímalo mě hlavně to dvou-dimensionální pole, užitečná věc tohle. Díky za tvé odpovědi, snad jsem něco pochytal.