Přidat otázku mezi oblíbenéZasílat nové odpovědi e-mailemVyřešeno 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 ... :x:

Předmět Autor Datum
Asi jsem nepochopil, o co se vlastně snažíš a jak to souvisí s tím kódem.
Wikan 26.04.2013 21:55
Wikan
:-D To je dost možné, primárně se snažím o to aby se vypsaly jenom dvě buňky na jeden řádek a ostatn…
albru123 26.04.2013 22:18
albru123
A v čem je problém? Prostě tag pro ukončení řádku vypíšeš jenom u sudých řádků (a na konci).
Wikan 26.04.2013 22:22
Wikan
Problém to možná není pro tebe, pro mě je to záhada hlavolamu. Zítra na to kouknu.
albru123 26.04.2013 22:45
albru123
Tak jsem se dohrabal k tomuto. Nevím jestli jsem rozpoznávání sudých a lichých čísel pochopil správn…
albru123 27.04.2013 15:51
albru123
while ($radek = mysqli_fetch_array($db_data)) { $i = 0;
Wikan 27.04.2013 17:57
Wikan
Děkuji, zase výplod mé dementní stránky, možná se na vás tady ale obrátím ještě jednou ... :-)
albru123 27.04.2013 19:15
albru123
Co takhle ukázka tabulky? A jak by to pak mělo vypadat na webu?
Banshee 26.04.2013 22:37
Banshee
Promiň, teď jsem na mobilu. Tabulka má jeden nadpis jako <th> a popis (asi 4 věty lorem ipsum) v <td…
albru123 26.04.2013 22:42
albru123
Takže jestli to chapu by to pak melo být takhle? th th td td th th td td th th td td
Banshee 26.04.2013 22:55
Banshee
Ano, jen nevím jak to co nejlépe z automatizovat. Nemůže mi někdo napsat menší příklad té funkce (tř…
albru123 27.04.2013 13:42
albru123
Takže jsem skončil na tomto nehorázném prasokódu, ukamenujte mě za přetížené MySQL Servery! Budu se…
albru123 27.04.2013 21:07
albru123
Asi ani netušíš jak velká je to prasárna: - připojíš se k databázi - znovu se připojíš k databázi -…
Wikan 27.04.2013 21:16
Wikan
Ano, v tom je ta sranda, trochu to ještě zredukuji, ale nic lepšího se svými znalostmi asi dohromady…
albru123 27.04.2013 21:19
albru123
Žádné další znalosti nepotřebuješ, vždyť už tam všechno máš. Prostě tam nech jenom: - připojíš se k…
Wikan 27.04.2013 21:20
Wikan
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…
albru123 27.04.2013 21:29
albru123
Proč se potřebuješ vrátit k prvnímu řádku?
Wikan 27.04.2013 21:32
Wikan
Protože nejdříve vypisuji první dva nadpisy, poté se vrátím k prvnímu záznamu a vypíšu první dva pop…
albru123 27.04.2013 21:34
albru123
Nějak si nedokážu představit, proč to vůbec chceš udělat, ale dobře.
Wikan 27.04.2013 21:38
Wikan
Já si to nedovedu představit jinak, schéma tady napsal Banshee, pokud to jde jinak, budu rád za jako…
albru123 27.04.2013 21:45
albru123
Všechno jde udělat jinak. Jaký má být účel toho všeho?
Wikan 27.04.2013 21:52
Wikan
Tabulka produktů, nadpis (asi ho předělám na klasický <td>), kratší popisek a do celého tohohle bord…
albru123 27.04.2013 21:55
albru123
A vážně chceš mít každý druhý řádek nadpis? To se pak skutečná data budou v té záplavě nadpisů ztrác…
Wikan 27.04.2013 21:56
Wikan
Produktů bude na stránku pár, maximálně počítám tak 5, další kategorie budou v jiné tabulce MySQL. Z…
albru123 27.04.2013 21:59
albru123
Tak jsem něco zkusil, možná by to šlo i zjednodušit, ale v tuhle hodinu už mi to nemyslí. PS: požíva…
Banshee 27.04.2013 23:29
Banshee
Na tohle asi platí text v tvém podpisu :-D Podařilo se mi ten prasokód udělat funkční. Zkusím si ten…
albru123 28.04.2013 11:30
albru123
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á…
Banshee 28.04.2013 11:43
Banshee
Mysqli je "novinka" od PHP 5, doporučuje se používat. Tvůj kód zkusím rovnou napíchnout na databázi,…
albru123 28.04.2013 11:46
albru123
Fakt to funguje, děkuji. Pomalu i začínám chápat kód, i když pořád tápu v temnotě.
albru123 28.04.2013 11:52
albru123
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…
albru123 28.04.2013 20:21
albru123
Modulo je zbytek po dělení. Modulo 4 je tedy zbytek po dělení čtyřmi. Pokud postupně provádíš mod 4…
Wikan 28.04.2013 20:24
Wikan
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…
albru123 28.04.2013 20:27
albru123
ad 1. pak při vypisování položek pole pak nepoužíváš číselné indexy ale jen názvy sloupců (požívám t…
Banshee 28.04.2013 22:00
Banshee
Budu si to opravdu muset nechat projít hlavou, zajímalo mě hlavně to dvou-dimensionální pole, užiteč… poslední
albru123 29.04.2013 19:46
albru123

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 ...

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.

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

$connect = mysql_connect("127.0.0.1","jmeno","heslo" );
mysql_select_db("databaze", $connect);
$db_data = mysql_query('SELECT * FROM tabulka ORDER BY id');

$length=0;
$k=0;
while ($radek = mysql_fetch_assoc($db_data))
	{
	$pole[] = $radek;
	$length++;
	}

$x = $length;
if($x%2!=0)$x++;
$cell = $x*2;

echo '<table border="1"><tr>';
for($i=0;$i<$cell;$i++)
	{
	if($i%4<2 and $k<$length) echo "<th>".$pole[$k]['nazev'].$k."</th>";
	elseif($i%4>=2 and $k<$length) echo "<td>".$pole[$k]['popis'].$k."</td>";
	else echo"<td></td>";
	$k++;
	if($i%2==1) echo '</tr><tr>';
	if($i%4==1) $k=$k-2;
	}
echo '</tr></table>';

Na tohle asi platí text v tvém podpisu :-D
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.

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. 8-)

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:

1 (nadpis, popis) 
2 (nadpis, popis) 
3 (nadpis, popis)..

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...

Zpět do poradny Odpovědět na původní otázku Nahoru