is115-php/modul6/forberedelser.php

490 lines
16 KiB
PHP
Raw Normal View History

2021-11-03 23:15:59 +01:00
<?php
require 'database.php';
2021-11-18 20:49:17 +01:00
DEFINE('SELECTED', 'selected');
2021-11-22 16:33:31 +01:00
2021-11-03 23:15:59 +01:00
$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,
2021-11-18 20:49:17 +01:00
mobilnummer VARCHAR(12),
2021-11-03 23:15:59 +01:00
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)
);
2021-11-22 16:33:31 +01:00
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');
2021-11-03 23:15:59 +01:00
";
2021-11-22 16:33:31 +01: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
2021-11-22 16:33:31 +01:00
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";
}
}
2021-11-22 16:33:31 +01:00
2021-11-03 23:15:59 +01:00
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 {
2021-11-22 16:33:31 +01:00
public static $stringNames = array("fornavn", "etternavn", "adresse1", "adresse2", "poststed", "mobilnummer", "epost", "kjoenn", "kontigentstatus"); // Tatt ut fra tidligere "interesser", "kursaktiviteter",
2021-11-18 20:49:17 +01:00
public static $intFields = array("postnummer");
public static $dateFields = array("dob", "medlem_siden");
public string $rolle = "Standard"; //TODO: Implementer roller
2021-11-03 23:15:59 +01:00
public int $dbid;
public string $fornavn = '';
public string $etternavn = '';
public string $adresse1 = '';
public string $adresse2 = '';
public int $postnummer;
public string $poststed = '';
2021-11-18 20:49:17 +01:00
public string $mobilnummer = '';
2021-11-03 23:15:59 +01:00
public string $epost = '';
public DateTime $dob;
public string $kjoenn = '';
2021-11-21 00:48:35 +01:00
public array $interesser = array();
2021-11-03 23:15:59 +01:00
public string $kursaktiviteter = '';
public DateTime $medlem_siden;
public string $kontigentstatus = '';
2021-11-18 20:49:17 +01:00
public $endret = array();
public static function getFromId($dbid): Medlem {
return hentMedlem($dbid);
}
2021-11-03 23:15:59 +01:00
public function set($felt, $verdi){
2021-11-18 20:49:17 +01:00
if($this->{$felt} != $verdi){
$this->{$felt} = $verdi;
$this->endret[] = $felt;
return true;
}
return false;
2021-11-03 23:15:59 +01:00
}
public function get($felt){
return $this->${$felt};
}
2021-11-22 16:33:31 +01:00
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
2021-11-18 20:49:17 +01:00
!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) &&
2021-11-22 16:33:31 +01:00
!empty($this->kontigentstatus);*/
2021-11-18 20:49:17 +01:00
}
public function persistMember(){
2021-11-22 16:33:31 +01:00
if(empty($this->verifyMember())){
2021-11-18 20:49:17 +01:00
$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(){
2021-11-22 16:33:31 +01:00
// $db = getPdoConn();
2021-11-18 20:49:17 +01:00
$updateSQLValues = array();
foreach ($this->endret as $key => $value){
$updateSQLValues[] = "$value = ?";
}
$sql = "UPDATE Medlem SET ".implode(', ', $updateSQLValues);
$sql .= " WHERE medlemId = ?";
2021-11-22 16:33:31 +01:00
echo $sql;
2021-11-18 20:49:17 +01:00
// $statement = $db->prepare($sql);
// LOOP
// $statement->bindParam()
}
2021-11-03 23:15:59 +01:00
}
2021-11-18 20:49:17 +01:00
function hentPoststed($postnummer) {
2021-11-03 23:15:59 +01:00
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'];
}
}
2021-11-18 20:49:17 +01:00
return $poststed[$postnummer] ?? false;
}
function hentMedlem($dbid){
return hentMedlemmer(null, null, $dbid)[$dbid];
}
2021-11-22 16:33:31 +01:00
function hentMedlemmer($perSide = 20, $side = 1, $medlemId = 0): array {
2021-11-18 20:49:17 +01:00
$sideStart = $side?($side-1)*$perSide:0;
$medlemmer = array();
2021-11-21 00:48:35 +01:00
$order = array();
2021-11-18 20:49:17 +01:00
$hentMedlemmerSQL = "
2021-11-22 16:33:31 +01:00
SELECT medlemId, fornavn, etternavn, adresse, m.postnummer, p.poststed, mobilnummer, epost, dob, kjoenn, kontigentStatus, medlemStart
2021-11-18 20:49:17 +01:00
FROM Medlem m
INNER JOIN Postnummer p ON m.postnummer = p.postnummer
";
2021-11-22 16:33:31 +01:00
// Hvis det er spesifisert en medlemsid legges en WHERE til i SQL-spørringen
2021-11-18 20:49:17 +01:00
if($medlemId > 0){
$hentMedlemmerSQL .= " WHERE `medlemId` = ?";
}
else {
2021-11-22 16:33:31 +01:00
// Tillater dynamisk sortering
2021-11-21 00:48:35 +01:00
$order[] = "etternavn";
$order[] = "fornavn";
$hentMedlemmerSQL .= "ORDER BY ".implode(', ', $order)." LIMIT $sideStart,$perSide";
2021-11-18 20:49:17 +01:00
}
try {
2021-11-22 16:33:31 +01:00
// Åpne databasetilkobling som definert lengre oppe.
2021-11-18 20:49:17 +01:00
$db = getPdoConn();
2021-11-22 16:33:31 +01:00
// Forbered spørringen
2021-11-18 20:49:17 +01:00
$statement = $db->prepare($hentMedlemmerSQL);
2021-11-22 16:33:31 +01:00
// Hvis det er spesifisert en medlemsId legges verdien inn her
2021-11-18 20:49:17 +01:00
if($medlemId > 0){
$statement->bindValue(1,$medlemId);
}
2021-11-22 16:33:31 +01:00
// Utfør spørringen
2021-11-18 20:49:17 +01:00
$statement->execute();
// Fetchmode FETCH_ASSOC for å få med keys-verdiene
$statement->setFetchMode(PDO::FETCH_ASSOC);
2021-11-22 16:33:31 +01:00
foreach ($statement->fetchAll() as $row){
// Defineres et nytt objekt per Medlem-klassen. (Se lengre oppe)
// Deretter settes alle verdiene inn
2021-11-18 20:49:17 +01:00
$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'];
2021-11-22 16:33:31 +01:00
$medlem->mobilnummer = $row['mobilnummer'] ?? '';
2021-11-18 20:49:17 +01:00
$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){
2021-11-22 16:33:31 +01:00
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);
}
2021-11-18 20:49:17 +01:00
} 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;
}
}
2021-11-21 00:48:35 +01:00
function hentAktivitet($id = false, $all = false){
2021-11-18 20:49:17 +01:00
$aktiviteter = array();
2021-11-21 00:48:35 +01:00
$where = array();
2021-11-18 20:49:17 +01:00
if($id){
2021-11-21 00:48:35 +01:00
$where[] = "aktivitetId = ?";
}
if(!$all){
$where[] = "slutt > now()";
}
$sql = "SELECT * FROM Aktivitet";
if(!empty($where)){
$sql .= " WHERE ".implode(' AND ', $where);
2021-11-18 20:49:17 +01:00
}
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){
2021-11-22 16:33:31 +01:00
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;
}
2021-11-18 20:49:17 +01:00
}
finally {
$db = null;
}
if($id && count($aktiviteter) == 1){
return $aktiviteter[0];
}
return $aktiviteter;
2021-11-21 00:48:35 +01:00
}
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){
2021-11-22 16:33:31 +01:00
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;
}
2021-11-21 00:48:35 +01:00
}
finally {
$db = null;
}
return $interesser;
2021-11-03 23:15:59 +01:00
}