RJWEBDESIGN - tvorba webových prezentací - Blogspot - PHP - Generovaní nejen fotbalové tabulky

RJWEBDESIGN - tvorba webových prezentací

Novinky

27.06.2010
Spoluvyvíjeli jsme aplikaci pro klienta České Dráhy. Aplikace je opět striktně soukromá, nelze uvést odkaz.

16.05.2010
Pro Vodafone jsme naprogramovali aplikaci, která vyhodnocuje interní statistiky. Vývoj trval 2 měsíce. Aplikace není veřejná, proto neuvádím odkaz.

08.03.2010
Nová firemní prezentace firmy AH Electronics s.r.o, k velké spokojenosti zákazníka se připravuje internetový obchod.

30.01.2010
Připraveno nové diskusní fórum. více

02.12.2009
Po několika měsících náročné práce jsem spustil herní portál GAMEWAY.CZ více


Něco málo o mé osobě

Je mi 28 let, bydlím v hlavním městě ČR. Webdesignem a programováním se zabývám již několik let. Pracuji jako programátor ve společnosti AndWeb s.r.o. Ovládám velmi dobře XHTML, CSS, PHP, MYSQL. Středně pokročilou znalost jQuery, 2D Grafika (Adobe Photoshop, SEO optimalizace.


Oblíbené stránky


Cizí krmivo


Přispívám a nechávam si poradit


Sport, sleduji, hraji


Reklama

Španělský fotbal - spanelskyfotbal.cz
Hlavní Logo

Poslední komentáře

  • RJ -

    [369] Když nebudeš vědět něco konkrétního, klidně se zeptej, ale neptej se na celý skript :)

  • Smoula -

    .. sak to ze si to len „vyjal“… neboj zaklady mam dobre len ma zaujala tvoja 2.varianta na mojej stranke mam tiez aktualizaciu vysledkov, len trosku zlozitejsiu…

    Ale ok.. idem sa potrapit :)

  • RJ -

    [367] Je to takový nástin, jak by to mohlo fungovat, vyjal jsem to jako torzo ze svého fotbalového webu.

    Pokud máš nějaké základy v PHP tak to dáš dokupy, pokud ne, tak se PHP nejdřív trošku nauč, stejně bys později nevěděl složitejší věci i kdybych Ti s tímto pomohl.

    :-)

  • Smoula -

    [366]

    Ahoj, mne sa paci ta 2.varianta – vytiahnes z DB aktualne zapasy, zadas vysledky a potom POSTnes, len nejako mi ten script nejde rozbehat :(

  • RJ -

    [365] Ano, samozřejmě. Jednotlivé inputy ponesou název pole. Tj.

    [code]

    A poté projdeš post POLE a uložíš

    foreach ($_POST[„gol1“] …)
    [/code]

Statistika

  • Článků celkem: 15
  • Komentářů celkem: 108

Blogspot » PHP » Generovaní nejen fotbalové tabulky

Generovaní nejen fotbalové tabulky

Neděle, 13 .Ledna 2008, 07:48, prečteno 2328x

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.

Způsob číslo 2

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.

Způsob číslo 3

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.

Hodnocení: Počet hlasů: 21

Komentáře

Fery [1] -reagovat- 26.09. 22:02 78.102.96.---

Zdravim, je ten 3. způsob funkční? Pokoušel jsem se ho s malými úpravy aplikovat a nějak se mi nedaří. Díky

Fery [2] -reagovat- 26.09. 22:12 78.102.96.---

Aha, jsem tupec, nic :)

Roman janko [3] -reagovat- 28.09. 20:21 89.176.35.---

[2] Fery Mel by byt funkcni, je to jeden z typu dotazu, ktere pouzivam na svych sportovnich webech. Urcite ale neslouzi k tomu, aby ho nekdo past do phpmyadminu a pak se divil ze nefunguje. Kazdy si ho musi „ohnout“ sam do sveho systemu, je to spise takove zamysleni a ukazka. Ale melo by to fungovat :)

Fery [4] -reagovat- 21.10. 17:53 94.112.87.---

Jj, funguje, udělal jsem tam školáckou chybu,nevypsal si mysql_error() a divil se jak puk, proč mi to nejde. Jinak díky, hodně mi pomohl tvůj příklad :)

