/** Palauttaa tietokannasta ensimmäisen henkilön id:n */ public function hae_henkilon_id() { $hakulause = "select id from henkilot"; $tk_henkilo_oliot = $this->tietokantaolio->tee_OMAhaku_oliotaulukkopalautteella($hakulause); if (!empty($tk_henkilo_oliot)) { return $tk_henkilo_oliot[0]->id; } }
/** * Hakee suurimmän parametrina annettavan tietokantataulun id-kentän arvoista. * Ellei mitään löydy, palauttaa arvon -1. * @param Tietokantaolio $tietokantaolio * @param <type> $taulunimi */ function hae_suurin_id($tietokantaolio, $taulunimi) { // Haetaan suurin olemassaolevista havainto-id:eistä, jotta // mahdollisen kopioitavan/uuden havainnon id voidaan "arvata" // (=yhtä isompi). Tämä ei välttämättä pidä paikkaansa esimerkiksi // tapauksessa, jossa joku toinen ehtii tallentamaan välissä. $hakulause = "SELECT MAX(id) AS suurin FROM {$taulunimi}"; $osumataulukko = $tietokantaolio->tee_OMAhaku_oliotaulukkopalautteella($hakulause); $suurin_id = -1; if (!empty($osumataulukko) && is_numeric($osumataulukko[0]->suurin)) { $suurin_id = $osumataulukko[0]->suurin; } return $suurin_id; }
/** * Tämä metodi poistaa isäntäolion poiston yhteydessä isäntäolioon * linkitetyt pikakommentit ja palauttaa poistettujen olioiden lukumäärän. * @param Tietokantaolio $tietokantaolio (täällä, koska static!) * @param <type> $kohde_tyyppi * @param <type> $kohde_id */ public static function poista_pikakommentit($tietokantaolio, $kohde_tyyppi, $kohde_id) { $poistettujen_lkm = 0; // Haetaan ensin kyseiset rivit ja poistetaan ne sitten $hakulause = "SELECT id\n FROM pikakommentit\n WHERE kohde_id={$kohde_id}\n AND kohde_tyyppi={$kohde_tyyppi}"; $osumat = $tietokantaolio->tee_OMAhaku_oliotaulukkopalautteella($hakulause); foreach ($osumat as $pk_olio) { $taulu = "pikakommentit"; $taulun_sarake = "id"; $hakuarvo = $pk_olio->id; $palaute = $tietokantaolio->poista_rivi($taulu, $taulun_sarake, $hakuarvo); if ($palaute == Tietokantaolio::$HAKU_ONNISTUI) { $poistettujen_lkm++; } } return $poistettujen_lkm; }
/** * Poistaa elementit, jotka viittaavat olioon, joka tunnistetaan * parametrien avulla. Liittyy olion poiston jälkeiseen siivoukseen, jottei * jää elementtejä osoittamaan poistettuun olioon. * * Jos kaikki onnistuu, palauttaa arvon Pohja::$OPERAATIO_ONNISTUI, * muussa tapauksessa arvon Pohja::$VIRHE. * * @param Tietokantaolio $tietokantaolio * @param type $oliotyyppi Poistetun olion tyyppi (kokon, teht, ratk,...) * @param type $olio_id Poistetun olion id. */ public static function poista_elementit($tietokantaolio, $oliotyyppi, $olio_id) { $palaute = Pohja::$VIRHE; // Haetaan elementit: $hakulause = "SELECT id FROM " . Elementti::$taulunimi . " WHERE " . Elementti::$sarakenimi_oliotyyppi . "=" . $oliotyyppi . " AND " . Elementti::$sarakenimi_olio_id . "=" . $olio_id; $osumat = $tietokantaolio->tee_OMAhaku_oliotaulukkopalautteella($hakulause); $poistolaskuri = 0; // Laskee onnistuneet poistot foreach ($osumat as $tk_olio) { $id = $tk_olio->id; $elem = new Elementti($id, $tietokantaolio); if ($elem->olio_loytyi_tietokannasta) { if ($elem->poista() + 0 === Malliluokkapohja::$OPERAATIO_ONNISTUI) { $poistolaskuri++; } } } // Tarkistus, että kaikki poistot ok. Ellei osumia, myös ok! if ($poistolaskuri === sizeof($osumat)) { $palaute = Pohja::$OPERAATIO_ONNISTUI; } return $palaute; }
/** * Palauttaa aina luvun, joka osoittaa, kuinka monta kertaa henkilö on harjoittanut * kyseistä liikuntalajia halutun kuukauden aikana. * Virheen sattuessa palauttaa luvun 0. * @param int $liikkujaid luku - Juoksijan tunniste * @param string $laji merkkijono - liikuntalaji * @param int $kuu luku 1-12 - kuukausi * @param int $vuosi luku xxxx - tämä tarvitaan toki! Muuten etsii kaikilta * vuosilta... * @param Tietokantaolio $tietokantaolio * @return <type> */ function hae_kuukauden_kerrat($liikkujaid, $laji, $kuu, $vuosi, $tietokantaolio) { $hakulause = "SELECT id FROM suoritukset\n WHERE henkilo_id='{$liikkujaid}'\n AND kk='{$kuu}'\n AND vuosi='{$vuosi}'\n AND laji='{$laji}'"; $hakutulos = $tietokantaolio->tee_OMAhaku_oliotaulukkopalautteella($hakulause); return sizeof($hakutulos); }
/** * Tarkistetaan varsinaisen lisävaltuuden olemassaolo * henkilo_id:n, oliotyypin ja olio_id:n perusteella (staattinen metodi). * <p> * Huomaa, että tallennettaessa uutta lisävaltuutta käytetään * ei-staattista metodia <p>tarkista_lisavaltuuden_olemassaolo()</p>! Metodit ovat * hiukan erilaisia! * </p> * * <p> * Palauttaa lisävaltuuden löytyessä Lisävaltuus-luokan olion. Muussa * tapauksessa palauttaa arvon Lisavaltuudet::$EI_LISAVALTUUKSIA (kun * arvot ovat kunnolla määriteltyjä). Jos vähintään yksi arvoista * henkilo_id, oliotyyppi ja olio_id on $MUUTTUJAA_EI_MAARITELTY, * palautetaan arvo Lisavaltuudet::$VIRHE. * </p> * * <p> * Tietokannasta saa löytyä korkeintaan kaksi lisävaltuutta: yleinen ja * kohdetta koskeva. Tässä tapauksessa <i>korkeampi valtuustaso</i> palautetaan. * </p> * * @param type $olio_id * @param type $oliotyyppi * @param type $henkilo_id Jolle lisävaltuus myönnetään. * @param type $omistaja_id Olion omistaja * @param Tietokantaolio $tietokantaolio * * @return Palauttaa joko olemassaolevan Lisavaltuus-luokan olion tai * joko arvon $EI_LISAVALTUUKSIA tai $VIRHE. Viimeksi mainittu ei kerro * mitään siitä, onko lisävaltuutta jo olemassa! */ public static function tarkista_lisavaltuudet_tietokannasta($olio_id, $oliotyyppi, $henkilo_id, $omistaja_id, $tietokantaolio) { $palaute = Lisavaltuudet::$VIRHE; $valtuusolio_yl = ""; $valtuusolio_erit = ""; $valtuus_yl = Lisavaltuudet::$EI_LISAVALTUUKSIA; $valtuus_erit = Lisavaltuudet::$EI_LISAVALTUUKSIA; // HUOM! Valtuuksia ei saa olla kuin yksi yhtä // käyttäjä-olio -paria kohti! Sitä ei estetä tietokantatasolla! if ($olio_id != Lisavaltuudet::$MUUTTUJAA_EI_MAARITELTY && $henkilo_id != Lisavaltuudet::$MUUTTUJAA_EI_MAARITELTY && $oliotyyppi != Lisavaltuudet::$MUUTTUJAA_EI_MAARITELTY) { // Tarkistetaan ensin globaalin (omistajan kaikki oliot) lisäoikeuden // olemassaolo. Täällä tarvitaan linkki omistajaan, jottei lisä- // oikeuksia ihan kaikkiin olioihin myönnetä. $hakulause = "SELECT id FROM " . Lisavaltuudet::$taulunimi . " WHERE " . Lisavaltuudet::$sarakenimi_oliotyyppi . "=" . Lisavaltuudet::$kaikki_omistajan_oliot . " AND " . Lisavaltuudet::$sarakenimi_olio_id . "=" . Lisavaltuudet::$kaikki_omistajan_oliot . " AND " . Lisavaltuudet::$sarakenimi_omistaja_id . "=" . $omistaja_id . " AND " . Lisavaltuudet::$sarakenimi_henkilo_id . "=" . $henkilo_id; $osumaoliot = $tietokantaolio->tee_OMAhaku_oliotaulukkopalautteella($hakulause); // Jos lisävaltuus löytyi: if (sizeof($osumaoliot) > 0) { $valtuusolio_yl = new Lisavaltuudet($osumaoliot[0]->id, $tietokantaolio); $valtuus_yl = $valtuusolio_yl->get_valtuusarvo(); } // Sitten etsitään tarkasti olioon viittaavaa lisäoikeutta: $hakulause = "SELECT id FROM " . Lisavaltuudet::$taulunimi . " WHERE " . Lisavaltuudet::$sarakenimi_oliotyyppi . "=" . $oliotyyppi . " AND " . Lisavaltuudet::$sarakenimi_olio_id . "=" . $olio_id . " AND " . Lisavaltuudet::$sarakenimi_henkilo_id . "=" . $henkilo_id; $osumaoliot = $tietokantaolio->tee_OMAhaku_oliotaulukkopalautteella($hakulause); // Jos lisävaltuus löytyi: if (sizeof($osumaoliot) > 0) { $valtuusolio_erit = new Lisavaltuudet($osumaoliot[0]->id, $tietokantaolio); $valtuus_erit = $valtuusolio_erit->get_valtuusarvo(); } // Palaute tarkasti: if ($valtuus_erit > $valtuus_yl) { $palaute = $valtuusolio_erit; } else { if ($valtuusolio_yl instanceof Lisavaltuudet) { $palaute = $valtuusolio_yl; } else { $palaute = Lisavaltuudet::$EI_LISAVALTUUKSIA; } } } return $palaute; }
/** * Hakee bongauskuva_albumit tietokannasta. Kaikki albumit ovat yhteisiä ja * albumit luodaan aina lennossa niin, että jokaiselle lajiluokalle, josta on * kuvia, näytetään oma albumi. Lisäksi näytetään kullekin yläluokalle oma * yhteinen albumi, jossa on esimerkiksi kaikki linnut. * * Kuvien muokkaukseen ja poistoon tulee kuvakohtaiset rajoitukset niin, että * itse ladatun kuvan saa poistaa/muokata normaali jäsen ja ylläpitäjä saa * poistaa/muokata minkä tahansa kuvan. Lisätä saa kuka vain. * * @param <type> $omaid * @param Tietokantaolio $tietokantaolio * @return <type> */ function bongaus_hae_albumit($omaid, $tietokantaolio) { // Paluu havaintoihin -painike: $paluu = Bongauspainikkeet::$TAKAISIN_HAVAINTOIHIN_VALUE; $onsubmit_funktionimi = "hae_havainnot_bongaus"; $onsubmit_parametrit = array(); $form_maaritteet = array("method" => "post", "id" => "nayta_havainnot_bong", "action" => "{$_SERVER['PHP_SELF']}"); $input_maaritteet = array('name' => Bongaustoimintonimet::$havaintotoiminto, 'value' => $paluu); try { $paluunappi = Html::luo_submit_painike_onsubmit_toiminnolla($onsubmit_funktionimi, $onsubmit_parametrit, $form_maaritteet, $input_maaritteet); } catch (Exception $poikkeus) { $paluunappi = $poikkeus->getMessage(); } $albumiHTML = "<table id='albumitaulu'>\n <tr class='otsikkorivi'><th>Laji tai luokka</th>\n <th>Kuvien lkm</th>\n <th colspan=2>{$paluunappi}</th>\n </tr>\n "; // Haetaan bongauskuvien yläluokkien id:t: $hakulause = "SELECT blajiluokat.id AS yla_id\n FROM blajiluokat\n WHERE ylaluokka_id = -1\n ORDER BY yla_id"; $ylaluokka_id_oliotaulu = $tietokantaolio->tee_OMAhaku_oliotaulukkopalautteella($hakulause); // Käydään läpi yläluokat: $rivilaskuri = 0; foreach ($ylaluokka_id_oliotaulu as $ylaluokka_id_olio) { $ylaluokkaid = $ylaluokka_id_olio->yla_id; // Haetaan sitten kuvien lukumäärät yläluokittain. Ensin haetaan kaikki // kyseisen yläluokan kuvat (siis lkm), sitten kuvat lajeittain. // Kaikki yläluokan kuvat: /*$hakulause = "SELECT DISTINCT kuvat.id FROM kuvat JOIN bkuvalinkit AS linkit ON kuvat.id = linkit.kuva_id JOIN blajiluokat ON blajiluokat.id = linkit.lajiluokka_id WHERE blajiluokat.ylaluokka_id = $ylaluokkaid"; $kuva_lkm_taulu = $tietokantaolio->tee_OMAhaku_oliotaulukkopalautteella($hakulause); $kuvien_lkm = sizeof($kuva_lkm_taulu);*/ $kuvien_lkm = bongaus_hae_albumin_kuvien_lkm($ylaluokkaid, $tietokantaolio, $omaid); // Haetaan lajiluokan nimi: $nimi = Lajiluokka::hae_lajiluokan_nimi($ylaluokkaid, $tietokantaolio, Kielet::$SUOMI); // Jos kuvia löytyi, jatketaan eteenpäin: if ($kuvien_lkm > 0) { // Albumin näyttöpainike: Yhdistetään submit (toissijainen) // ja ajax (ensisijainen) -toiminnot samaan painikkeeseen: $katso_pikkukuvat = Bongauspainikkeet::$NAYTA_ESIKATSELUKUVAT_VALUE; $onsubmit_funktionimi = "hae_esikatselukuvat"; $onsubmit_parametrit = array($ylaluokkaid, Kuva::$ESIKATSELUKUVIA_RIVILLA_LKM_OLETUS, "\"" . Kuva::$KUVAT_BONGAUS . "\""); $form_maaritteet = array("method" => "post", "id" => "nayta_kuvat_bong", "action" => "{$_SERVER['PHP_SELF']}?id_lj={$ylaluokkaid}"); $input_maaritteet = array('name' => Bongaustoimintonimet::$kuvatoiminto, 'value' => $katso_pikkukuvat, "title" => Bongauspainikkeet::$NAYTA_ESIKATSELUKUVAT_TITLE); try { $albumin_katselunappi = Html::luo_submit_painike_onsubmit_toiminnolla($onsubmit_funktionimi, $onsubmit_parametrit, $form_maaritteet, $input_maaritteet); } catch (Exception $poikkeus) { $albumin_katselunappi = $poikkeus->getMessage(); } // Muotoillaan kuvien määrä niin, että uudet kuvat huomataan: /*$kuvien_lkm = "<td align='center'>$lkm</td>"; if($uudet_lkm > 0){ $kuvien_lkm = "<td align='center' class='uusia_kuvia'". "title='Uusia kuvia ".$uudet_lkm." kpl'>$lkm</td>"; }*/ $albumiHTML .= "<tr class='ylaluokkarivi'>"; $albumiHTML .= "<td>{$nimi}</td>"; $albumiHTML .= "<td>{$kuvien_lkm}</td>"; $albumiHTML .= "<td colspan=2>{$albumin_katselunappi}</td>"; $albumiHTML .= "</tr>"; /******************************************************************/ // Haetaan sitten lajeittain kyseiseen yläluokkaan kuuluvat kuvaat: // Haetaan lajiluokkien id:t: // KIELI PITÄÄ MYÖHEMMIN OTTAA MUKAAN! $kieli_id = Kielet::$SUOMI; $hakulause = "SELECT blajiluokat.id AS lj_id\n FROM blajiluokat\n JOIN bkuvaukset\n ON bkuvaukset.lajiluokka_id = blajiluokat.id\n WHERE blajiluokat.ylaluokka_id = {$ylaluokkaid}\n AND bkuvaukset.kieli = {$kieli_id}\n ORDER BY bkuvaukset.nimi"; $lj_id_oliot = $tietokantaolio->tee_OMAhaku_oliotaulukkopalautteella($hakulause); // Käydään läpi jokainen yläluokan laji ja tehdään albumi jokaisesta // lajista (vaikka ei olisi kuvia?). foreach ($lj_id_oliot as $lj_id_olio) { $id_lj = $lj_id_olio->lj_id; // Kuvia voi lisätä vain lajiin, ei yläluokkaan, jotta laji // saadaan muistiin. $kuvan_lisaysnappi = "<form method='post'id='lisaa_kuvia_bong' " . "action='../bongaus/index.php?id_lj={$id_lj}'>" . "<input type='submit' name='" . Bongaustoimintonimet::$kuvatoiminto . "'" . "value='" . Bongauspainikkeet::$UUSI_KUVA_VALUE . "'/>" . "</form>"; // Albumin näyttöpainike: Yhdistetään submit (toissijainen) // ja ajax (ensisijainen) -toiminnot samaan painikkeeseen: $katso_pikkukuvat = Bongauspainikkeet::$NAYTA_ESIKATSELUKUVAT_VALUE; $onsubmit_funktionimi = "hae_esikatselukuvat"; $onsubmit_parametrit = array($id_lj, Kuva::$ESIKATSELUKUVIA_RIVILLA_LKM_OLETUS, "\"" . Kuva::$KUVAT_BONGAUS . "\""); $form_maaritteet = array("method" => "post", "id" => "nayta_kuvat_bong", "action" => "../bongaus/index.php?id_lj={$id_lj}"); $input_maaritteet = array('name' => Bongaustoimintonimet::$kuvatoiminto, 'value' => $katso_pikkukuvat, "title" => Bongauspainikkeet::$NAYTA_ESIKATSELUKUVAT_TITLE); try { $albumin_katselunappi = Html::luo_submit_painike_onsubmit_toiminnolla($onsubmit_funktionimi, $onsubmit_parametrit, $form_maaritteet, $input_maaritteet); } catch (Exception $poikkeus) { $albumin_katselunappi = $poikkeus->getMessage(); } // Haetaan lajiluokan nimi: $nimi = Lajiluokka::hae_lajiluokan_nimi($id_lj, $tietokantaolio, Kielet::$SUOMI); // Haetaan albumin kuvien lkm: /*$hakulause = "SELECT DISTINCT kuvat.id FROM kuvat JOIN bkuvalinkit AS linkit ON kuvat.id = linkit.kuva_id JOIN blajiluokat ON blajiluokat.id = linkit.lajiluokka_id WHERE blajiluokat.id = $id_lj"; $kuva_lkm_taulu = $tietokantaolio-> tee_OMAhaku_oliotaulukkopalautteella($hakulause); $kuvien_lkm = sizeof($kuva_lkm_taulu);*/ $kuvien_lkm = bongaus_hae_albumin_kuvien_lkm($id_lj, $tietokantaolio, $omaid); if ($rivilaskuri % 2 == 1) { $rivi_class = "class='bongausalbumi_parillinen_rivi'"; } else { $rivi_class = ""; } $albumiHTML .= "<tr " . $rivi_class . ">"; $albumiHTML .= "<td>{$nimi}</td>"; $albumiHTML .= "<td>{$kuvien_lkm}</td>"; $albumiHTML .= "<td>{$albumin_katselunappi}</td>"; $albumiHTML .= "<td>{$kuvan_lisaysnappi}</td>"; $albumiHTML .= "</tr>"; $rivilaskuri++; } } else { // Ellei kuvia ole: $albumiHTML .= "<tr class='ylaluokkarivi'><td>{$nimi}</td>"; $albumiHTML .= "<td colspan=3>" . Bongaustekstit::$ilm_kuvia_ei_loytynyt . "</td></tr>"; } /******************************************************************/ /* Tarkistetaan ensin, onko albumissa uusia kuvia, eli * edellisen uloskirjautumisen jälkeen lisättyjä: * $uudet_lkm = 0; // Kertoo uusien lkm:n // Jos viimeistä katseluaikaa ei ole asetettu, asetetaan 0: if(!isset($_SESSION['kuvat_katsottu_viimeksi'])){ $_SESSION['kuvat_katsottu_viimeksi'] = 0; } $hakulause = "SELECT COUNT(*) AS uudet_lkm FROM kuvat JOIN kuva_albumi_linkit AS linkit ON kuvat.id = linkit.kuva_id JOIN albumit ON albumit.id = linkit.albumi_id WHERE (kuvat.tallennusaika_sek > ". $_SESSION['kuvat_katsottu_viimeksi']." AND albumit.id = ".$alb->id.")"; $hakutulos = $tietokantaolio->tee_OMAhaku($hakulause); if($hakutulos != false){ $lkmtaulukko = $tietokantaolio->hae_osumarivit_olioina($hakutulos); // Kai taulukossa aina vähintään nolla on, joten // tämä tarkistus lienee tarpeeton. if(sizeof($lkmtaulukko)>0){ $uudet_lkm = $lkmtaulukko[0]->uudet_lkm; } }*/ /******************************************************************/ } $albumiHTML .= "</table>"; return $albumiHTML; }
/** * Tietokannasta etsitään kaikki suodattimet, joiden omistaja_id TAI * vastapuoli_id on parametrina annettu käyttäjän id. Palautetaan * taulukko, jossa löydetyt Suodatin-luokan oliot. Taulukko on tyhjä, ellei * yhtään suodatinta löydy. * * @param type $omaid * @param Tietokantaolio $tietokantaolio * @return boolean */ public static function hae_suodattimet($omaid, $tietokantaolio) { $suodattimet = array(); $hakulause = "SELECT id FROM " . Suodatin::$taulunimi . " WHERE " . Suodatin::$sarakenimi_omistaja_id . "=" . $omaid . " OR " . Suodatin::$sarakenimi_vastapuoli_id . "=" . $omaid; $osumaoliot = $tietokantaolio->tee_OMAhaku_oliotaulukkopalautteella($hakulause); // Taulukkoon löydetyt: $laskuri = 0; foreach ($osumaoliot as $osuma) { $osuma = new Suodatin($osumaoliot[$laskuri]->id, $tietokantaolio); if ($osuma->olio_loytyi_tietokannasta) { array_push($suodattimet, $osuma); } $laskuri++; } return $suodattimet; }
/** * * Hakee yhteen kokonaisuuteen (id_kokon) liittyvät julkiset tehtävät * Tehtava-luokan olioina tietokannasta. Palauttaa aina taulukon, joka voi olla * tyhjä. * * Huom: täällä haetaan vain julkiset tehtävät ja tätä kannattaa lähinnä * käyttää silloin, kun käyttäjä ei ole kirjautunut. * * Tietokannasta tehdään haku jokaisen tehtävän kohdalla. Jos tuntuu * aiheuttavan hitautta, voi tiedot hakea kerralla ja poimia * olioille tiedot tietokantaosumataulukosta. * * @param type $id_kokon Sen kokonaisuuden id, johon tehtävät kuuluvat. * @param Tietokantaolio $tietokantaolio * @return array */ static function hae_kokonaisuuden_julkiset_tehtavat($id_kokon, $tietokantaolio) { $tehtavat = array(); /* Haetaan tehtävät: */ $hakulause = "SELECT " . Tehtava::$SARAKENIMI_ID . " " . " FROM " . Tehtava::$taulunimi . " " . " WHERE " . Tehtava::$sarakenimi_kokon_id . " = " . $id_kokon . " AND " . Tehtava::$sarakenimi_nakyvyys . "=" . Nakyvyys::$JULKINEN . " ORDER BY vaikeustaso, otsikko"; /* Palauttaa taulukon, joka on tyhjä, ellei mitään löytynyt: */ $osumat = $tietokantaolio->tee_OMAhaku_oliotaulukkopalautteella($hakulause); foreach ($osumat as $osuma) { $id = $osuma->id; $teht = new Tehtava($id, $tietokantaolio); if ($teht->olio_loytyi_tietokannasta) { array_push($tehtavat, $teht); } } return $tehtavat; }