'."\n"; echo ''."\n"; echo ''."\n"; echo ''."\n"; echo ''.$title.''."\n"; echo ''."\n"; echo ''."\n"; echo ''."\n"; echo '

'.$h1.'

'."\n"; } // tulostaa XHTML-sivun lopputagit public function tulosta_loppu() { echo ''."\n"; echo ''."\n"; } } // luokka tietokannan käsittelylle class kanta { private $dbh; // konstruktori, jossa kantaan luodaan yhteys function __construct($kanta) { try { $this->dbh = new PDO($kanta); } catch(PDOException $e) { print($e->getMessage()); } } function __destruct() { } // metodi hakee kaikki elokuvat ja niihin liittyvät näyttelijät kannasta // aakkosten mukaan järjestäminen tehdään jo SQL-lauseessa public function hae_elokuvat_ja_nayttelijat() { $sql = $this->dbh->prepare('SELECT Movie.MovieName AS MovieName, Actor.ActorName AS ActorName FROM Movie LEFT OUTER JOIN Participates ON Movie.MovieID = Participates.Movie_MovieID LEFT OUTER JOIN Actor ON Participates.Actor_ActorID = Actor.ActorID ORDER BY Movie.MovieName, Actor.ActorName ASC'); if(!$sql) { print_r($this->dbh->errorInfo()); return false; } $ok = $sql->execute(); if(!$ok) { print_r($sql->errorInfo()); return false; } else { return $sql; } } // metodi hakee kaikki näyttelijät ja niihin liittyvät elokuvat kannasta // aakkosten mukaan järjestäminen tehdään jo SQL-lauseessa public function hae_nayttelijat_ja_elokuvat() { $sql = $this->dbh->prepare('SELECT Actor.ActorName AS ActorName, Movie.MovieName AS MovieName FROM Actor LEFT OUTER JOIN Participates ON Actor.ActorID = Participates.Actor_ActorID LEFT OUTER JOIN Movie ON Participates.Movie_MovieID = Movie.MovieID ORDER BY Actor.ActorName, Movie.MovieName ASC'); if(!$sql) { print_r($this->dbh->errorInfo()); return false; } $ok = $sql->execute(); if(!$ok) { print_r($sql->errorInfo()); return false; } else { return $sql; } } // metodi hakee kaikki näyttelijät kannasta public function hae_nayttelijat() { $sql = $this->dbh->prepare('SELECT * FROM Actor ORDER BY ActorName ASC'); if(!$sql) { print_r($this->dbh->errorInfo()); return false; } $ok = $sql->execute(); if(!$ok) { print_r($sql->errorInfo()); return false; } else { return $sql; } } // metodi hakee kaikki elokuvat kannasta public function hae_elokuvat() { $sql = $this->dbh->prepare('SELECT * FROM Movie ORDER BY MovieName ASC'); if(!$sql) { print_r($this->dbh->errorInfo()); return false; } $ok = $sql->execute(); if(!$ok) { print_r($sql->errorInfo()); return false; } else { return $sql; } } // palauttaa tiedon onko kannassa elokuvia public function onko_elokuvia() { $sql = $this->dbh->prepare('SELECT COUNT(*) FROM Movie'); if(!$sql) { print_r($this->dbh->errorInfo()); return false; } $ok = $sql->execute(); if(!$ok) { print_r($sql->errorInfo()); return false; } else { if($sql->fetchColumn() > 0) { return true; } else { return false; } } } // palauttaa tiedon onko kannassa näyttelijöitä public function onko_nayttelijoita() { $sql = $this->dbh->prepare('SELECT COUNT(*) FROM Actor'); if(!$sql) { print_r($this->dbh->errorInfo()); return false; } $ok = $sql->execute(); if(!$ok) { print_r($sql->errorInfo()); return false; } else { if($sql->fetchColumn() > 0) { return true; } else { return false; } } } // metodi hakee kannasta elokuvan sen id:n perusteella // palauttaa löytyneen tietokantarivin public function hae_elokuva($id) { $sql = $this->dbh->prepare('SELECT * FROM Movie WHERE MovieID = :id'); if(!$sql) { print_r($this->dbh->errorInfo()); return false; } $sql->bindParam(":id",$id); $ok = $sql->execute(); if(!$ok) { print_r($sql->errorInfo()); return false; } else { $rivi = $sql->fetch(PDO::FETCH_ASSOC); return $rivi; } } // metodi hakee kannasta näyttelijän sen id:n perusteella // palauttaa löytyneen tietokantarivin public function hae_nayttelija($id) { $sql = $this->dbh->prepare('SELECT * FROM Actor WHERE ActorID = :id'); if(!$sql) { print_r($this->dbh->errorInfo()); return false; } $sql->bindParam(":id",$id); $ok = $sql->execute(); if(!$ok) { print_r($sql->errorInfo()); return false; } else { $rivi = $sql->fetch(PDO::FETCH_ASSOC); return $rivi; } } // metodi hakee kannasta kaikki tietyn elokuvan (id tuodaan parametrina) liitokset // palauttaa kahvan tulosjoukkoon public function hae_liitokset_elokuvalle($id) { $sql = $this->dbh->prepare('SELECT * FROM Participates WHERE Movie_MovieID = :id'); if(!$sql) { print_r($this->dbh->errorInfo()); return false; } $sql->bindParam(":id",$id); $ok = $sql->execute(); if(!$ok) { print_r($sql->errorInfo()); return false; } else { return $sql; } } // metodi hakee kannasta kaikki tietyn näyttelijän (id tuodaan parametrina) liitokset // palauttaa kahvan tulosjoukkoon public function hae_liitokset_nayttelijalle($id) { $sql = $this->dbh->prepare('SELECT * FROM Participates WHERE Actor_ActorID = :id'); if(!$sql) { print_r($this->dbh->errorInfo()); return false; } $sql->bindParam(":id",$id); $ok = $sql->execute(); if(!$ok) { print_r($sql->errorInfo()); return false; } else { return $sql; } } // metodi lisää kantaan uuden elokuvan ja kiinnittää siihen valitut näyttelijät // lisättävät tiedot tuodaan parametreinä // rajoitteet (ei saa lisätä kahta samannimistä) hoidetaan suoraan kannassa UNIQUE:n avulla // lisäyksessä käytetään transaktioita public function lisaa_elokuva($leffa,$nayttelijat) { $this->dbh->beginTransaction(); $sql = $this->dbh->prepare('INSERT INTO Movie (MovieName) VALUES (:elokuva)'); if(!$sql) { print_r($this->dbh->errorInfo()); $this->dbh->rollBack(); return false; } $sql->bindParam(":elokuva",trim($leffa)); $ok = $sql->execute(); if(!$ok) { //print_r($sql->errorInfo()); $this->dbh->rollBack(); return false; } $leffaid = $this->dbh->lastInsertID(); foreach($nayttelijat as $nayttelija) { if($nayttelija!=0) { $sql = $this->dbh->prepare('INSERT INTO Participates VALUES (:elokuva, :nayttelija)'); if(!$sql) { print_r($this->dbh->errorInfo()); $this->dbh->rollBack(); return false; } $sql->bindParam(":elokuva",$leffaid); $sql->bindParam(":nayttelija",$nayttelija); $ok = $sql->execute(); if(!$ok) { print_r($sql->errorInfo()); $this->dbh->rollBack(); return false; } } } $this->dbh->commit(); return true; } // metodi lisää kantaan uuden näyttelijän ja kiinnittää siihen valitut elokuvat // lisättävät tiedot tuodaan parametreinä // rajoitteet (ei saa lisätä kahta samannimistä) hoidetaan suoraan kannassa UNIQUE:n avulla // lisäyksessä käytetään transaktioita public function lisaa_nayttelija($nayttelija,$elokuvat) { $this->dbh->beginTransaction(); $sql = $this->dbh->prepare('INSERT INTO Actor (ActorName) VALUES (:nayttelija)'); if(!$sql) { print_r($this->dbh->errorInfo()); $this->dbh->rollBack(); return false; } $sql->bindParam(":nayttelija",trim($nayttelija)); $ok = $sql->execute(); if(!$ok) { //print_r($sql->errorInfo()); $this->dbh->rollBack(); return false; } $nayttelijaid = $this->dbh->lastInsertID(); foreach($elokuvat as $elokuva) { if($elokuva!=0) { $sql = $this->dbh->prepare('INSERT INTO Participates VALUES (:elokuva, :nayttelija)'); if(!$sql) { print_r($this->dbh->errorInfo()); $this->dbh->rollBack(); return false; } $sql->bindParam(":elokuva",$elokuva); $sql->bindParam(":nayttelija",$nayttelijaid); $ok = $sql->execute(); if(!$ok) { print_r($sql->errorInfo()); $this->dbh->rollBack(); return false; } } } $this->dbh->commit(); return true; } // metodi poistaa parametrina tuodut elokuvat kannasta // poistossa käytetään transaktioita public function poista_elokuvat($leffat) { $this->dbh->beginTransaction(); foreach($leffat as $leffa) { $sql = $this->dbh->prepare('DELETE FROM Movie WHERE MovieID = :leffa'); if(!$sql) { print_r($this->dbh->errorInfo()); $this->dbh->rollBack(); return false; } $sql->bindParam(":leffa",$leffa); $ok = $sql->execute(); if(!$ok) { print_r($sql->errorInfo()); $this->dbh->rollBack(); return false; } } $this->dbh->commit(); return true; } // metodi poistaa parametrina tuodut näyttelijät kannasta // poistossa käytetään transaktioita public function poista_nayttelijat($nayttelijat) { $this->dbh->beginTransaction(); foreach($nayttelijat as $nayttelija) { $sql = $this->dbh->prepare('DELETE FROM Actor WHERE ActorID = :nayttelija'); if(!$sql) { print_r($this->dbh->errorInfo()); $this->dbh->rollBack(); return false; } $sql->bindParam(":nayttelija",$nayttelija); $ok = $sql->execute(); if(!$ok) { print_r($sql->errorInfo()); $this->dbh->rollBack(); return false; } } $this->dbh->commit(); return true; } // metodi muokkaa elokuvan tietoja // tietokantakutsuja tehdään vain jos on muokattavaa // muokkauksessa käytetään transaktioita public function muokkaa_elokuva($eid,$nimi,$nayttelijat) { $this->dbh->beginTransaction(); // katsotaan ensin tarvitseeko nimeä muuttaa if($nimi!=$_SESSION['leffat'][$eid][0]) { $sql = $this->dbh->prepare('UPDATE Movie SET MovieName = :nimi WHERE MovieID = :eid'); if(!$sql) { print_r($this->dbh->errorInfo()); $this->dbh->rollBack(); return false; } $sql->bindParam(":nimi",$nimi); $sql->bindParam(":eid",$eid); $ok = $sql->execute(); if(!$ok) { //print_r($sql->errorInfo()); $this->dbh->rollBack(); return false; } } // seuraavaksi katsotaan tarvitseeko poistaa yhtään liitosta // - preparointi tehdään joka tapauksessa, eli se voi olla turhakin, // jos poistoja ei tarvitse tehdä // - toinen vaihtoehto olisi siirtää se silmukan sisään, jolloin sitä // ei kutsuttaisi, jos poistoja ei tarvitsisi tehdä // - tällöin useamman poiston tapauksessa sitä kuitenkin kutsuttaisiin // turhaan monta kertaa $sql = $this->dbh->prepare('DELETE FROM Participates WHERE Actor_ActorID = :nayttelija AND Movie_MovieID = :elokuva'); if(!$sql) { print_r($this->dbh->errorInfo()); $this->dbh->rollBack(); return false; } foreach($_SESSION['leffat'][$eid][1] as $nayttelija) { if(!in_array($nayttelija,$nayttelijat)) { $sql->bindParam(":nayttelija",$nayttelija); $sql->bindParam(":elokuva",$eid); $ok = $sql->execute(); if(!$ok) { print_r($sql->errorInfo()); $this->dbh->rollBack(); return false; } } } // lopuksi lisätään tarvittaessa uusia liitoksia // - preparointi tehdään joka tapauksessa, eli se voi olla turhakin, // jos lisäyksiä ei tarvitse tehdä // - toinen vaihtoehto olisi siirtää se silmukan sisään, jolloin sitä // ei kutsuttaisi, jos lisäyksiä ei tarvitsisi tehdä // - tällöin useamman lisäyksen tapauksessa sitä kuitenkin kutsuttaisiin // turhaan monta kertaa $sql = $this->dbh->prepare('INSERT INTO Participates VALUES (:elokuva, :nayttelija)'); if(!$sql) { print_r($this->dbh->errorInfo()); $this->dbh->rollBack(); return false; } foreach($nayttelijat as $nayttelija) { if($nayttelija==0) { break; } if(!in_array($nayttelija,$_SESSION['leffat'][$eid][1])) { $sql->bindParam(":elokuva",$eid); $sql->bindParam(":nayttelija",$nayttelija); $ok = $sql->execute(); if(!$ok) { print_r($sql->errorInfo()); $this->dbh->rollBack(); return false; } } } $this->dbh->commit(); return true; } // metodi muokkaa näyttelijän tietoja // tietokantakutsuja tehdään vain jos on muokattavaa // muokkauksessa käytetään transaktioita public function muokkaa_nayttelija($nid,$nimi,$elokuvat) { $this->dbh->beginTransaction(); // katsotaan ensin tarvitseeko nimeä muuttaa if($nimi!=$_SESSION['nayttelijat'][$nid][0]) { $sql = $this->dbh->prepare('UPDATE Actor SET ActorName = :nimi WHERE ActorID = :nid'); if(!$sql) { print_r($this->dbh->errorInfo()); $this->dbh->rollBack(); return false; } $sql->bindParam(":nimi",$nimi); $sql->bindParam(":nid",$nid); $ok = $sql->execute(); if(!$ok) { //print_r($sql->errorInfo()); $this->dbh->rollBack(); return false; } } // seuraavaksi katsotaan tarvitseeko poistaa yhtään liitosta // - preparointi tehdään joka tapauksessa, eli se voi olla turhakin, // jos poistoja ei tarvitse tehdä // - toinen vaihtoehto olisi siirtää se silmukan sisään, jolloin sitä // ei kutsuttaisi, jos poistoja ei tarvitsisi tehdä // - tällöin useamman poiston tapauksessa sitä kuitenkin kutsuttaisiin // turhaan monta kertaa $sql = $this->dbh->prepare('DELETE FROM Participates WHERE Movie_MovieID = :elokuva AND Actor_ActorID = :nayttelija'); if(!$sql) { print_r($this->dbh->errorInfo()); $this->dbh->rollBack(); return false; } foreach($_SESSION['nayttelijat'][$nid][1] as $elokuva) { if(!in_array($elokuva,$elokuvat)) { $sql->bindParam(":elokuva",$elokuva); $sql->bindParam(":nayttelija",$nid); $ok = $sql->execute(); if(!$ok) { print_r($sql->errorInfo()); $this->dbh->rollBack(); return false; } } } // lopuksi lisätään tarvittaessa uusia liitoksia // - preparointi tehdään joka tapauksessa, eli se voi olla turhakin, // jos lisäyksiä ei tarvitse tehdä // - toinen vaihtoehto olisi siirtää se silmukan sisään, jolloin sitä // ei kutsuttaisi, jos lisäyksiä ei tarvitsisi tehdä // - tällöin useamman lisäyksen tapauksessa sitä kuitenkin kutsuttaisiin // turhaan monta kertaa $sql = $this->dbh->prepare('INSERT INTO Participates VALUES (:elokuva, :nayttelija)'); if(!$sql) { print_r($this->dbh->errorInfo()); $this->dbh->rollBack(); return false; } foreach($elokuvat as $elokuva) { if($elokuva==0) { break; } if(!in_array($elokuva,$_SESSION['nayttelijat'][$nid][1])) { $sql->bindParam(":nayttelija",$nid); $sql->bindParam(":elokuva",$elokuva); $ok = $sql->execute(); if(!$ok) { print_r($sql->errorInfo()); $this->dbh->rollBack(); return false; } } } $this->dbh->commit(); return true; } // metodi tulostaa elokuvat ja niihin liittyvät näyttelijät kaksitasoisena listana public function tulosta_elokuvat_ja_nayttelijat($sql) { $rivi = $sql->fetch(PDO::FETCH_ASSOC); while($rivi) { $sisalista = false; $leffa = $rivi['MovieName']; echo '
  • '.htmlentities($leffa); if($rivi['ActorName']!="") { echo "\n".''."\n"; } echo '
  • '."\n"; } } // metodi tulostaa näyttelijät ja heihin liittyvät elokuvat kaksitasoisena listana public function tulosta_nayttelijat_ja_elokuvat($sql) { $rivi = $sql->fetch(PDO::FETCH_ASSOC); while($rivi) { $sisalista = false; $nayttelija = $rivi['ActorName']; echo '
  • '.htmlentities($nayttelija); if($rivi['MovieName']!="") { echo "\n".''."\n"; } echo '
  • '."\n"; } } // metodi tulostaa näyttelijät valintalistan kohteina public function tulosta_nayttelijat($sql) { while($rivi = $sql->fetch(PDO::FETCH_ASSOC)) { echo ''."\n"; } } // metodi tulostaa elokuvat valintalistan kohteina public function tulosta_elokuvat($sql) { while($rivi = $sql->fetch(PDO::FETCH_ASSOC)) { echo ''."\n"; } } // metodi tulostaa elokuvat valintalistan kohteina, pohjalle aiemmat valinnat // palauttaa myös liitostaulukon, jonka perusteella tehdään tallennuksia sessioihin public function tulosta_elokuvat_muokkaukseen($sql_liitokset,$sql_leffat) { $liitokset = array(); echo ''."\n"; while($rivi = $sql_leffat->fetch(PDO::FETCH_ASSOC)) { echo ''."\n"; } return $liitokset; } // metodi tulostaa näyttelijät valintalistan kohteina, pohjalle aiemmat valinnat // palauttaa myös liitostaulukon, jonka perusteella tehdään tallennuksia sessioihin public function tulosta_nayttelijat_muokkaukseen($sql_liitokset,$sql_nayttelijat) { $liitokset = array(); echo ''."\n"; while($rivi = $sql_nayttelijat->fetch(PDO::FETCH_ASSOC)) { echo ''."\n"; } return $liitokset; } // metodit tulostaa kaikki kannasta löytyneet näyttelijät linkkeinä public function tulosta_nayttelijat_linkkeina($sql) { while($rivi = $sql->fetch(PDO::FETCH_ASSOC)) { echo ''. htmlentities($rivi['ActorName']).'
    '."\n"; } } // metodit tulostaa kaikki kannasta löytyneet elokuvat linkkeinä public function tulosta_elokuvat_linkkeina($sql) { while($rivi = $sql->fetch(PDO::FETCH_ASSOC)) { echo ''. htmlentities($rivi['MovieName']).'
    '."\n"; } } } ?>