Publikováno v sekci PHP v
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í.
1: if(isset($_POST['do'])) 2: {</p> 3: <pre><code>if($_POST['b1']==$_POST['b2']) { //remiza 4: 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 5: 6: 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 7: 8: } elseif($_POST['b1']<$_POST['b2']) { //vyhral b2</code></pre> 9: <p>mysql_query("UPDATE tabulka SET p=p+1, gf = gf+$_POST[b1], ga = ga+$_POST[b2],pz=pz+1 WHERE id = '$_POST[1]'"); //prvni</p> 10: <pre><code>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 11: 12: } elseif($_POST['b1']>$_POST['b2']) { //vyhral b1 13: 14: 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 15: 16: mysql_query("UPDATE tabulka SET p=p+1, gf = gf+$_POST[b2], ga = ga+$_POST[b1], pz=pz+1 WHERE id = $_POST[2]"); //druhy </code></pre> 17: <p>} 18: }
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.
1: </p> 2: <p>function reCount() 3: { 4: $sql = "SELECT d_tym, h_tym, d_goly, h_goly, kontumace, trest1, trest2 5: FROM vysledky 6: WHERE schvaleno = 2 7: AND id_souteze = $this->soutezID";</p> 8: <pre><code> $msql = mq($sql); 9: if (mnr($msql)) 10: { 11: // inicializace 12: $this->init(&$data); 13: 14: while ($r = mfo($msql)) 15: { 16: // nastaveni promennych 17: $domaci = $r->d_tym; 18: $hoste = $r->h_tym; 19: $g1 = $r->d_goly; 20: $g2 = $r->h_goly; 21: $kontumace = $r->kontumace; 22: $trest1 = $r->trest1; 23: $trest2 = $r->trest2; 24: 25: // vypocet 26: 27: // domaci vyhrali 28: if ($g1 > $g2 && $kontumace != 3) 29: { 30: // nastavime domaci 31: $data[$domaci]["pz"]++; 32: $data[$domaci]["v"]++; 33: //$data[$domaci]["r"]++; 34: //$data[$domaci]["p"]++; 35: $data[$domaci]["gf"] += $g1; 36: $data[$domaci]["ga"] += $g2; 37: $data[$domaci]["pts"] += 3; 38: $data[$domaci]["trest"] += $trest1; 39: 40: // nastavime hosty 41: $data[$hoste]["pz"]++; 42: //$data[$hoste]["v"]++; 43: //$data[$hoste]["r"]++; 44: $data[$hoste]["p"]++; 45: $data[$hoste]["gf"] += $g2; 46: $data[$hoste]["ga"] += $g1; 47: //$data[$hoste]["pts"] += 3; 48: $data[$hoste]["trest"] += $trest2; 49: 50: } 51: // vyhrali hoste 52: elseif ($g1 < $g2 && $kontumace != 3) 53: { 54: // nastavime domaci 55: $data[$domaci]["pz"]++; 56: //$data[$domaci]["v"]++; 57: //$data[$domaci]["r"]++; 58: $data[$domaci]["p"]++; 59: $data[$domaci]["gf"] += $g1; 60: $data[$domaci]["ga"] += $g2; 61: //$data[$domaci]["pts"] += 3; 62: $data[$domaci]["trest"] += $trest1; 63: 64: // nastavime hosty 65: $data[$hoste]["pz"]++; 66: $data[$hoste]["v"]++; 67: //$data[$hoste]["r"]++; 68: //$data[$hoste]["p"]++; 69: $data[$hoste]["gf"] += $g2; 70: $data[$hoste]["ga"] += $g1; 71: $data[$hoste]["pts"] += 3; 72: $data[$hoste]["trest"] += $trest2; 73: } 74: // remiza 75: elseif ($g1 == $g2 && $kontumace != 3) 76: { 77: // nastavime domaci 78: $data[$domaci]["pz"]++; 79: //$data[$domaci]["v"]++; 80: $data[$domaci]["r"]++; 81: //$data[$domaci]["p"]++; 82: $data[$domaci]["gf"] += $g1; 83: $data[$domaci]["ga"] += $g2; 84: $data[$domaci]["pts"] += 1; 85: $data[$domaci]["trest"] += $trest1; 86: 87: // nastavime hosty 88: $data[$hoste]["pz"]++; 89: //$data[$hoste]["v"]++; 90: $data[$hoste]["r"]++; 91: //$data[$hoste]["p"]++; 92: $data[$hoste]["gf"] += $g2; 93: $data[$hoste]["ga"] += $g1; 94: $data[$hoste]["pts"] += 1; 95: $data[$hoste]["trest"] += $trest2; 96: } 97: // kontumace pro oba 98: elseif ($g1 == $g2 && $kontumace == 3) 99: { 100: // nastavime domaci 101: $data[$domaci]["pz"]++; 102: //$data[$domaci]["v"]++; 103: //$data[$domaci]["r"]++; 104: $data[$domaci]["p"]++; 105: $data[$domaci]["gf"] += 0; 106: $data[$domaci]["ga"] += 3; 107: //$data[$domaci]["pts"] += 1; 108: $data[$domaci]["trest"] += $trest1; 109: 110: // nastavime hosty 111: $data[$hoste]["pz"]++; 112: //$data[$hoste]["v"]++; 113: //$data[$hoste]["r"]++; 114: $data[$hoste]["p"]++; 115: $data[$hoste]["gf"] += 0; 116: $data[$hoste]["ga"] += 3; 117: //$data[$hoste]["pts"] += 1; 118: $data[$hoste]["trest"] += $trest2; 119: } 120: 121: } // while end 122: } // numrows > 0 ?</code></pre> 123: <p>} </p> 124: <p>function insertData($data) 125: { 126: if (is_array($data)) 127: { 128: foreach ($data as $tymID => $pole) 129: { 130: $ins = "INSERT INTO tabulka_poradi SET "; 131: $ins .= " id_tymu = $tymID, 132: kolo = $this->round, 133: id_souteze = $this->soutezID, 134: pz = '{$data[$tymID]["pz"]}', 135: v = '{$data[$tymID]["v"]}', 136: r = '{$data[$tymID]["r"]}', 137: p = '{$data[$tymID]["p"]}', 138: gf = '{$data[$tymID]["gf"]}', 139: ga = '{$data[$tymID]["ga"]}', 140: pts = '{$data[$tymID]["pts"]}', 141: trest = '{$data[$tymID]["trest"]}' 142: ";</p> 143: <pre><code> //echo $ins . "<br />"; 144: $ins = mq($ins); 145: //echo mysql_error(); 146: } 147: }</code></pre> 148: <p>}
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
1: SELECT 2: ts.nazev, ts.seo_nazev, 3: tym, 4: SUM(W) + SUM(R) + SUM(P) as zapasy, 5: SUM(W) as vyhry, 6: SUM(R) as remizy, 7: SUM(P) as prohry, 8: SUM(G1) as goly_vstrelene, 9: SUM(G2) as goly_obdrzene, 10: SUM(G1) - SUM(G2) as rozdil, 11: SUM(W) * 3 + SUM(R) * 1 as body 12: 13: FROM 14: 15: ( 16: 17: SELECT id_domaci AS tym, SUM( 18: IF ( 19: g1 > g2, 1, 0 20: ) ) AS W, SUM( 21: IF ( 22: g1 = g2, 1, 0 23: ) ) AS R, SUM( 24: IF ( 25: g1 < g2, 1, 0 26: ) ) AS P, SUM( g1 ) AS G1, SUM( g2 ) AS G2 27: FROM vysledky 28: WHERE schvaleno = '1' 29: AND kolo <= $kolo 30: AND id_souteze = $soutez 31: GROUP BY tym 32: 33: UNION ALL 34: 35: SELECT id_hoste AS tym, SUM( 36: IF ( 37: g1 < g2, 1, 0 38: ) ) AS W, SUM( 39: IF ( 40: g1 = g2, 1, 0 41: ) ) AS R, SUM( 42: IF ( 43: g1 > g2, 1, 0 44: ) ) AS P, SUM( g2 ) AS G1, SUM( g1 ) AS G2 45: FROM vysledky 46: WHERE schvaleno = '1' 47: AND kolo <= $kolo 48: AND id_souteze = $soutez 49: GROUP BY tym 50: 51: ) TMP 52: 53: JOIN seznam_tymu as ts 54: ON ts.ID = TMP.tym 55: GROUP BY tym 56: 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.