Tulostan jälleen kerran hevosten kilpailutuloksia kilpailut nimisestä taulusta. Ongelmana on, että haluaisin tulostaa kilpailut iän mukaan. Kilpailut taulu näyttää tältä:
- kilpailut
- id
- hevos_id (= linkitys hevoset -tauluun)
- pvm (= kisapäivä)
- ika (= hevosen ikä kilpailupäivänä, yksinkertainen numero, esim. 2)
- paikka
- laji (= ravi, este, koulu)
- jaos
- lahto (= ravilähtö)
- sija (= hevosen sijoitus kisoissa)
- osallistujat (= osallistujien kokonaismäärä lähdössä)
- muuta (= sisältää ravihevosilla ajan)
- voittosumma (voitettu rahasumma numerona, ei € mukana)
Tarkoitus siis tulostaa vuodet, jolta hevosella on kisoja. 8-vuotiaalla hevosella voi olla tuloksia esimerkiksi 2-, 3-, 5- ja 7-vuotiskausilta (ei siis kaikilta aina välttämättä). Ikäotsikkoa ei tulosteta jos tuloksia siltä vuodelta ei ole.
Kilpailukalenteri näyttää nyt tältä html-muodossa:
<table class="kilpailut"> <thead> <tr> <th class="tb1" width="20%">Kisapäivä/date</th> <th class="tb1" width="25%">Paikka/organizer</th> <th class="tb1" width="25%">Lähtö/race</th> <th class="tb1" width="10%">Sija/placing</th> <th class="tb1" width="20%">Muuta/other</th> </tr> <tr><th class="tb3" colspan="5">1-vuotias</th></tr> </thead> <tbody> <tr> <td class="tb2">1.1.2015</td> <td class="tb2">järjestäjä</td> <td class="tb2">lähtö (jaos)</td> <td class="tb2">0/0</td> <td class="tb2">aika, voittosumma</td> </tr> </tbody> <tr><th class="tb3" colspan="5">2-vuotias</th></tr> </thead> <tbody> <tr> <td class="tb2">1.1.2015</td> <td class="tb2">järjestäjä</td> <td class="tb2">lähtö (jaos)</td> <td class="tb2">0/0</td> <td class="tb2">aika, voittosumma</td> </tr> </tbody> </table>
Tältä näyttää tällähetkellä yksinkertainen tulostus ilman ikäluokkiin jakoa:
$kysely = $yhteys->prepare("SELECT *, DATE_FORMAT(pvm,'%d.%m.%Y') AS oikeapaiva FROM kilpailut WHERE hevos_id=? ORDER BY pvm DESC"); // suoritetaan kysely $kysely->execute(array($id)); while ($rivi = $kysely->fetch()) { echo "<tr>"; echo "<td class=\"tb2\">" . $rivi["oikeapaiva"] . "</td>"; echo "<td class=\"tb2\">" . $rivi["paikka"] . "</td>"; echo "<td class=\"tb2\">" $rivi["lahto"] . " (" . $rivi["jaos"] . ")</td>"; echo "<td class=\"tb2\">"; if ($rivi["sija"] <> 0) {echo $rivi["sija"] . "/" . $rivi["osallistujat"];} else {echo "hyll";} echo "</td>"; echo "<td class=\"tb2\">" . $rivi["muuta"]; if ($rivi["voittosumma"] <> 0) {echo ", " . number_format($rivi["voittosumma"], 2, '.', ',') . "€";} else {echo "";} echo "</td></tr>"; }
Hae tietokannasta ensisijaisesti suoraan lajiteltuna sen hevosen iän mukaan "ORDER BY ika, pvm DESC".
Sen jälkeen voit joka kierroksella tarkistaa onko hevosen ikä ollut tässä kilpailussa sama kuin edellisellä kerralla ja jos ei niin teet tarvittavat toimenpiteet. Eli jotenkin tähän tyyliin (en tarkistanut toimiiko):
$kysely = $yhteys->prepare("SELECT *, DATE_FORMAT(pvm,'%d.%m.%Y') AS oikeapaiva FROM kilpailut WHERE hevos_id=? ORDER BY ika, pvm DESC"); // suoritetaan kysely $kysely->execute(array($id)); echo "<tbody>"; while ($rivi = $kysely->fetch()) { if (!isset($ika) || (isset($ika) && $ika != $rivi["ika"])) { $ika = $rivi["ika"]; echo "<tr>"; echo "<th colspan='5'>" . $ika . "-vuotias</th>"; echo "<tr>"; } echo "<tr>"; echo "<td class=\"tb2\">" . $rivi["oikeapaiva"] . "</td>"; echo "<td class=\"tb2\">" . $rivi["paikka"] . "</td>"; echo "<td class=\"tb2\">" $rivi["lahto"] . " (" . $rivi["jaos"] . ")</td>"; echo "<td class=\"tb2\">"; echo ($rivi["sija"] <> 0) ? $rivi["sija"] . "/" . $rivi["osallistujat"] : "hyll"; echo "</td>"; echo "<td class=\"tb2\">" . $rivi["muuta"]; echo ($rivi["voittosumma"] <> 0) ? ", " . number_format($rivi["voittosumma"], 2, '.', ',') . "€" : ""; echo "</td></tr>"; } echo "</tbody>";
merlin kirjoitti:
ika (= hevosen ikä kilpailupäivänä, yksinkertainen numero, esim. 2)
Syntymäpäivän laittaminen, ja siitä laskeminen voisi olla järkevämpää.
p99o kirjoitti:
merlin kirjoitti:
ika (= hevosen ikä kilpailupäivänä, yksinkertainen numero, esim. 2)
Syntymäpäivän laittaminen, ja siitä laskeminen voisi olla järkevämpää.
Ja tämä syntypäivä siis hevostauluun, eikä kilpailutauluun. Tulostus ei mene rikki, koska ikä lasketaan kilpailupäivän mukaan, eikä nykyhetken mukaan. Tuollainen hevosen ikä on täysin turha kenttä.
Kiitokset kokeilen näitä huomenna ja palailen.
Ikä on sen takia, että hevoset eivät ikäänny tasaisesti. Syntymäpäivästä laskeminen ei toimi. Olisi tarkoitus jatkossa alkaa ikäännyttää heppoja tasaisesti, mutta sitten täytyisi eritellä vanhat ja uudet hepat. Nyt iän lisääminen tauluun on toiminut tosi hyvin :)
merlin kirjoitti:
Olisi tarkoitus jatkossa alkaa ikäännyttää heppoja tasaisesti
Se mitä itse olen biologiasta oppinut niin kaikki hevoset ikääntyvät aina tasaisesti, joka päivä ne ikääntyvät noin yhden päivän lisää. Joten hevosen iän laskeminen syntymäajasta ja kilpailupäivästä onnistuu takuuvarmasti.
Makumaku, Tämä ei ole tulossa oikeille hevosille käyttöön vaan virtuaalihevosille :) "pelissä" hevoset ikääntyvät usein monta virtuaalivuotta yhden reaalivuoden aikana. Mun hepat ikääntyy kisamenestyksen mukaan.
--
Kiitos AkeMake, sain tolla homman toimiin ihan täydellisesti :)!
uusia ongelmia
Minulla on stat.php, jossa koodi kerää hevoselle statistiikan sen kilpailutuloksista tällaiseen muotoon= 25:6-5-4-3-2
25 = kilpailut yhteensä
6 = voitot
5 = 2. sija
4 = 3. sija
3 = 4. sija
2 = 5. sija
Huonompia sijoja ei merkitä erikseen.
Hevosten sivuille tuon linkitän ensin perustietoihin yksinkertaisesti includella, tuo id on määritelty hevosen sivulla.
Haluaisinkin nyt tuon statistiikan esiintymään myös kahdessa muussa tapauksessa:
1. hevosen sivuille kisakalenteriin (joka yllä), joka ikävuosiluokan kisojen statistiikka esitetty kisakalenterissa vuosiotsikon rinnalla:
<table class="kilpailut"> <thead> <tr> <th class="tb1" width="20%">Kisapäivä/date</th> <th class="tb1" width="25%">Paikka/organizer</th> <th class="tb1" width="25%">Lähtö/race</th> <th class="tb1" width="10%">Sija/placing</th> <th class="tb1" width="20%">Muuta/other</th> </tr> <tr><th class="tb3" colspan="5">1-vuotias (TÄNNE STATISTIIKKA)</th></tr> </thead> ....
2. hevoslista.php nimiselle sivulle, johon listaan kaikki hevoset taulukkoon. Tällä hetkellä taulukko näyttää tältä:
hevosen nimi | rotu | sukupuoli | statistiikka | id, muokkaa
hevoslista.php taulukkokoodi:
<table> <thead> <tr><th class="tb3" colspan="5">Lämminveriset</td></tr> </thead> <tbody> <?php // valmistetaan kysely $kysely = $yhteys->prepare("SELECT id, nimi, koodinimi, rotu_lyhenne, rotu, sukupuoli, ika, kilpailutaso, kilpailumatka, rata FROM hevoset WHERE talli='ravi' AND kaytto='kisa' AND rotu_lyhenne IN ('lv', 'am-lv', 'ransk-lv', 'am-ransk-lv') ORDER BY rotu, ika"); // suoritetaan kysely $kysely->execute(array()); // näytetään kyselyn tulokset taulukossa // käsitellään tulostaulun rivit yksi kerrallaan while ($rivi = $kysely->fetch()) { echo "<tr><td class=\"tb2\"><strong><a href=\"horse2.php?name=" . $rivi["koodinimi"] . "\">" . $rivi["nimi"] . "</a></strong></td>"; echo "<td class=\"tb2\">" . $rivi["rotu"] . "</td>"; echo "<td class=\"tb2\">" . $rivi["sukupuoli"] . "</td>"; echo "<td class=\"tb2\">TÄNNE STATISTIIKKA</td>"; echo "<td class=\"tb2\">" . $rivi["id"] . ", <a href=\"http://waldorff.thefakepony.com/admin/muokkaa_ravi.php?name=" . $rivi["koodinimi"] . "\">muokkaa</a>" . "</td></tr>"; } ?> </tbody> </table>
Koodi näyttää teistä tällä hetkellä varmaan ihan kamalalta, mutta toimii mulla joten en ole jaksanut alkaa sitä siistimään tai muuttamaan.
stat.php:
// valmistetaan kysely $kysely = $yhteys->prepare("SELECT COUNT(sija) FROM kilpailut WHERE hevos_id=?;"); // suoritetaan kysely $kysely->execute(array($id)); // näytetään kyselyn tulokset taulukossa // käsitellään tulostaulun rivit yksi kerrallaan while ($rivi = $kysely->fetch()) { echo $rivi["COUNT(sija)"] . ":"; } // valmistetaan kysely $kysely = $yhteys->prepare("SELECT COUNT(sija) FROM kilpailut WHERE sija = '1' AND hevos_id=?;"); // suoritetaan kysely $kysely->execute(array($id)); // näytetään kyselyn tulokset taulukossa // käsitellään tulostaulun rivit yksi kerrallaan while ($rivi = $kysely->fetch()) { echo $rivi["COUNT(sija)"] . "-"; } // valmistetaan kysely $kysely = $yhteys->prepare("SELECT COUNT(sija) FROM kilpailut WHERE sija = '2' AND hevos_id=?;"); // suoritetaan kysely $kysely->execute(array($id)); // näytetään kyselyn tulokset taulukossa // käsitellään tulostaulun rivit yksi kerrallaan while ($rivi = $kysely->fetch()) { echo $rivi["COUNT(sija)"] . "-"; } // valmistetaan kysely $kysely = $yhteys->prepare("SELECT COUNT(sija) FROM kilpailut WHERE sija = '3' AND hevos_id=?;"); // suoritetaan kysely $kysely->execute(array($id)); // näytetään kyselyn tulokset taulukossa // käsitellään tulostaulun rivit yksi kerrallaan while ($rivi = $kysely->fetch()) { echo $rivi["COUNT(sija)"] . "-"; } // valmistetaan kysely $kysely = $yhteys->prepare("SELECT COUNT(sija) FROM kilpailut WHERE sija = '4' AND hevos_id=?;"); // suoritetaan kysely $kysely->execute(array($id)); // näytetään kyselyn tulokset taulukossa // käsitellään tulostaulun rivit yksi kerrallaan while ($rivi = $kysely->fetch()) { echo $rivi["COUNT(sija)"]; } // valmistetaan kysely $kysely = $yhteys->prepare("SELECT COUNT(sija) FROM kilpailut WHERE sija = '5' AND hevos_id=?;"); // suoritetaan kysely $kysely->execute(array($id)); // näytetään kyselyn tulokset taulukossa // käsitellään tulostaulun rivit yksi kerrallaan while ($rivi = $kysely->fetch()) { echo "-" . $rivi["COUNT(sija)"]; }
Ongelmana siis ilmeisesti include. Miten saisin tuon stat.php toimimaan myös listoissa, kun nyt omana itsenään se toimii hyvin kun se tulostetaan vain kerran yhden hevosen sivuille :P Määritin tuon hevos_idin kyllä molemmissa samaksi kuin hevostaulun id.
Edelliset ongelmat edelleen ratkaisematta ja jonkun takia tällainen uudelleenohjaus ei toimi? Onko väärällä sivulla (lomakkeenkäsittelijässä) vai mikä ongelma?
tiedosto.php
include("config.php"); ini_set("display_errors", 1); ini_set("error_reporting", E_ALL | E_STRICT); $kysely = $yhteys->prepare("SELECT koodinimi FROM hevoset WHERE koodinimi = ?"); $kysely->execute(array($_GET["name"])); $namet = $kysely->fetchAll(PDO::FETCH_COLUMN, 0); $nimi = $_GET["name"]; $kysely = $yhteys->prepare("SELECT id, koodinimi FROM hevoset WHERE koodinimi=?"); $kysely->execute(array($nimi)); while ($rivi = $kysely->fetch()) { $id = $rivi["id"] ; } if (get_magic_quotes_gpc()) { $process = array(&$_GET, &$_POST, &$_COOKIE, &$_REQUEST); while (list($key, $val) = each($process)) { foreach ($val as $k => $v) { unset($process[$key][$k]); if (is_array($v)) { $process[$key][stripslashes($k)] = $v; $process[] = &$process[$key][stripslashes($k)]; } else { $process[$key][stripslashes($k)] = stripslashes($v); } } } unset($process); } //avataan yhteys kantaan mysql_connect('hosti', 'käyttäjä', 'salasana'); mysql_query ("set character_set_client='utf8'"); mysql_select_db('taulu'); //syötetään tieto kantaan mysql_query("UPDATE hevoset SET nimi='".mysql_real_escape_string($_POST['nimi'])."', koodinimi='".mysql_real_escape_string($_POST['koodinimi'])."', rekisterinumero='".mysql_real_escape_string($_POST['rekisterinumero'])."', rotu='".mysql_real_escape_string($_POST['rotu'])."', rotu_lyhenne='".mysql_real_escape_string($_POST['rotu_lyhenne'])."', sukupuoli='".mysql_real_escape_string($_POST['sukupuoli'])."', sakakorkeus='".mysql_real_escape_string($_POST['sakakorkeus'])."', syntymaaika='".mysql_real_escape_string($_POST['syntymaaika'])."', syntymaaika_muu='".mysql_real_escape_string($_POST['syntymaaika_muu'])."', ika='".mysql_real_escape_string($_POST['ika'])."', vari='".mysql_real_escape_string($_POST['vari'])."', painotus='".mysql_real_escape_string($_POST['painotus'])."', kilpailutaso='".mysql_real_escape_string($_POST['kilpailutaso'])."', kilpailumatka='".mysql_real_escape_string($_POST['kilpailumatka'])."', kaytto='".mysql_real_escape_string($_POST['kaytto'])."', talli='".mysql_real_escape_string($_POST['talli'])."', rata='".mysql_real_escape_string($_POST['rata'])."', koulu='".mysql_real_escape_string($_POST['koulu'])."', este='".mysql_real_escape_string($_POST['este'])."', kentta='".mysql_real_escape_string($_POST['kentta'])."', valjakko='".mysql_real_escape_string($_POST['valjakko'])."', hunter='".mysql_real_escape_string($_POST['hunter'])."', equitation='".mysql_real_escape_string($_POST['equitation'])."', kasvattaja='".mysql_real_escape_string($_POST['kasvattaja'])."', maahantuoja='".mysql_real_escape_string($_POST['maahantuoja'])."', rotu_en='".mysql_real_escape_string($_POST['rotu_en'])."', vari_en='".mysql_real_escape_string($_POST['vari_en'])."', sakakorkeus_en='".mysql_real_escape_string($_POST['sakakorkeus_en'])."', luonne='".mysql_real_escape_string($_POST['luonne'])."', i='".mysql_real_escape_string($_POST['i'])."', i_l='".mysql_real_escape_string($_POST['i_l'])."', ii='".mysql_real_escape_string($_POST['ii'])."', ii_l='".mysql_real_escape_string($_POST['ii_l'])."', iii='".mysql_real_escape_string($_POST['iii'])."', iie='".mysql_real_escape_string($_POST['iie'])."', ie='".mysql_real_escape_string($_POST['ie'])."', ie_l='".mysql_real_escape_string($_POST['ie_l'])."', iei='".mysql_real_escape_string($_POST['iei'])."', iee='".mysql_real_escape_string($_POST['iee'])."', e='".mysql_real_escape_string($_POST['e'])."', e_l='".mysql_real_escape_string($_POST['e_l'])."', ei='".mysql_real_escape_string($_POST['ei'])."', ei_l='".mysql_real_escape_string($_POST['ei_l'])."', eii='".mysql_real_escape_string($_POST['eii'])."', eie='".mysql_real_escape_string($_POST['eie'])."', ee='".mysql_real_escape_string($_POST['ee'])."', ee_l='".mysql_real_escape_string($_POST['ee_l'])."', eei='".mysql_real_escape_string($_POST['eei'])."', eee='".mysql_real_escape_string($_POST['eee'])."', sukuselvitys='".mysql_real_escape_string($_POST['sukuselvitys'])."', copyt='".mysql_real_escape_string($_POST['copyt'])."', kuva1='".mysql_real_escape_string($_POST['kuva1'])."', kuva2='".mysql_real_escape_string($_POST['kuva2'])."', kuva3='".mysql_real_escape_string($_POST['kuva3'])."', kuva4='".mysql_real_escape_string($_POST['kuva4'])."', kuva5='".mysql_real_escape_string($_POST['kuva5'])."', jalostusinfo='".mysql_real_escape_string($_POST['jalostusinfo'])."' WHERE id='$id'"); header("Location: http://osoite.fi/sivu.php"); echo mysql_error();
Antaa errorin tosta tokavikasta rivistä, joka on toi header?
"Warning: Cannot modify header information - headers already sent by (output started at /home/.../tiedosto.php:2) in /home/.../tiedosto.php on line 112"
Grez, kiitos - olin taas tietenkin googlannut kaikella muulla kuin itse virhe-lauseella :P Toimii!
Vielä tuo stat.php tulostaminen noihin uusiin konteksteihin häikkää :/
Löytyisikö apua tohon statistiikan tulostamiseen apua :)?
Oliko se mihin tarvittiin apua siis seuraava:
merlin kirjoitti:
Ongelmana siis ilmeisesti include. Miten saisin tuon stat.php toimimaan myös listoissa, kun nyt omana itsenään se toimii hyvin kun se tulostetaan vain kerran yhden hevosen sivuille :P Määritin tuon hevos_idin kyllä molemmissa samaksi kuin hevostaulun id.
Siis millä tavalla se ei toimi? Virheilmoitus?
Luulisi tuon sinänsä toimivan missä vaan missä $yhteys ja $id on alustettu samalla tavalla.
Grez, en ole nyt varma mitä tarkoitat $yhteyden alustamisella, mutta ongelmana on se etten tiedä miten tuon statistiikan tulokset saisi tulostettua keskelle tuon toisen kyselyn tulosten tulostamista. (stat.php:ssä olevat kyselyt ja tulostukset keskelle alla olevaa kyselyä ja tulostusta, voisikohan vielä epäselvemmin selostaa?)
Edellinen yhteys, kysely ja tulostushan keskeytyy kun keskelle tungetaan ihan toiset systeemit, esimerkiksi jos laitan vaan pokkana ton includen tähän (TÄNNE STATISTIIKKA -kohtaan):
<table> <thead> <tr><th class="tb3" colspan="5">Lämminveriset</td></tr> </thead> <tbody> <?php // valmistetaan kysely $kysely = $yhteys->prepare("SELECT id, nimi, koodinimi, rotu_lyhenne, rotu, sukupuoli, ika, kilpailutaso, kilpailumatka, rata FROM hevoset WHERE talli='ravi' AND kaytto='kisa' AND rotu_lyhenne IN ('lv', 'am-lv', 'ransk-lv', 'am-ransk-lv') ORDER BY rotu, ika"); // suoritetaan kysely $kysely->execute(array()); // näytetään kyselyn tulokset taulukossa // käsitellään tulostaulun rivit yksi kerrallaan while ($rivi = $kysely->fetch()) { echo "<tr><td class=\"tb2\"><strong><a href=\"horse2.php?name=" . $rivi["koodinimi"] . "\">" . $rivi["nimi"] . "</a></strong></td>"; echo "<td class=\"tb2\">" . $rivi["rotu"] . "</td>"; echo "<td class=\"tb2\">" . $rivi["sukupuoli"] . "</td>"; echo "<td class=\"tb2\">TÄNNE STATISTIIKKA</td>"; echo "<td class=\"tb2\">" . $rivi["id"] . ", <a href=\"http://waldorff.thefakepony.com/admin/muokkaa_ravi.php?name=" . $rivi["koodinimi"] . "\">muokkaa</a>" . "</td></tr>"; } ?> </tbody> </table>
Toi stat.php täytyisi varmaan saada hoidettua yhdellä kyselyllä, niin sen voisi liittää helposti tohon yllä olevaan kyselyyn lisäämällä vaan toisen taulun, joissa idit on samat (id = hevos_id).
stat.php:
// valmistetaan kysely $kysely = $yhteys->prepare("SELECT COUNT(sija) FROM kilpailut WHERE hevos_id=?;"); // suoritetaan kysely $kysely->execute(array($id)); // näytetään kyselyn tulokset taulukossa // käsitellään tulostaulun rivit yksi kerrallaan while ($rivi = $kysely->fetch()) { echo $rivi["COUNT(sija)"] . ":"; } // valmistetaan kysely $kysely = $yhteys->prepare("SELECT COUNT(sija) FROM kilpailut WHERE sija = '1' AND hevos_id=?;"); // suoritetaan kysely $kysely->execute(array($id)); // näytetään kyselyn tulokset taulukossa // käsitellään tulostaulun rivit yksi kerrallaan while ($rivi = $kysely->fetch()) { echo $rivi["COUNT(sija)"] . "-"; } // valmistetaan kysely $kysely = $yhteys->prepare("SELECT COUNT(sija) FROM kilpailut WHERE sija = '2' AND hevos_id=?;"); // suoritetaan kysely $kysely->execute(array($id)); // näytetään kyselyn tulokset taulukossa // käsitellään tulostaulun rivit yksi kerrallaan while ($rivi = $kysely->fetch()) { echo $rivi["COUNT(sija)"] . "-"; } // valmistetaan kysely $kysely = $yhteys->prepare("SELECT COUNT(sija) FROM kilpailut WHERE sija = '3' AND hevos_id=?;"); // suoritetaan kysely $kysely->execute(array($id)); // näytetään kyselyn tulokset taulukossa // käsitellään tulostaulun rivit yksi kerrallaan while ($rivi = $kysely->fetch()) { echo $rivi["COUNT(sija)"] . "-"; } // valmistetaan kysely $kysely = $yhteys->prepare("SELECT COUNT(sija) FROM kilpailut WHERE sija = '4' AND hevos_id=?;"); // suoritetaan kysely $kysely->execute(array($id)); // näytetään kyselyn tulokset taulukossa // käsitellään tulostaulun rivit yksi kerrallaan while ($rivi = $kysely->fetch()) { echo $rivi["COUNT(sija)"]; } // valmistetaan kysely $kysely = $yhteys->prepare("SELECT COUNT(sija) FROM kilpailut WHERE sija = '5' AND hevos_id=?;"); // suoritetaan kysely $kysely->execute(array($id)); // näytetään kyselyn tulokset taulukossa // käsitellään tulostaulun rivit yksi kerrallaan while ($rivi = $kysely->fetch()) { echo "-" . $rivi["COUNT(sija)"]; }
Mä en alun alkaenkaan tajunnut, miksi väkisin halusit tehdä jokaisesta oman kyselynsä.
Ihan kuin nuo skriptit vaatisivat jo jonkin sortin oman funktion käyttöä. Toistoa on niin per... perusteellisesti.
Eli vinkkinä: jonkin sortin luuppi, joka kutsuu omaa funktiota.
The Alchemist, oon niin avuton, että toi on ainoa jonka sain itse väsättyä :D Olen koittanut minulle täällä aiemmin toiseen tarkoitukseen annettua koodia muokkailla haluamanilaiseksi. Tällä olen siis aiemmin tulostanut aina listan eri vuosien menestyksestä. Oon vaan niin yksinkertainen etten saa tätä muokattua kertomaan kaikkien vuosien yhteistä menestystä.
Nyt siis tulostaa:
2-vuotiskausi :: 15:1-2-3-4-5, 1000€
3-vuotiskausi :: 15:1-2-3-4-5, 1000€
4-vuotiskausi :: ei kisannut
5-vuotiskausi :: 15:1-2-3-4-5, 1000€
6-vuotiskausi :: ei kisannut
jne.
Lisäksi tuo tulostaa turhaan ne vuodet, jolloin ei ole kisannut - niitä ei tarvitsisi tulostaa.
//Haetaan sijoitukset ja voittosummat. Haetaan väh 2 vuoden ikäisenä. Ikää ei tarvitse rajoittaa ylhäältä koska hevonen tuskin on kilpaillut ikäänsä vanhempana $kysely = $yhteys->prepare('SELECT ika, COUNT(sija) AS kpl, SUM(voittosumma) AS summa FROM kilpailut WHERE hevos_id=? AND ika>=2 GROUP BY ika'); $kysely->execute(array($id)); //Kerätään tulokset taulukkoon while ($rivi = $kysely->fetch()) { $sijoituksia[$rivi['ika']] = $rivi['kpl']; $voittosummat[$rivi['ika']] = $rivi['summa']; } //Haetaan eritellyt sijoitukset sijoille 1-3 $kysely = $yhteys->prepare('SELECT ika, sija, COUNT(sija) AS kpl FROM kilpailut WHERE hevos_id=? AND ika>=2 AND sija<4 GROUP BY ika, sija'); $kysely->execute(array($id)); //Kerätään tulokset taulukkoon while ($rivi = $kysely->fetch()) { $sijoja[$rivi['ika']][$rivi['sija']] = $rivi['kpl']; } //Tulostetaan aiemmin taulukkoon kerätyt. Jos iälle ei ole lainkaan sijoituksia, tulostetaan "Ei sijoituksia" for ($vuosi = 2; $vuosi <= $ika; $vuosi++) { echo "<b>$vuosi-vuotiskausi</b> :: "; if (isset($sijoituksia[$vuosi])) { echo $sijoituksia[$vuosi] . ':'; //Näytetään sijataulukon tämän iän sijat 1-3 tai 0 jos arvoa ei ole. for ($i=1; $i<5; $i++) { echo ( isset($sijoja[$vuosi][$i]) ? $sijoja[$vuosi][$i] : 0 ) . '-'; } for ($i=5; $i<6; $i++) { echo ( isset($sijoja[$vuosi][$i]) ? $sijoja[$vuosi][$i] : 0 ); } echo ', ' . $voittosummat[$vuosi] . '€<br />'; } else { echo 'ei ole kilpaillut<br />'; } }
Lebe80, loopit on mulle hepreaa kuten yltä voi huomata. Ohjelmointiputkan oppaat on luettu pariinkin otteeseen, mutta itse en saa aloitettua mitään - valmiista saan kyllä vähän muokattua.
Kiitos kovasti kun jaksatte auttaa :)
Kantarakenne on pielessä ja mm. tämän takia koko systeemi on huono.
qeijo, miten kanta on huono - ei kovin tyhjentävä viesti :/?
Kilpailutaulussasi on hevos_id, eli tuon perusteella yhteen kilpailuun voi osallistua vain yksi hevonen. Oikea rakenne olisi luultavasti sellainen, että olisi yksi taulu itse kilpailusta ja yksi taulu osallistujista. Kilpailutaulussa olisivat siis kilpailun yleiset tiedot (id, nimi, paikka, aika), ja osallistujataulussa olisivat yksittäisiä osallistujia koskevat tiedot (kilpailu_id, hevonen_id, tulos, mahdollisesti myös sija, palkintosumma ynnä muuta).
Metabolix, onko tuo kantarakenne ongelmallinen vain sen takia että sama tieto kertaantuu? Vai onko joku toinenkin syy miksi kannattaisi jakaa kahteen eri tauluun? Tuon on vaan niin hankala (omasta mielestä :D) saada toimimaan tulosten lähetyksen ja tulostamisen kannalta verrattuna tähän. Toki jos joku saisi supernäppärän tulosten lisäämisen edes ideoitua niin voisin kyllä vielä kuvitella kannan rakennetta muuttavani!
Auttaisiko kannan muuttaminen tuossa statistiikassakin vai miksi tuo on nykyisellään niin iso ongelma :D?
Nythän siis tallennan hevosten kilpailutulokset kantaan hevoskohtaisesti. Ensin valitaan valikosta hevonen jolle kisa lisätään ja sitten syötetään niin monta kisaa kuin hevoselle on. Alunperin toimi paremmin näin päin, mutta nyt voisi toimia jo paremmin niin - että lisätään kisa kerrallaan kun monesti tuloksia lisätessä yhdelle hevoselle on tullut vain yksi uusi kisa (jatkuvaa lomakkeen uudelleenlähetystä).
uusikisa.php
<h1>Uusi kisa (ravi)</h1> <form method="post" action="tiedosto.php" onSubmit="submitonce(this)"> <p> <select size="1" name="id"> <?php // valmistetaan kysely $kysely = $yhteys->prepare("SELECT nimi, id FROM hevoset WHERE talli='ravi' ORDER BY nimi"); // suoritetaan kysely $kysely->execute(array()); // näytetään kyselyn tulokset taulukossa // käsitellään tulostaulun rivit yksi kerrallaan while ($rivi = $kysely->fetch()) { echo "<option value=\"" . $rivi["id"] . "\">" . $rivi["nimi"] . "</option>"; } ?> </select><br /> <textarea rows="30" cols="110" name="tiedot">ikä++alaisuus++0000-00-00++paikka++lähtö++sija++osallistujat++aika++voittosumma++pisteet</textarea></p> <input type="submit" name="submit" value="Lähetä kisoja" /> </form>
tiedosto.php (lomakkeenkäsittelijä)
if (get_magic_quotes_gpc()) { $process = array(&$_GET, &$_POST, &$_COOKIE, &$_REQUEST); while (list($key, $val) = each($process)) { foreach ($val as $k => $v) { unset($process[$key][$k]); if (is_array($v)) { $process[$key][stripslashes($k)] = $v; $process[] = &$process[$key][stripslashes($k)]; } else { $process[$key][stripslashes($k)] = stripslashes($v); } } } unset($process); } //avataan yhteys kantaan mysql_connect('hosti', 'käyttäjä', 'salasana'); mysql_query ("set character_set_client='utf8'"); mysql_select_db('tietokanta'); $id = mysql_real_escape_string($_POST['id']); //syötetään tieto kantaan $rivit = explode("\n", $_POST['tiedot']); foreach ($rivit as $rivi) { list($ika, $jaos, $pvm, $paikka, $lahto, $sija, $osallistujat, $aika, $voittosumma, $pisteet) = explode('++',$rivi); mysql_query("INSERT INTO kilpailut (ika, jaos, pvm, paikka, lahto, sija, osallistujat, muuta, voittosumma, pisteet, hevos_id) VALUES ( '".mysql_real_escape_string($ika)."', '".mysql_real_escape_string($jaos)."', '".mysql_real_escape_string($pvm)."', '".mysql_real_escape_string($paikka)."', '".mysql_real_escape_string($lahto)."', '".mysql_real_escape_string($sija)."', '".mysql_real_escape_string($osallistujat)."', '".mysql_real_escape_string($aika)."', '".mysql_real_escape_string($voittosumma)."', '".mysql_real_escape_string($pisteet)."', '$id' )"); echo mysql_error(); }
merlin kirjoitti:
qeijo, miten kanta on huono - ei kovin tyhjentävä viesti :/?
...
Metabolix, onko tuo kantarakenne ongelmallinen vain sen takia että sama tieto kertaantuu? Vai onko joku toinenkin syy miksi kannattaisi jakaa kahteen eri tauluun?
Suurin ongelma on datan 'integrity'.
Tietokanta* ilman relaatioita, avaimia ja viite-eheyksiä ei voi huolehtia omasta eheydestä.
Lisäksi se on vähintäänkin sekava ja vaikeasti hallinnoitavissa koska data on missä milloinkin jos jossain.
* Kanta jossa on Many-to-Many, Many-to-One, etc. kaltaisia suhteita.
qeijo, en ihan oikeasti ole kuin vasta aloittelija tietokantojen ja php:n parissa joten tuo sinun viestisi on täyttä hepreaa :/
Aihe on jo aika vanha, joten et voi enää vastata siihen.