is115-php/modul6/forberedelser.php

286 lines
8.8 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)
);
";
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", "interesser", "kursaktiviteter", "kontigentstatus");
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 string $interesser = '';
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():bool{
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($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"));
echo $statement->queryString;
$statement->execute();
// var_dump($statement);
}
// '{$this->fornavn}', '{$this->etternavn}', '{$this->adresse1}\n{$this->adresse2}'
}
public function updateMemberRow(){
$db = getPdoConn();
$updateSQLValues = array();
foreach ($this->endret as $key => $value){
$updateSQLValues[] = "$value = ?";
}
$sql = "UPDATE Medlem SET ".implode(', ', $updateSQLValues);
$sql .= " WHERE medlemId = ?";
// $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){
$sideStart = $side?($side-1)*$perSide:0;
$medlemmer = array();
$hentMedlemmerSQL = "
SELECT medlemId, fornavn, etternavn, adresse, m.postnummer, p.poststed, epost, dob, kjoenn, kontigentStatus, medlemStart
FROM Medlem m
INNER JOIN Postnummer p ON m.postnummer = p.postnummer
";
if($medlemId > 0){
$hentMedlemmerSQL .= " WHERE `medlemId` = ?";
}
else {
$hentMedlemmerSQL .= "ORDER BY etternavn, fornavn LIMIT $sideStart,$perSide";
}
try {
// Åpne databasetilkobling som definert
$db = getPdoConn();
// Prepare and execute statement
$statement = $db->prepare($hentMedlemmerSQL);
if($medlemId > 0){
$statement->bindValue(1,$medlemId);
}
$statement->execute();
// Fetchmode FETCH_ASSOC for å få med keys-verdiene
$statement->setFetchMode(PDO::FETCH_ASSOC);
$resultat = $statement->fetchAll();
foreach ($resultat as $row){
$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->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){
echo "SQL-feil: <br>\n".$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){
$aktiviteter = array();
$sql = "SELECT * FROM Aktivitet;";
if($id){
$sql = "SELECT * FROM Aktivitet WHERE aktivitetId = ?";
}
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){
echo "SQL-feil: <br>\n".$e;
}
finally {
$db = null;
}
if($id && count($aktiviteter) == 1){
return $aktiviteter[0];
}
return $aktiviteter;
}