'."\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 '