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 )
; " ;
2021-11-23 17:26:20 +01:00
$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 " ;
}
}
2021-11-23 17:26:20 +01:00
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
}