is115-php/modul6/forberedelser.php

490 lines
16 KiB
PHP

<?php
require 'database.php';
DEFINE('SELECTED', 'selected');
$tabellSQL = "
CREATE OR REPLACE TABLE Postnummer (
postnummer INT(4) NOT NULL PRIMARY KEY,
poststed VARCHAR(30) NOT NULL
);
CREATE OR REPLACE TABLE Medlem (
medlemId INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
fornavn VARCHAR(40) NOT NULL,
etternavn VARCHAR(40) NOT NULL,
adresse VARCHAR(40) NOT NULL,
postnummer INT(4) NOT NULL,
mobilnummer VARCHAR(12),
epost VARCHAR(100) NOT NULL UNIQUE,
dob DATE NOT NULL,
kjoenn ENUM('M', 'F', 'O') NOT NULL,
kontigentStatus ENUM('BETALT', 'IKKE_BETALT') NOT NULL DEFAULT 'IKKE_BETALT',
medlemStart DATE NOT NULL,
FOREIGN KEY (postnummer) REFERENCES Postnummer(postnummer)
);
INSERT INTO Postnummer VALUES (4462, 'Hovsherad'), (4614, 'Kristiansand');
INSERT INTO Medlem VALUES
(NULL, 'Jens', 'Jensen', 'Brødgata 12', 4462, '12345678', 'jens@jensen.org', '2000-11-19', 'M', 'BETALT', '2019-11-11'),
(NULL, 'Per', 'Persen', 'Per Gaten', 4614, '87654321', 'perper@pearson.org', '1996-01-18', 'O', 'BETALT', '2019-11-12'),
(NULL, 'Lina', 'Linn', 'Linjegata 72', 4614, '12341234', 'linn@linnea.no', '2002-07-26', 'F', 'BETALT', '2019-11-13')
;";
$aktivitetSQL = "CREATE OR REPLACE TABLE Aktivitet (
aktivitetId int auto_increment primary key,
navn varchar(40) not null,
beskrivelse varchar(500) default '' null,
ansvarligId int not null,
start datetime not null,
slutt datetime not null,
constraint aktivitet_ansvarlig_FK foreign key (ansvarligId) references Medlem (medlemId)
);
INSERT INTO Aktivitet VALUES
(NULL, 'Kino', 'Kinodag i kristiansand woho', 1, '2021-07-07 19:00', '2021-07-07 21:00'),
(NULL, 'Tur', 'Tur til kina', 1, '2021-12-07 19:00', '2022-03-07 21:00'),
(NULL, 'Turnering', 'Fotball Turnering', 1, '2022-07-07 19:00', '2022-07-07 21:00');
";
$interesseSQL = "
CREATE OR REPLACE TABLE Interesse (
interesseId int auto_increment primary key,
navn varchar(30) not null
);
CREATE OR REPLACE TABLE Interesse_register (
medlemId int not null,
interesseId int not null,
primary key (medlemId, interesseId),
constraint interesse_medlem_FK foreign key (medlemId) references Medlem (medlemId),
constraint interesse_FK foreign key (interesseId) references Interesse (interesseId)
);
INSERT INTO Interesse VALUES
(NULL, 'Biljard'),
(NULL, 'Bordtennis'),
(NULL, 'Dans'),
(NULL, 'Musikk');
INSERT INTO Interesse_register VALUES
(1, 1), (1, 2),
(2, 1), (2, 2), (2, 4),
(3, 2), (3, 3)
;";
$brukerSQL = "
CREATE OR REPLACE TABLE Bruker (
brukerId INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
epost VARCHAR(100) NOT NULL UNIQUE,
passord VARCHAR(500) NOT NULL
);
INSERT INTO Bruker VALUES (null, 'test@test.com', '$2y$10\$Xo7MwAip3IwpQjB2QNRTJOfXPplrQbR0V15O4ZHX5zkxXDzYdiv9y')"; // Passord1234
if(isset($_POST['lagMedlemTabell'])){
try {
$db = getPdoConn();
$db->exec($tabellSQL);
$db = null;
echo "Lagde medlemstabell"."<br>\n";
}
catch (PDOException $e){
echo "Greide ikke lage tabell:<br>\n".$e."<br>\n";
}
}
elseif(isset($_POST['lagAktivitetTabell'])){
try {
$db = getPdoConn();
$db->exec($aktivitetSQL);
$db = null;
echo "Lagde aktivitetstabell"."<br>\n";
}
catch (PDOException $e){
echo "Greide ikke lage aktivitetstabell:<br>\n".$e."<br>\n";
}
}
elseif(isset($_POST['lagInteresseTabell'])){
try {
$db = getPdoConn();
$db->exec($interesseSQL);
$db = null;
echo "Lagde interessetabell!"."<br>\n";
}
catch (PDOException $e){
echo "Greide ikke lage interesse-tabell:<br>\n".$e."<br>\n";
}
}
elseif(isset($_POST['lagBrukerTabell'])){
try {
$db = getPdoConn();
$db->exec($brukerSQL);
$db = null;
echo "Lagde brukertabell!"."<br>\n";
}
catch (PDOException $e){
echo "Greide ikke lage bruker-tabell:<br>\n".$e."<br>\n";
}
}
function getPdoConn(): PDO {
$conn = new PDO("mysql:host=" . DB_HOST . ";dbname=" . DB_BASE . "", DB_USER, DB_PASS);
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
return $conn;
}
class Medlem {
public static $stringNames = array("fornavn", "etternavn", "adresse1", "adresse2", "poststed", "mobilnummer", "epost", "kjoenn", "kontigentstatus"); // Tatt ut fra tidligere "interesser", "kursaktiviteter",
public static $intFields = array("postnummer");
public static $dateFields = array("dob", "medlem_siden");
public string $rolle = "Standard"; //TODO: Implementer roller
public int $dbid;
public string $fornavn = '';
public string $etternavn = '';
public string $adresse1 = '';
public string $adresse2 = '';
public int $postnummer;
public string $poststed = '';
public string $mobilnummer = '';
public string $epost = '';
public DateTime $dob;
public string $kjoenn = '';
public array $interesser = array();
public string $kursaktiviteter = '';
public DateTime $medlem_siden;
public string $kontigentstatus = '';
public $endret = array();
public static function getFromId($dbid): Medlem {
return hentMedlem($dbid);
}
public function set($felt, $verdi){
if($this->{$felt} != $verdi){
$this->{$felt} = $verdi;
$this->endret[] = $felt;
return true;
}
return false;
}
public function get($felt){
return $this->${$felt};
}
public function verifyMember() {
$err = array();
$fields = array("fornavn", "etternavn", "adresse1", "postnummer", "poststed");
foreach($fields as $field){
// Her brukes en metode som lar deg sjekke variabler fra en liste. ${ } lar deg sette inn andre variabler som da blir variabel-navnet.
if($this->{$field} == ""){
$err[] = "Feltet '".$field."' er tomt eller ugyldig.";
}
}
if($this->epost == ""){
$err[] = "Epost-adressen mangler.";
}
elseif(!strpos($this->epost, '@') && !strpos($this->epost, '.')){
$err[] = "Epost-adressen er ikke gylid.";
}
if($this->dob->diff( new DateTime() )->days < 1){
$err[] = "Medlemmet er født i dag. Sjekk om fødselsdatoen er riktig.";
}
if(!in_array($this->kjoenn, array("M","F","O"))){
$err[] = "Vennligst velg et kjønn.";
}
if(!in_array($this->kontigentstatus, array('BETALT', 'IKKE_BETALT'))){
$err[] = "Vennligst før inn om kontigenten er betalt.";
}
return $err;
/*return
!empty($this->fornavn) &&
!empty($this->etternavn) &&
!empty($this->adresse1) &&
!empty($this->postnummer) &&
!empty($this->epost) &&
!empty($this->dob) &&
!empty($this->kjoenn) &&
!empty($this->medlem_siden) &&
!empty($this->kontigentstatus);*/
}
public function persistMember(){
if(empty($this->verifyMember())){
$db = getPdoConn();
if(hentPoststed($this->postnummer) === false){
if(empty($this->poststed)){
throw new InvalidArgumentException("Kan ikke lage et poststed som ikke finnes. Sjekk at medlemmet har et oppgitt poststed.");
}
$kommuneStmt = $db->prepare("INSERT INTO Postnummer VALUES (?,?)");
$kommuneStmt->bindValue(1, $this->postnummer);
$kommuneStmt->bindValue(2, $this->poststed);
$kommuneStmt->execute();
}
$insertSQL = "INSERT INTO Medlem (fornavn, etternavn, adresse, postnummer, mobilnummer, epost, dob, kjoenn, kontigentStatus, medlemStart) VALUES (?,?,?,?,?,?,?,?,?,?);";
$statement = $db->prepare($insertSQL);
$statement->bindValue(1, $this->fornavn);
$statement->bindValue(2, $this->etternavn);
$statement->bindValue(3, $this->adresse1 . "\n" . $this->adresse2);
$statement->bindValue(4, $this->postnummer);
$statement->bindValue(5, $this->mobilnummer);
$statement->bindValue(6, $this->epost);
$statement->bindValue(7, $this->dob->format("Y-m-d"));
$statement->bindValue(8, $this->kjoenn);
$statement->bindValue(9, $this->kontigentstatus);
$statement->bindValue(10, $this->medlem_siden->format("Y-m-d"));
$statement->execute();
}
}
public function updateMemberRow(){
// $db = getPdoConn();
$updateSQLValues = array();
foreach ($this->endret as $key => $value){
$updateSQLValues[] = "$value = ?";
}
$sql = "UPDATE Medlem SET ".implode(', ', $updateSQLValues);
$sql .= " WHERE medlemId = ?";
echo $sql;
// $statement = $db->prepare($sql);
// LOOP
// $statement->bindParam()
}
}
function hentPoststed($postnummer) {
global $poststed;
if(!$poststed[ $postnummer ]){
$db = getPdoConn();
$stmt = $db->prepare("SELECT postnummer, poststed FROM Postnummer WHERE postnummer = ?");
$stmt->execute([$postnummer]);
foreach ($stmt as $row){
$poststed[$row['postnummer']] = $row['poststed'];
}
}
return $poststed[$postnummer] ?? false;
}
function hentMedlem($dbid){
return hentMedlemmer(null, null, $dbid)[$dbid];
}
function hentMedlemmer($perSide = 20, $side = 1, $medlemId = 0): array {
$sideStart = $side?($side-1)*$perSide:0;
$medlemmer = array();
$order = array();
$hentMedlemmerSQL = "
SELECT medlemId, fornavn, etternavn, adresse, m.postnummer, p.poststed, mobilnummer, epost, dob, kjoenn, kontigentStatus, medlemStart
FROM Medlem m
INNER JOIN Postnummer p ON m.postnummer = p.postnummer
";
// Hvis det er spesifisert en medlemsid legges en WHERE til i SQL-spørringen
if($medlemId > 0){
$hentMedlemmerSQL .= " WHERE `medlemId` = ?";
}
else {
// Tillater dynamisk sortering
$order[] = "etternavn";
$order[] = "fornavn";
$hentMedlemmerSQL .= "ORDER BY ".implode(', ', $order)." LIMIT $sideStart,$perSide";
}
try {
// Åpne databasetilkobling som definert lengre oppe.
$db = getPdoConn();
// Forbered spørringen
$statement = $db->prepare($hentMedlemmerSQL);
// Hvis det er spesifisert en medlemsId legges verdien inn her
if($medlemId > 0){
$statement->bindValue(1,$medlemId);
}
// Utfør spørringen
$statement->execute();
// Fetchmode FETCH_ASSOC for å få med keys-verdiene
$statement->setFetchMode(PDO::FETCH_ASSOC);
foreach ($statement->fetchAll() as $row){
// Defineres et nytt objekt per Medlem-klassen. (Se lengre oppe)
// Deretter settes alle verdiene inn
$medlem = new Medlem();
$medlem->dbid = $row['medlemId'];
$medlem->fornavn = $row['fornavn'];
$medlem->etternavn = $row['etternavn'];
$adresser = explode('\n', $row['adresse']);
$medlem->adresse1 = $adresser[0];
$medlem->adresse2 = $adresser[1] ?? '';
$medlem->postnummer = $row['postnummer'];
$medlem->poststed = $row['poststed'];
$medlem->mobilnummer = $row['mobilnummer'] ?? '';
$medlem->epost = $row['epost'];
$medlem->dob = DateTime::createFromFormat('Y-m-d', $row['dob'] );
$medlem->kjoenn = $row['kjoenn'];
$medlem->kontigentstatus = $row['kontigentStatus'];
$medlem->medlem_siden = DateTime::createFromFormat('Y-m-d', $row['medlemStart'] );
$medlemmer[$medlem->dbid] = $medlem;
}
}
catch (PDOException $e){
if($e->getCode() == "42S02"){
echo "Tabellen finnes ikke. <form method='post'><input type='submit' name='lagMedlemTabell' value='Lage den?'></form>";
}
else {
echo "SQL-feil: <br>\n".var_dump($e);
}
} finally {
$db = null;
return $medlemmer;
}
}
class Aktivitet {
public int $dbid;
public string $navn;
public string $beskrivelse;
public int $ansvarlig;
public ?DateTime $start = null;
public ?DateTime $slutt = null;
public function __construct($dbid, $navn, $beskrivelse, $ansvarlig, $start, $slutt){
$this->dbid = $dbid ?? 0;
$this->navn = $navn;
$this->beskrivelse = $beskrivelse;
$this->ansvarlig = $ansvarlig;
$this->start = $start ?? null;
$this->slutt = $slutt ?? null;
}
}
function hentAktivitet($id = false, $all = false){
$aktiviteter = array();
$where = array();
if($id){
$where[] = "aktivitetId = ?";
}
if(!$all){
$where[] = "slutt > now()";
}
$sql = "SELECT * FROM Aktivitet";
if(!empty($where)){
$sql .= " WHERE ".implode(' AND ', $where);
}
try {
$db = getPdoConn();
$stmt = $db->prepare($sql);
if($id){
$stmt->bindValue(1, $id);
}
$stmt->execute();
$stmt->setFetchMode(PDO::FETCH_ASSOC);
$res = $stmt->fetchAll();
foreach ($res as $row){
$start = DateTime::createFromFormat('Y-m-d H:i:s', $row['start']) ?? null;
$slutt = DateTime::createFromFormat('Y-m-d H:i:s', $row['slutt']) ?? null;
$aktiviteter[] = new Aktivitet(
$row['aktivitetId'],
$row['navn'],
$row['beskrivelse'],
$row['ansvarligId'],
$start,
$slutt
);
}
}
catch (PDOException $e){
if($e->getCode() == "42S02"){
echo "Tabellen finnes ikke. <form method='post'><input type='submit' name='lagAktivitetTabell' value='Lage den?'></form>";
}
else {
echo "SQL-feil: <br>\n".$e;
}
}
finally {
$db = null;
}
if($id && count($aktiviteter) == 1){
return $aktiviteter[0];
}
return $aktiviteter;
}
class Interesse {
public string $navn;
public array $medlemmer;
public function __construct($navn){
$this->navn = $navn;
}
}
function hentInteresser(){
$interesser = array();
$hentInteresseSQL = "
SELECT i.interesseId, i.navn, ir.medlemId
FROM Interesse i
LEFT OUTER JOIN Interesse_register ir on ir.interesseId = i.interesseId
ORDER BY i.navn
";
try {
$db = getPdoConn();
$stmt = $db->prepare($hentInteresseSQL);
$stmt->execute();
$stmt->setFetchMode(PDO::FETCH_ASSOC);
foreach($stmt->fetchAll() as $row){
if(!isset($interesser[$row['interesseId']])){
$interesser[$row['interesseId']] = new Interesse($row['navn']);
}
if(!isset($interesser[ $row['interesseId'] ]->medlemmer)){
$interesser[ $row['interesseId'] ]->medlemmer = array();
}
if($row['medlemId']){
$interesser[$row['interesseId']]->medlemmer[] = $row['medlemId'];
}
}
}
catch (PDOException $e){
if($e->getCode() == "42S02"){
echo "Tabellen finnes ikke. <form method='post'><input type='submit' name='lagInteresseTabell' value='Lage den?'></form>";
}
else {
echo "SQL-feil: ".$e;
}
}
finally {
$db = null;
}
return $interesser;
}