master
Eirik Th S 2021-11-24 15:32:50 +01:00
parent 8cab32e726
commit 0d09e76c73
8 changed files with 362 additions and 18 deletions

View File

@ -75,7 +75,7 @@ pre {
border-collapse: collapse;
}
.table tr:nth-child(2n) {
background-color: #0002;
background-color: #fff2;
}
.interesse-wrapper {

View File

@ -1 +0,0 @@
../modul1/index.php

41
modul8/index.php Normal file
View File

@ -0,0 +1,41 @@
<?php
$modul = substr($_SERVER['REQUEST_URI'],-2,1);
function getModuleName($input): string {
$oppg = substr($input, -5, 1);
if(is_numeric($oppg)){
return "Oppgave $oppg";
}
return explode('.', $input)[0];
}
?><!DOCTYPE html>
<html lang="no">
<head>
<title>IS-115 - Webprogrammering i PHP</title>
<link rel="stylesheet" href="../index.css">
</head>
<body>
<h1>IS-115 - Webprogrammering i PHP</h1>
<h3>
Modul <?=$modul;?>
</h3>
<h5>
<strong><a href="../">Tilbake til alle moduler</a></strong>
</h5>
<?php
$dir = array(
"index8_1.php",
"index8_2.php",
"index8_3.php",
"index8_4.php",
"index8_5.php"
);
foreach($dir as $item){
echo "<p><a href='$item'>".getModuleName($item)."</a></p>\n";
}
?>
</body>
</html>

View File

@ -1,7 +1,10 @@
<?php
include '../common.php';
// Logger for oppgave 2
include 'logger.inc.php';
Logger::log("Lastet modul 8 oppgave 1");
?><!DOCTYPE html>
<html lang="no">
<head>
@ -36,20 +39,23 @@ Logger::log("Lastet modul 8 oppgave 1");
// Scan nåværende mappe med scandir();
$katalog = array_diff( scandir("./"), array('..','.'));
// For hver fil i mappa gjøres sjekker:
foreach ($katalog as $fil){
echo "<tr>";
echo " <td>$fil</td>";
$type = filetype($fil);
echo " <td>".$type.($type == "file"?' ('.mime_content_type($fil).')':'')."</td>";
echo " <td>".filStr(filesize($fil))."</td>";
echo " <td>".date('d.m.y H:i', filemtime($fil))."</td>";
echo " <td>".(is_readable($fil)?"Ja":"Nei")."</td>";
echo " <td>".(is_writable($fil)?"Ja":"Nei")."</td>";
echo " <td>".(is_executable($fil)?"Ja":"Nei")."</td>";
echo " <td>$fil</td>"; // FILNAVNET
$type = pathinfo($fil, PATHINFO_EXTENSION); // Fil-endelse
if(filetype($fil) == "dir"){ $type = "mappe"; } // Hvis $fil er en mappe så skrives det
echo " <td>".$type."</td>";
echo " <td>".filStr(filesize($fil))."</td>"; // Skriver fint hvor stor filen er
echo " <td>".date('d.m.y H:i', filemtime($fil))."</td>"; // Skriver datoen for når filen ble sist endret
echo " <td>".(is_readable($fil)?"Ja":"Nei")."</td>"; // Sjekk om filen er lesbar
echo " <td>".(is_writable($fil)?"Ja":"Nei")."</td>"; // Sjekk om filen er skrivbar
echo " <td>".(is_executable($fil)?"Ja":"Nei")."</td>"; // Sjekk om filen er kjørbar
echo "</tr>\n";
}
function filStr(int $str){
// Kunne gått høyere, men ikke aktuelt i dette scenarioet
if($str / 1024 / 1024 > 1){ return round($str/1024/1024, 1)." MB"; }
else if($str / 1024 > 0){ return round($str/1024, 1)." KB"; }
else {

View File

@ -3,12 +3,25 @@ ini_set('display_errors',1);
include '../common.php';
include 'logger.inc.php';
//Logger::log("Lastet modul 8 oppgave 2");
if(!empty($_POST)){
if(isset($_POST['doOne'])) {
Logger::log("Gjorde noe");
}
else {
Logger::log("Gjorde noe annet!");
}
}
?><!DOCTYPE html>
<html lang="no">
<head>
<title><?=title();?></title>
<link rel="stylesheet" href="../index.css">
<style>
.table th {
padding-right: 10px;
}
</style>
</head>
<body>
@ -17,9 +30,23 @@ include 'logger.inc.php';
<h4><?=getNavigation();?></h4>
<h2>Loggfunksjon</h2>
<table class="table">
<caption><strong>Siste 10 loggmeldinger:</strong></caption>
<?php
Logger::sisteMeldinger();
$logg = Logger::sisteMeldinger();
foreach ($logg as $l){
echo "<tr>";
echo " <th>$l[0]</th>";
echo " <td>$l[1]</td>";
echo "</tr>\n";
}
?>
</table>
<form method="post">
<input type="submit" name="doOne" value="Gjør noe">
<input type="submit" name="doTwo" value="Gjør noe annet">
</form>
</div>
</body>

161
modul8/index8_3.php Normal file
View File

@ -0,0 +1,161 @@
<?php
include '../common.php';
// Bruker samme tilkoblingsinformasjon som er brukt i Modul 6.
include '../modul6/forberedelser.php';
include 'logger.inc.php';
Logger::log("Lastet modul 8 oppgave 3");
// Tilbakemeldingsholdere:
$err = array();
$msg = array();
// Mappe hvor bildene skal lagres
$medlemsBildeMappe = "medlemmer/";
// Hvis bildet skal lastes opp
if(isset($_POST["submit"], $_POST['medlemid'])){
// Hent filtypen for bildet
$imageFileType = strtolower(pathinfo(basename($_FILES["fileToUpload"]["name"]),PATHINFO_EXTENSION));
// Lag stien bildet skal ha
$target_file = $medlemsBildeMappe . $_POST['medlemid'].".".$imageFileType;
// Loggfør for oppgave 2
Logger::log("Startet opplasting av fil ".$target_file);
// Kontroll om det som er lastet opp er et bilde
$check = getimagesize($_FILES["fileToUpload"]["tmp_name"]);
if($check === false) {
$err[] = "Opplastet fil er ikke et bilde.";
}
// Kontroller filstørrelse
if($_FILES["fileToUpload"]["size"] > 2_000_000){ // 2 000 000 skal være 2MB
$err[] = "Bildets filstørrelse er for stor";
}
// Kontroller filtyper
if($imageFileType != "jpg" && $imageFileType != "png"){
$err[] = "Bildets filformat er ikke tillatt. Kun .jpg og .png er tillatt.";
}
// Loggfør om filen finnes fra før og blir overskrevet
if(file_exists($target_file)){
Logger::log("Medlemmet $_POST[medlemid] hadde allerede et bilde, som nå er skrevet over.");
}
// Hvis ingen feil, last opp bildet
if(empty($err)){
if(move_uploaded_file($_FILES['fileToUpload']['tmp_name'], $target_file)){
$msg[] = "Medlemmets bilde ble lastet opp!";
}
else {
$err[] = "Det skjedde noe galt med opplastingen, prøv på nytt.";
}
}
}
// Hvis et bildet er satt til å slettes
elseif(isset($_POST['fjernBilde'], $_POST['filnavn'])){
// Kjempeenkel sjekk om postens medlemsid finnes i filnavnet. ADVARSEL: kan (nok) misbrukes!!
if(strstr($_POST['filnavn'], $_POST['medlemid']) && !strstr('/', $_POST['filnavn'])){
// unlink sletter filer på filsystemet
if(unlink($medlemsBildeMappe."/".$_POST['filnavn'])){
$msg[] = "Bildet ble slettet!";
Logger::log("Slettet medlemsbilde ".$_POST['filnavn']);
}
}
else {
$err[] = "Bildet ble ikke slettet. Prøv igjen.";
}
}
?><!DOCTYPE html>
<html lang="no">
<head>
<title><?=title();?></title>
<link rel="stylesheet" href="../index.css">
</head>
<body>
<div class="container">
<h1><?=title();?></h1>
<h4><?=getNavigation();?></h4>
<h2>Medlemsliste</h2>
<?php
// Her skriver vi ut feilmeldinger eller suksess-meldinger som er generert. Dette for å få et finere brukergrensesnitt.
if(!empty($err)){
foreach ($err as $e){
echo "<p class='error'>".$e."</p>\n";
}
}
if(!empty($msg)){
foreach ($msg as $m){
echo "<p class='suksess'>".$m."</p>\n";
}
}
?>
</div>
<div style="text-align: center; margin-bottom: 50px;">
<?php
// Henter medlemmer fra modul 6. (Og spør om du vil lage dem i databasen din hvis tabellen ikke finnes)
$medlemmer = hentMedlemmer($_GET['size'] ?? 20, $_GET['page'] ?? 1);
// Lag tabell for medlemmer
if(!empty($medlemmer)){
?>
<table class="table">
<thead>
<tr>
<th>#</th>
<th>Fornavn</th>
<th>Etternavn</th>
<th>Poststed</th>
<th>E-post</th>
<th>Bilde</th>
</tr>
</thead>
<tbody>
<?php
foreach ($medlemmer as $medlemID => $medlem){
echo "<tr>\n";
echo " <td>".($medlem->dbid)."</td>\n";
echo " <td>".($medlem->fornavn ?? '')."</td>\n";
echo " <td>".($medlem->etternavn ?? '')."</td>\n";
echo " <td>".$medlem->poststed."</td>\n";
echo " <td>".($medlem->epost ?? '')."</td>\n";
// Hvis bildet for brukeren finnes i png (deretter jpg) skrives dette ut, sammen med en form for å slette
if(file_exists($medlemsBildeMappe."/".$medlem->dbid.'.png')){
echo "<td>";
echo "<img src='$medlemsBildeMappe/{$medlem->dbid}.png' style='height: 75px;'>";
echo "<form method='post'><input type='hidden' name='medlemid' value='".$medlem->dbid."'><input type='hidden' name='filnavn' value='{$medlem->dbid}.png'><input type='submit' value='Slett bilde' name='fjernBilde'></form>";
echo "</td>";
}
else if(file_exists($medlemsBildeMappe."/".$medlem->dbid.'.jpg')){
echo "<td>";
echo "<img src='$medlemsBildeMappe/{$medlem->dbid}.jpg' style='height: 75px;'>";
echo "<form method='post'><input type='hidden' name='medlemid' value='".$medlem->dbid."'><input type='hidden' name='filnavn' value='{$medlem->dbid}.jpg'><input type='submit' value='Slett bilde' name='fjernBilde'></form>";
echo "</td>";
}
else {
echo " <td>
<form method=\"post\" enctype=\"multipart/form-data\">
<input type='hidden' name='medlemid' value='".$medlem->dbid."'>
Last opp bilde<br>
<input type=\"file\" name=\"fileToUpload\" id=\"fileToUpload\" required>
<input type=\"submit\" value=\"Upload Image\" name=\"submit\">
</form></td>\n";
}
echo "</tr>\n";
}
?>
</tbody>
</table>
<?php } ?>
</div>
</body>
</html>

View File

@ -0,0 +1,31 @@
<?php
// Hvis ikke medlem-id er sendt med forespørselen så videresend brukeren til oppgave-siden
if(!isset($_GET['medlemid'])){
header("Location: index8_4.php");
}
$medlemsBildeMappe = "medlemmer/";
$mid = $_GET['medlemid'];
include 'logger.inc.php';
Logger::log("Startet nedlasting av bildet til medlem $mid");
// Sjekk om png-filen eksisterer
if(file_exists($medlemsBildeMappe."/".$mid.'.png')) {
// Set header med innholdet
header('Content-Type: image/png');
$ext = ".png";
}
// Sjekk om jpg-filen eksisterer
else if(file_exists($medlemsBildeMappe."/".$mid.'.jpg')){
header('Content-Type: image/jpeg');
$ext = ".jpg";
}
// 'Fortell' nettleseren at filen skal lastes ned
header('Content-Disposition: attachment; filename="'.$mid.$ext.'"');
// Skriv ut filens innhold
echo file_get_contents($medlemsBildeMappe."/".$mid.$ext);

77
modul8/index8_4.php Normal file
View File

@ -0,0 +1,77 @@
<?php
include '../common.php';
// Bruker samme tilkoblingsinformasjon som er brukt i Modul 6.
include '../modul6/forberedelser.php';
include 'logger.inc.php';
Logger::log("Lastet modul 8 oppgave 4");
$medlemsBildeMappe = "medlemmer/";
?><!DOCTYPE html>
<html lang="no">
<head>
<title><?=title();?></title>
<link rel="stylesheet" href="../index.css">
</head>
<body>
<div class="container">
<h1><?=title();?></h1>
<h4><?=getNavigation();?></h4>
<h2>Medlemsliste</h2>
</div>
<div style="text-align: center; margin-bottom: 50px;">
<?php
// Henter medlemmer fra modul 6. (Og spør om du vil lage dem i databasen din hvis tabellen ikke finnes)
$medlemmer = hentMedlemmer($_GET['size'] ?? 20, $_GET['page'] ?? 1);
// Lag tabell for medlemmer
if(!empty($medlemmer)){
?>
<table class="table">
<thead>
<tr>
<th>#</th>
<th>Fornavn</th>
<th>Etternavn</th>
<th>Poststed</th>
<th>E-post</th>
<th>Bilde</th>
</tr>
</thead>
<tbody>
<?php
foreach ($medlemmer as $medlemID => $medlem){
echo "<tr>\n";
echo " <td>".($medlem->dbid)."</td>\n";
echo " <td>".($medlem->fornavn ?? '')."</td>\n";
echo " <td>".($medlem->etternavn ?? '')."</td>\n";
echo " <td>".$medlem->poststed."</td>\n";
echo " <td>".($medlem->epost ?? '')."</td>\n";
echo "<td>";
if(file_exists($medlemsBildeMappe."/".$medlem->dbid.'.png')){
echo "<img src='$medlemsBildeMappe/{$medlem->dbid}.png' style='height: 75px;'>";
echo "<a href='index8_4-download.php?medlemid=".$medlem->dbid."'><button>Last ned...</button></a>";
}
else if(file_exists($medlemsBildeMappe."/".$medlem->dbid.'.jpg')){
echo "<img src='$medlemsBildeMappe/{$medlem->dbid}.jpg' style='height: 75px;'>";
echo "<a href='index8_4-download.php?medlemid=".$medlem->dbid."'><button>Last ned...</button></a>";
}
else {
echo " Medlemmet har ikke et bilde.\n";
}
echo "</td>\n";
echo "</tr>\n";
}
?>
</tbody>
</table>
<?php } ?>
</div>
</body>
</html>

View File

@ -3,27 +3,29 @@ define('LOGGFIL', 'log.log');
class Logger {
public static function log($melding){
if(!file_exists(LOGGFIL)){
file_put_contents(LOGGFIL,'');
}
$nesteRad = time().":\t ".$melding;
file_put_contents(LOGGFIL, file_get_contents(LOGGFIL)."\n".$nesteRad);
}
public static function sisteMeldinger($antall = 10){
$logOut = array();
if(!file_exists(LOGGFIL)){ return $logOut; }
$logg = explode("\n", file_get_contents(LOGGFIL));
for($i = count($logg)-1-$antall; $i < count($logg)-1; $i++){
for($i = count($logg)-$antall; $i < count($logg); $i++){
if($i > 0){
$loggRad = explode(":\t", $logg[$i], 2);
echo "<i>".date('d. M H:i:s', $loggRad[0])."</i> &nbsp;".$loggRad[1]."<br>";
}
else {
// break;
$logOut[] = array(date('d. M - H:i:s', $loggRad[0]), $loggRad[1]);
}
}
return $logOut;
}
}