kubyk [5] -reagovat- 07.01. 23:22 78.45.58.---

ale romane, jaktoze tam nenapises dik cloveku, kterej ti musel vysvetlit zaklady celyho tohodle procesu co? :) Jaktoze furt na tebe nekde narazim, at vlezu do jakykoliv diskuze, zase narazim na tebe :)

RJ [6] -reagovat- 08.01. 00:06 89.176.35.---

[5] kubyk Jakej kubyk? :) ( Znam 3× )

harry [7] -reagovat- 29.09. 15:39 62.24.75.---

Měl bych dotaz, dá se u toho posledního příkladu nějak omezit, aby to vypsalo můj tým (takže např. tým s id 1) a k tomu 3 týmy nad ním a 3 týmy pod ním? Díky

Kcko [8] -reagovat- 30.09. 10:19 62.168.38.---

[7] harry Samozrejme

Viz. http://eldragon.pesonline.cz/…il-tymu/4/1/

nebo http://www.pesonline.cz/…7/s-903/r-1/?…

Nejsnazsi reseni je v aplikacni vrstve (cili v PHP) , ulozit radky do pole kde je klicem id tymu , pote si zjistit jeho pozici a jednoduchymi podminkami zajistit aby se zobrazily tymy pod nim a nad nim, v pripade ze je posledni ci prvni tak pouze nad nim resp pod nim.

Vajtom [9] -reagovat- 24.06. 09:01 89.102.96.---

Zdravim, chtěl bych poprosit o pomoc, už mě nebaví ručně zapisovat do tabulek, byl by někdo ochoten mě spravit autonatickej zápis+odehrane zápasy, stále se mě to nedaří tak hledám pomoc, tady je ukazka tabulek NHL http://nhlsezonahraonline.717.cz/menu/uvod

Smoula [10] -reagovat- 15.07. 22:02 85.216.149.---

Ahoj, vedel by si pomoct zo zadavanim vysledkov na cele kolo nie po jednotlivych zapasoch?

Vyberies kolo → zapises vysledky naraz → INSERTnes table..
Ď.

RJ [11] -reagovat- 15.07. 23:28 78.102.194.---

[10] Smoula Ano, samozřejmě. Jednotlivé inputy ponesou název pole. Tj.

<input name=„gol1“ type=„text“/>A poté projdeš post POLE a uložíšforeach ($_POST[„gol1“] …)
Smoula [12] -reagovat- 16.07. 15:05 145.225.60.---

[11] RJ

Ahoj, mne sa paci ta 2.varianta – vytiahnes z DB aktualne zapasy, zadas vysledky a potom POSTnes, len nejako mi ten script nejde rozbehat :(

RJ [13] -reagovat- 17.07. 18:14 78.102.194.---

[12] Smoula Je to takový nástin, jak by to mohlo fungovat, vyjal jsem to jako torzo ze svého fotbalového webu.

Pokud máš nějaké základy v PHP tak to dáš dokupy, pokud ne, tak se PHP nejdřív trošku nauč, stejně bys později nevěděl složitejší věci i kdybych Ti s tímto pomohl.

:-)

Smoula [14] -reagovat- 17.07. 21:57 85.216.149.---

.. sak to ze si to len „vyjal“… neboj zaklady mam dobre len ma zaujala tvoja 2.varianta na mojej stranke mam tiez aktualizaciu vysledkov, len trosku zlozitejsiu…

Ale ok.. idem sa potrapit :)

RJ [15] -reagovat- 18.07. 13:58 78.102.194.---

[14] Smoula Když nebudeš vědět něco konkrétního, klidně se zeptej, ale neptej se na celý skript :)

Přidat komentář

Nový vzkaz

© 2005 - 2008 RJWEBDESIGN, všechna práva vyhrazena.
Nabízíme: Tvorba www stránek
Kontakt: telefony +420 777 856 657 | E-mail: admin@rjwebdesign.net
Spolupracujeme: Aria Studio, MXART Partnerské weby: Pesonline.cz, EuroFotbal.cz, SpanelskyFotbal.cz

© 2008 RJWEBDESIGN