342 lines
10 KiB
PHP
342 lines
10 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 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():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();
|
|
$order = 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 {
|
|
$order[] = "etternavn";
|
|
$order[] = "fornavn";
|
|
$hentMedlemmerSQL .= "ORDER BY ".implode(', ', $order)." 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, $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){
|
|
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){
|
|
echo "SQL-feil: ".$e;
|
|
}
|
|
finally {
|
|
$db = null;
|
|
}
|
|
return $interesser;
|
|
} |