/** * Tallentaa kuvan tietokantaan. Kuvan tiedot on tarkistettu ennen tänne tuloa, * joten niitä ei tarkemmin tarkisteta täällä. * * Tallentaa kuvan ja palauttaa palauteolion, joka sisältää * palautteen tallennuksen onnistumisesta ('onnistui' tai virheilmoitus) ja * tallennetun kuvan id:n, jotta uusi kuva osataan näyttää heti. Kolmanneksi * palauteoliossa on tallennetun kuvan tiedosto-osoite. * * @param <type> $kohde * @param <type> $id_kokon * @param <type> $id_teht * @param <type> $id_ratk * @param <type> $omaid * @param <type> $ladattu_kuva $_FILES['ladattu_kuva'] * @param <type> $kuvaotsikko_kuva * @param <type> $kuvaselitys_kuva * @param <type> $vuosi_kuva * @param <type> $kk_kuva * @param <type> $paiva_kuva * @param <type> $nayttokokoindeksi_kuva * @param <type> $tietokantaolio * @param <type> $latauskansio Antaa sen kansion suhteellisen tiedostopolun, * jonne ladattu tiedosto on tarkoitus siirtää pysyvää sijoitusta varten. * @return Palaute $palauteolio */ function tallenna_kuva($kohde, $id_kokon, $id_teht, $id_ratk, $omaid, $ladattu_kuva, $kuvaotsikko_kuva, $kuvaselitys_kuva, $vuosi_kuva, $kk_kuva, $paiva_kuva, $nayttokokoindeksi_kuva, $tietokantaolio, $latauskansio) { // Tallenna_kuva palauttaa olion, joka sisältää kolme // muuttujaa; palautteen (ilmoitus), tallennetun kuvan id:n (2), joka // voi olla tyhjä virheen sattuessa ja kuvaosoitteen (3) ($palauteolio::oma). $palauteolio = new Palaute(); $tallennetaan = true; /* Tallennetaanko kuvalinkki. */ $palaute = ""; $uuden_kuvan_id = -1; $kohdeosoite = ""; /* Tarkistetaan kohde: */ $taulu = "kuvat"; $sarakenimi_kuvataulukko = array('henkilo_id', 'kuvaotsikko', 'kuvaselitys', 'vuosi', 'kk', 'paiva', 'src', 'leveys', 'korkeus', 'tiedostokoko', 'tiedostotunnus', 'tiedostonimi', 'tallennushetki_sek', 'nayttokokoindeksi'); if ($ladattu_kuva['tmp_name'] == "") { $palaute = "\$ladattu_kuva['tmp_name'] on tyhjä!"; } else { $kuvatietotaulukko = getImageSize($ladattu_kuva['tmp_name']); $leveys = $kuvatietotaulukko[0]; $kork = $kuvatietotaulukko[1]; // Tiedostotunnisteet: $tunniste = $kuvatietotaulukko[2]; //gif = 1/jpg = 2/png = 3/... //$html_lev_ja_kork = $kuvatietotaulukko[3]; // "height='333' width='455'" $koko = $ladattu_kuva['size']; // Koko tavuina (ilm.) if (!(is_numeric($leveys) && is_numeric($kork) && is_numeric($tunniste))) { $palaute = "getImageSize(\$ladattu_kuva['tmp_name'])-\n palautearvotaulukossa lev, kork tai tunniste\n epälukuja! (lev: " . $leveys . ", kork: " . $kork . "\n ja tunniste: " . $tunniste . ")"; return $palaute; } // Kuvan nimeen lisätään tallennusaika sekunteina, jottei // duplikaatteja syntyisi. Samannimisiä kuvia voi muuten tulla. // Kuvan tiedostonimeä ei muuteta. $tiedostonimi = time() . "_" . $ladattu_kuva['name']; $kohdeosoite = $latauskansio . "/" . $tiedostonimi; $kuvatiedosto = $ladattu_kuva['tmp_name']; //******************************************************************* /* TÄSSÄ KUVAN KOKO TARKISTETAAN JA KUVA PIENENNETÄÄN, ETTEI * ÄLYTTÖMIÄ TULE. YLI 300 KT:N KUVAT PIENENNETÄÄN 1600 PIKSELIN * KOKOON, JOLLOIN MYÖS KUVAKOKO PIENENTYY. */ if ($koko > Kuvat::$KUVALATAUS_RAJAKOKO) { $max_mitta = Kuvat::$KUVATALLENNUS_PIENENNOSMITTA; if (muuta_kuvan_koko($ladattu_kuva['tmp_name'], $max_mitta, $kohdeosoite, 75)) { // Haetaan pienennetyn kuvan uudet tiedot: $kuvatietotaulukko = getImageSize($kohdeosoite); $leveys = $kuvatietotaulukko[0]; $kork = $kuvatietotaulukko[1]; // Tiedostotunnisteet: $tunniste = $kuvatietotaulukko[2]; //gif = 1/jpg = 2/png = 3/... $koko = filesize($kohdeosoite); // } else { // Ellei onnistu, tallennetaan alkuperäinen: $kuvatiedosto = $ladattu_kuva['tmp_name']; move_uploaded_file($kuvatiedosto, $kohdeosoite); } } else { // Ellei pienennöstarvetta ole. $kuvatiedosto = $ladattu_kuva['tmp_name']; move_uploaded_file($kuvatiedosto, $kohdeosoite); } //******************************************************************* $henkilo_id = $omaid; $tallennushetki_sek = time(); $arvotaulukko = array($henkilo_id, $kuvaotsikko_kuva, $kuvaselitys_kuva, $vuosi_kuva, $kk_kuva, $paiva_kuva, $kohdeosoite, $leveys, $kork, $koko, $tunniste, $tiedostonimi, $tallennushetki_sek, $nayttokokoindeksi_kuva); // Palauttaa merkkijonon 'onnistui', jos tallennus onnistuu. $virheilm = Tekstit::$ilm_kuva_uusi_tallennus_eiok; $onnistuikos = $tietokantaolio->tallenna_uusi_rivi($taulu, $sarakenimi_kuvataulukko, $arvotaulukko, $virheilm); $palaute = $onnistuikos; if ($onnistuikos == Tietokantaolio::$HAKU_ONNISTUI) { $tallennetaan = true; $uuden_kuvan_id = mysql_insert_id(); $virheilm = Tekstit::$ilm_kuva_linkin_tallennus_eiok; /* * Linkki kuvan ja kohteen välille tehdään huolella oikein päin: */ if ($kohde === Kuvat::$kohde_kokonaisuus_tiivistelma) { $taulu = "kuva_linkit"; $sarakenimet = array("kokon_id", "kuva_id", "kohde"); $arvot = array($id_kokon, $uuden_kuvan_id, $kohde); $aktiivisuuslaji = Aktiivisuus::$KUVAN_TALLENNUS_KOKONAISUUTEEN; } else { if ($kohde === Kuvat::$kohde_kokonaisuus_selitys) { $taulu = "kuva_linkit"; $sarakenimet = array("kokon_id", "kuva_id", "kohde"); $arvot = array($id_kokon, $uuden_kuvan_id, $kohde); $aktiivisuuslaji = Aktiivisuus::$KUVAN_TALLENNUS_KOKONAISUUTEEN; } else { if ($kohde === Kuvat::$kohde_kokonaisuus_tiivis_manuaali || $kohde === Kuvat::$kohde_kokonaisuus_selitys_manuaali) { $taulu = "kuva_linkit"; $sarakenimet = array("kokon_id", "kuva_id", "kohde"); $arvot = array($id_kokon, $uuden_kuvan_id, $kohde); $aktiivisuuslaji = Aktiivisuus::$KUVAN_TALLENNUS_KOKONAISUUTEEN; } else { if ($kohde === Kuvat::$kohde_tehtava) { $taulu = "tehtavakuvalinkit"; $sarakenimet = array("tehtava_id", "kuva_id"); $arvot = array($id_teht, $uuden_kuvan_id); $aktiivisuuslaji = Aktiivisuus::$KUVAN_TALLENNUS_TEHTAVAAN; } else { if ($kohde === Kuvat::$kohde_ratkaisu) { $taulu = "ratkaisukuvalinkit"; $sarakenimet = array("ratkaisu_id", "kuva_id"); $arvot = array($id_ratk, $uuden_kuvan_id); $aktiivisuuslaji = Aktiivisuus::$KUVAN_TALLENNUS_RATKAISUUN; } else { $tallennetaan = false; $aktiivisuuslaji = ""; /* Tämän ei pitäisi tulla käyttäjälle, minkä takia ei käännetä. */ $onnistuiko_linkki = "Tuntematon kuvien kohdenimi! " . "(tallenna_kuva.php)" . "Tallennus peruttu!"; } } } } } /* Jos kaikki kunnossa, tallennetaan kuvalinkki */ if ($tallennetaan) { $onnistuiko_linkki = $tietokantaolio->tallenna_uusi_rivi($taulu, $sarakenimet, $arvot, $virheilm); } else { // Perutaan kuvan tallennus, koska sitä ei löydy ilman linkkiä! unlink($kohdeosoite); // Kuvan tod. poisto tiedostosta! /* Kuvatiedot poistetaan myös. */ $taulu = "kuvat"; $taulun_sarake = "id"; $hakuarvo = $uuden_kuvan_id; $poistopalaute = $tietokantaolio->poista_rivi($taulu, $taulun_sarake, $hakuarvo); $palaute .= "<br />" . $poistopalaute; } if ($onnistuiko_linkki != Tietokantaolio::$HAKU_ONNISTUI) { $uuden_kuvan_id = -1; // Uusi kuva ei kuitenkaan löydy. // Perutaan kuvan tallennus, koska sitä ei löydy ilman linkkiä! unlink($kohdeosoite); // Kuvan tod. poisto tiedostosta! /* Kuvatiedot poistetaan myös! */ $taulu = "kuvat"; $taulun_sarake = "id"; $hakuarvo = $uuden_kuvan_id; $poistopalaute = $tietokantaolio->poista_rivi($taulu, $taulun_sarake, $hakuarvo); $palaute = Tekstit::$ilm_kuva_linkin_tallennus_eiok; $palaute .= "<br />" . $poistopalaute; } else { /* Kun linkin tallennuskin onnistui: */ // Aktiivisuusmerkintä: $viimeksi_aktiivi = time(); paivita_aktiivisuus($omaid, $tietokantaolio, $viimeksi_aktiivi, $aktiivisuuslaji); $palaute = Tietokantaolio::$HAKU_ONNISTUI; } } } $palauteolio->set_ilmoitus($palaute); $palauteolio->set_muokatun_id($uuden_kuvan_id); $palauteolio->set_oma($kohdeosoite); /* kansio-osoite+kuvan nimi! */ return $palauteolio; }
/** * Poistaa yhden kuvan ja siihen liittyvät kuva_albumi_linkit. * @param <type> $id_kuva * @param <type> $tietokantaolio */ function poista_kuva($oma_id, $id_kuva, $tietokantaolio) { // Haetaan kuvan src poistoa varten: $hakulause = "SELECT src\n FROM kuvat\n WHERE id = {$id_kuva}"; $hakutulos = $tietokantaolio->tee_OMAhaku($hakulause); $osumataulukko = $tietokantaolio->hae_osumarivit_olioina($hakutulos); if (sizeof($osumataulukko) == 0) { $src = ""; } else { $src = $osumataulukko[0]->src; } // POistetaan kuvatiedot tietokannasta: $taulu = "kuvat"; $taulun_sarake = "id"; $hakuarvo = $id_kuva; $ilmoitus = $tietokantaolio->poista_rivi($taulu, $taulun_sarake, $hakuarvo); // Jos kuvan poisto onnistui, poistetaan myös orvoiksi jääneet linkit: if ($ilmoitus == "onnistui") { // Tämä tuhoaa tiedoston lopullisesti: $todellinen_poisto = unlink($src); // Aktiivisuusmerkintä: $viimeksi_aktiivi = time(); $aktiivisuuslaji = Aktiivisuus::$KUVAN_POISTO; paivita_aktiivisuus($oma_id, $tietokantaolio, $viimeksi_aktiivi, $aktiivisuuslaji); if ($todellinen_poisto) { $ilmoitus = "Kuvan poisto onnistui! Kuva tuhottu lopullisesti. "; } else { $ilmoitus = "Virhe kuvan poistossa! Kuvan tiedot poistettu\n tietokannasta, mutta kuvatiedoston poisto ei onnistunut. "; } // Haetaan ja poistetaan linkit. Kerrallakin voisi poistaa delete- // lauseella, mutta se tuntuu vähän uskaliaalta. Näin ainakin poisto // pysyy hanskassa, eikä nopeudella lie tässä niin väliä. $hakulause = "SELECT id\n FROM kuva_albumi_linkit\n WHERE kuva_id = {$id_kuva}"; $hakutulos = $tietokantaolio->tee_OMAhaku($hakulause); $linkit = $tietokantaolio->hae_osumarivit_olioina($hakutulos); $poistetut_linkit_lkm = 0; foreach ($linkit as $linkki) { $taulu = "kuva_albumi_linkit"; $taulun_sarake = "id"; $hakuarvo = $linkki->id; $ilm = $tietokantaolio->poista_rivi($taulu, $taulun_sarake, $hakuarvo); if ($ilm == "onnistui") { $poistetut_linkit_lkm++; } } $ilmoitus .= "Linkit (" . $poistetut_linkit_lkm . " kpl) poistettu."; } else { $ilmoitus = "Virhe kuvan poistossa! Yritä uudelleen!"; } return $ilmoitus; }
/** * Poistaa yhden kuvan (kuvatiedoston ja tietokannan kuvatiedot). Linkit * poistuvat automaattisesti, kun kuvalinkkitaulussa on * FOREIGN KEY (kuva_id) REFERENCES kuvat (id) ON DELETE CASCADE -määrittely. * * @param <type> $id_kuva * @param <type> $tietokantaolio */ function poista_kuva($oma_id, $id_kuva, $tietokantaolio) { // Haetaan kuvan src poistoa varten: $hakulause = "SELECT src\n FROM kuvat\n WHERE id = {$id_kuva}"; $hakutulos = $tietokantaolio->tee_OMAhaku($hakulause); $osumataulukko = $tietokantaolio->hae_osumarivit_olioina($hakutulos); if (sizeof($osumataulukko) == 0) { $src = ""; } else { $src = $osumataulukko[0]->src; } // POistetaan kuvatiedot tietokannasta: $taulu = "kuvat"; $taulun_sarake = "id"; $hakuarvo = $id_kuva; $ilmoitus = $tietokantaolio->poista_rivi($taulu, $taulun_sarake, $hakuarvo); // Jos kuvantietojen poisto tietokannasta onnistui, poistetaan // myös orvoksi jäänyt kuvatiedosto: if ($ilmoitus == "onnistui") { // Tämä tuhoaa tiedoston lopullisesti: $todellinen_poisto = unlink($src); // Aktiivisuusmerkintä: $viimeksi_aktiivi = time(); $aktiivisuuslaji = Aktiivisuus::$KUVAN_POISTO; paivita_aktiivisuus($oma_id, $tietokantaolio, $viimeksi_aktiivi, $aktiivisuuslaji); if ($todellinen_poisto) { $ilmoitus = "Kuvan poisto onnistui! Kuva tuhottu lopullisesti. "; } else { $ilmoitus = "Virhe kuvan poistossa! Kuvan tiedot poistettu\n tietokannasta, mutta kuvatiedoston poisto ei onnistunut. "; } } else { $ilmoitus = "Virhe kuvan poistossa! Yritä uudelleen!"; } return $ilmoitus; }
/** * Poistaa albumin tietokannasta kuvineen ja kuvalinkkeineen. * Muuten albumin sisältämät kuvat ja kuva_albumi_linkit jäävät orvoiksi. * jäävät orvoiksi. Siispä kuvat poistetaan samalla! Aika vaarallinen komento, * joten varoitus pitää olla! * @param <type> $albumi_id * @param <type> $tietokantaolio * @return <type> Palauttaa merkkijonon, joka kertoo poiston onnistumisen. */ function poista_albumi($oma_id, $albumi_id, $tietokantaolio) { // Haetaan ensin poistettavan albumin nimi: $hakulause = "SELECT nimi\n FROM albumit\n WHERE id = {$albumi_id}"; $hakutulos = $tietokantaolio->tee_OMAhaku($hakulause); $nimitaulukko = $tietokantaolio->hae_osumarivit_olioina($hakutulos); if (sizeof($nimitaulukko) == 0) { $nimi = "tuntematon"; } else { $nimi = $nimitaulukko[0]->nimi; } // Haetaan poistettavan albumin sisältämät kuvat (pitää hakea ennen // albumin poistoa!): $hakulause = "SELECT kuvat.id, kuvat.src\n FROM albumit\n JOIN kuva_albumi_linkit AS linkit\n ON linkit.albumi_id = albumit.id\n JOIN kuvat\n ON kuvat.id = linkit.kuva_id\n WHERE albumit.id = {$albumi_id}"; $hakutulos = $tietokantaolio->tee_OMAhaku($hakulause); $kuvat = $tietokantaolio->hae_osumarivit_olioina($hakutulos); // Poistetaan albumi: $taulu = "albumit"; $taulun_sarake = "id"; $hakuarvo = $albumi_id; $ilmoitus = $tietokantaolio->poista_rivi($taulu, $taulun_sarake, $hakuarvo); // Jos albumin poisto onnistui, poistetaan myös orvoiksi jääneet linkit ja kuvat: if ($ilmoitus == "onnistui") { // Haetaan ja poistetaan linkit. Kerrallakin voisi poistaa delete- // lauseella, mutta se tuntuu vähän uskaliaalta. Näin ainakin poisto // pysyy hanskassa, eikä nopeudella lie tässä niin väliä. $hakulause = "SELECT id\n FROM kuva_albumi_linkit\n WHERE albumi_id = {$albumi_id}"; $hakutulos = $tietokantaolio->tee_OMAhaku($hakulause); $linkit = $tietokantaolio->hae_osumarivit_olioina($hakutulos); $poistetut_linkit_lkm = 0; foreach ($linkit as $linkki) { $taulu = "kuva_albumi_linkit"; $taulun_sarake = "id"; $hakuarvo = $linkki->id; $ilm = $tietokantaolio->poista_rivi($taulu, $taulun_sarake, $hakuarvo); if ($ilm == "onnistui") { $poistetut_linkit_lkm++; } } // Poistetaan kuvat: $kuvalaskuri = 0; $tosituholaskuri = 0; //Todella tuhotut kuvatiedostot: foreach ($kuvat as $kuva) { $src = $kuva->src; $taulu = "kuvat"; $taulun_sarake = "id"; $hakuarvo = $kuva->id; $ilm = $tietokantaolio->poista_rivi($taulu, $taulun_sarake, $hakuarvo); if ($ilm == "onnistui") { $kuvalaskuri++; } // Tämä tuhoaa tiedoston lopullisesti: $todellinen_poisto = unlink($src); if ($todellinen_poisto) { $tosituholaskuri++; } } // Aktiivisuusmerkintä: $viimeksi_aktiivi = time(); $aktiivisuuslaji = Aktiivisuus::$ALBUMIN_POISTO; paivita_aktiivisuus($oma_id, $tietokantaolio, $viimeksi_aktiivi, $aktiivisuuslaji); if (sizeof($kuvat) == $kuvalaskuri && $kuvalaskuri == $tosituholaskuri) { $ilmoitus = "Albumi '" . $nimi . "' poistettu onnistuneesti.\n Samalla poistettu {$kuvalaskuri} kuvaa ja\n {$poistetut_linkit_lkm} linkkiä!"; } else { $ilmoitus = "Albumi '" . $nimi . "' poistettu, mutta kuvien poistossa\n tuli virhe. " . sizeof($kuvat) . " kuvasta poistettu \n tietokannasta {$kuvalaskuri} kuvaa, tiedostosta\n {$tosituholaskuri} kuvaa ja {$poistetut_linkit_lkm}\n linkkiä!"; } } else { $ilmoitus = "Albumin poisto epäonnistui!\n Mitään ei ole poistettu. Yritä uudelleen!"; } return $ilmoitus; }