Publikováno v sekci PHP v Neděli 13.1.2008 - 19:48
V tomto článku si ukážeme jak generovat fotbalovou tabulku. S menšimi úpravami můžeme samozřejme generovat nejenom fotbalovou tabulku ale i tabulku z dalších sportovních odvětví.
if(isset($_POST['do'])) { if($_POST['b1']==$_POST['b2']) { //remiza mysql_query("UPDATE tabulka SET r=r+1, gf = gf+$_POST[b1], ga = ga+$_POST[b2], pz=pz+1, body=body+1 WHERE id = '$_POST[1]'"); //prvni mysql_query("UPDATE tabulka SET r=r+1, gf = gf+$_POST[b1], ga = ga+$_POST[b2], pz=pz+1, body=body+1 WHERE id = '$_POST[2]'"); //druhy } elseif($_POST['b1']<$_POST['b2']) { //vyhral b2 mysql_query("UPDATE tabulka SET p=p+1, gf = gf+$_POST[b1], ga = ga+$_POST[b2],pz=pz+1 WHERE id = '$_POST[1]'"); //prvni mysql_query("UPDATE tabulka SET v=v+1, gf = gf+$_POST[b2], ga = ga+$_POST[b1], pz=pz+1, body=body+3 WHERE id = '$_POST[2]'"); //druhy } elseif($_POST['b1']>$_POST['b2']) { //vyhral b1 mysql_query("UPDATE tabulka SET v=v+1, gf = gf+$_POST[b1], ga = ga+$_POST[b2], pz=pz+1, body=body+3 WHERE id = $_POST[1]"); //prvni mysql_query("UPDATE tabulka SET p=p+1, gf = gf+$_POST[b2], ga = ga+$_POST[b1], pz=pz+1 WHERE id = $_POST[2]"); //druhy } }
Výhodou: je velmi rychlý výběr z DB
Nevýhodou: může být oprava údajů. Budeme si muset vytvořit další formulář a zpracující skript, který by nám zpětně odmazal / upravil data. Je to spousty zbytečného skriptovaní navíc.
Tento způsob spočívá v tom, že si vytáhnem z databáze všechny odehrané zápasy, poukládáme si data do pole ( rozhodovacími mechanismy zjistíme kdo měl kolik výher, remíz, proher atd. ) a výsledné pole zapíšeme do databáze za jednotlivé týmy.
function reCount() { $sql = "SELECT d_tym, h_tym, d_goly, h_goly, kontumace, trest1, trest2 FROM vysledky WHERE schvaleno = 2 AND id_souteze = $this->soutezID"; $msql = mq($sql); if (mnr($msql)) { // inicializace $this->init(&$data); while ($r = mfo($msql)) { // nastaveni promennych $domaci = $r->d_tym; $hoste = $r->h_tym; $g1 = $r->d_goly; $g2 = $r->h_goly; $kontumace = $r->kontumace; $trest1 = $r->trest1; $trest2 = $r->trest2; // vypocet // domaci vyhrali if ($g1 > $g2 && $kontumace != 3) { // nastavime domaci $data[$domaci]["pz"]++; $data[$domaci]["v"]++; //$data[$domaci]["r"]++; //$data[$domaci]["p"]++; $data[$domaci]["gf"] += $g1; $data[$domaci]["ga"] += $g2; $data[$domaci]["pts"] += 3; $data[$domaci]["trest"] += $trest1; // nastavime hosty $data[$hoste]["pz"]++; //$data[$hoste]["v"]++; //$data[$hoste]["r"]++; $data[$hoste]["p"]++; $data[$hoste]["gf"] += $g2; $data[$hoste]["ga"] += $g1; //$data[$hoste]["pts"] += 3; $data[$hoste]["trest"] += $trest2; } // vyhrali hoste elseif ($g1 < $g2 && $kontumace != 3) { // nastavime domaci $data[$domaci]["pz"]++; //$data[$domaci]["v"]++; //$data[$domaci]["r"]++; $data[$domaci]["p"]++; $data[$domaci]["gf"] += $g1; $data[$domaci]["ga"] += $g2; //$data[$domaci]["pts"] += 3; $data[$domaci]["trest"] += $trest1; // nastavime hosty $data[$hoste]["pz"]++; $data[$hoste]["v"]++; //$data[$hoste]["r"]++; //$data[$hoste]["p"]++; $data[$hoste]["gf"] += $g2; $data[$hoste]["ga"] += $g1; $data[$hoste]["pts"] += 3; $data[$hoste]["trest"] += $trest2; } // remiza elseif ($g1 == $g2 && $kontumace != 3) { // nastavime domaci $data[$domaci]["pz"]++; //$data[$domaci]["v"]++; $data[$domaci]["r"]++; //$data[$domaci]["p"]++; $data[$domaci]["gf"] += $g1; $data[$domaci]["ga"] += $g2; $data[$domaci]["pts"] += 1; $data[$domaci]["trest"] += $trest1; // nastavime hosty $data[$hoste]["pz"]++; //$data[$hoste]["v"]++; $data[$hoste]["r"]++; //$data[$hoste]["p"]++; $data[$hoste]["gf"] += $g2; $data[$hoste]["ga"] += $g1; $data[$hoste]["pts"] += 1; $data[$hoste]["trest"] += $trest2; } // kontumace pro oba elseif ($g1 == $g2 && $kontumace == 3) { // nastavime domaci $data[$domaci]["pz"]++; //$data[$domaci]["v"]++; //$data[$domaci]["r"]++; $data[$domaci]["p"]++; $data[$domaci]["gf"] += 0; $data[$domaci]["ga"] += 3; //$data[$domaci]["pts"] += 1; $data[$domaci]["trest"] += $trest1; // nastavime hosty $data[$hoste]["pz"]++; //$data[$hoste]["v"]++; //$data[$hoste]["r"]++; $data[$hoste]["p"]++; $data[$hoste]["gf"] += 0; $data[$hoste]["ga"] += 3; //$data[$hoste]["pts"] += 1; $data[$hoste]["trest"] += $trest2; } } // while end } // numrows > 0 ? } function insertData($data) { if (is_array($data)) { foreach ($data as $tymID => $pole) { $ins = "INSERT INTO tabulka_poradi SET "; $ins .= " id_tymu = $tymID, kolo = $this->round, id_souteze = $this->soutezID, pz = '{$data[$tymID]["pz"]}', v = '{$data[$tymID]["v"]}', r = '{$data[$tymID]["r"]}', p = '{$data[$tymID]["p"]}', gf = '{$data[$tymID]["gf"]}', ga = '{$data[$tymID]["ga"]}', pts = '{$data[$tymID]["pts"]}', trest = '{$data[$tymID]["trest"]}' "; //echo $ins . "<br />"; $ins = mq($ins); //echo mysql_error(); } } }
Výhoda: pořád se jedná o velmi rychlý počin a pokud se stane , že bychom nějaký zápas zrušili nebo mu potřebovali upravit výsledek, není nic jednoduššího než tabulku z DB vymazat a znovu ji přegenerovat.
Nevýhoda: pokud se bude jednat o větší množství zápasů ( tisíce položek), netuším co to udělá s pamětí, může dojít k alokaci paměti a shození stránky. Ja jsem generovával vždy několik desítek či stovek zápasů a neměl jsem problém. Další nevýhodu vidím v tom, že pokud si budete chtít tabulku zobrazovat po jednotlivých kolech, budete Vám databáze nepřijemně narůstat.
Všechno za Vás vyreší databáze
SELECT ts.nazev, ts.seo_nazev, tym, SUM(W) + SUM(R) + SUM(P) as zapasy, SUM(W) as vyhry, SUM(R) as remizy, SUM(P) as prohry, SUM(G1) as goly_vstrelene, SUM(G2) as goly_obdrzene, SUM(G1) - SUM(G2) as rozdil, SUM(W) * 3 + SUM(R) * 1 as body FROM ( SELECT id_domaci AS tym, SUM( IF ( g1 > g2, 1, 0 ) ) AS W, SUM( IF ( g1 = g2, 1, 0 ) ) AS R, SUM( IF ( g1 < g2, 1, 0 ) ) AS P, SUM( g1 ) AS G1, SUM( g2 ) AS G2 FROM vysledky WHERE schvaleno = '1' AND kolo <= $kolo AND id_souteze = $soutez GROUP BY tym UNION ALL SELECT id_hoste AS tym, SUM( IF ( g1 < g2, 1, 0 ) ) AS W, SUM( IF ( g1 = g2, 1, 0 ) ) AS R, SUM( IF ( g1 > g2, 1, 0 ) ) AS P, SUM( g2 ) AS G1, SUM( g1 ) AS G2 FROM vysledky WHERE schvaleno = '1' AND kolo <= $kolo AND id_souteze = $soutez GROUP BY tym ) TMP JOIN seznam_tymu as ts ON ts.ID = TMP.tym GROUP BY tym ORDER BY body DESC, rozdil DESC, goly_vstrelene DESC, zapasy DESC, nazev ASC
Výhoda: vše reší tento náročnější SQL dotaz. Neni složitý, jen trošku delší na napsání. Tímto vykreslíme tabulku do konkretního kola a není problém si zobrazit údaje z jiného kola. Pokud potřebujeme opravit zápas, opravujeme ho pouze v konkretní tabulce zápasu a o výsledné zobrazení se nestaráme. Takže časová úspora je myslím zřejmá.
Nevýhoda: bude v tom, že se bude databázový server více namáhat, než kdyby pouze tahal připravená data. On je musí počítat, setřídit a předložit. Pokud tabulku dobře osázíte indexy a těch zápasů tam nebudou tisíce ( žiju v domnění, že zobrazujeme tabulku z konkretní sézony kde proběhlo pár desítek či stovek zápasů), tak se nemusíme bát. Mám ješte složitejší dotaz, pospojováno více tabulek dohromady a výsledky jsou velmi slušné, rychlost je vždy kolem 0,005 s.
Sami si zvolte způsob, který se Vám nejvíce líbí. Tento článek není návodem, který pomocí copy & paste uvedete v pochod. Pokud znáte jiný způsob generování, vyjádřete se do komentáře.
<input name="gol1" type="text"/>
A poté projdeš post POLE a uložíš
foreach ($_POST["gol1"] ...)