Nu börjar har jag mer eller mindre hamnat i fas för de två pågående kurserna (Databaser & Webbutveckling II).
Nedanför återfinns min inlämnade Labb 1 (eller "Moment 1") i Databaser-kursen [VT2023 DT003G Datateknik GR (A), Databaser, 7,5 hp (distans)]:
<Uppladdad bildlänk>
Det är en ER-modell för ett hypotetiskt filmuthyrningsföretag. Den har ej ännu rättats och den som upptäcker något "allvarligt uppenbart fel" får gärna anmärka på det!
Enligt en som läser år 2 i detta distansprogram sägs det att läraren verkar vara riktigt petig och att, "Det finns bara perfekta databaser som godkänns!". Det återstå att se hur det är med den saken. Många verkar än så länge ha fått kompletteringskrav (Fx) dock.
Resten av inlägget är kodkopior av Moment 2 i Webbutveckling II [VT2023 DT093G Datateknik GR (B), Webbutveckling II, 7,5 hp (distans)] då git-klonen är privat mellan mig och läraren (de använder GitHub Classroom för momenten).
Alla p-filer ("pages") ligger i rotkatalogen medan c-filer ("components") och config-filen ligger i underkatalogen include för den som vill lägga in allt och provköra med valfri Apache-server. CSS-filen i CSS-mapp såklart.
index.php
<?php include("include/config.php");?>
<?php
// Markera nuvarande sida med Box-shadow under dess Menyknapp (se c-nav.php)
$currentBtn=0;
?>
<title><?= pageTitle("Startsida"); ?></title>
<?php include("include/c-header.php");?>
<?php include("include/c-nav.php");?>
<?php include("p-questions.php");?>
<?php include("include/c-footer.php");?>
css/styles.css
/*
===============================
NORMALIZING + FONTS - All Pages
===============================
*/
* {
padding: 0;
margin: 0;
box-sizing: border-box;
font-size: 1rem;
font-family: 'Orbitron', sans-serif;
}
/*
==================
<BODY> - All Pages
==================
*/
body{
width: 100%;
margin: 0 auto;
}
/*
========================
FONT ELEMENTS - Standard
========================
*/
h1{
font-size: 3rem;
}
h2{
font-size: 2.1rem;
text-align: center;
margin-bottom: 20px;
}
h1,h2,h3{
font-family: 'Orbitron';
font-weight: 800;
}
h3{
font-size: 1.4rem;
text-align: center;
margin-bottom: 10px;
}
span,
i,
p{
font-size: 1.3rem;
line-height: 1.5;
max-width: 50em;
}
/*
========================
.main-layout div
========================
*/
.main-layout{
min-height: 100vh;
min-height: 100dvh;
display: grid;
grid-template-rows: auto 1fr auto;
background-color: rgb(56,59,58);
}
/*
========================
<nav> & .menu-btn
========================
*/
.menu-btn{
display: inline-block;
width: 200px;
padding: 20px;
font-size: 20px;
font-weight: 700;
cursor: pointer;
border: none;
background: #383b3a;
color: #1bbb85;
border: 2px solid #1bbb85;
border-radius: 5px;
text-align: center;
margin: 10px;
transition: background 400ms ease-out,
color 400ms ease-out;
}
.current-btn{
box-shadow: 5px 5px 5px #1bbb85, 5px -5px 5px #1bbb85, -5px 5px 5px #1bbb85, -5px -5px 5px #1bbb85;
}
a{
color: #1bbb85;
text-decoration: none;
}
.menu-btn:hover,
.menu-btn:focus{
background: #1bbb85;
border-radius: 5px;
}
.menu-btn:hover > a,
.menu-btn:focus > a{
color: #383b3a;
text-decoration: underline;
}
#nav-ul{
margin-top: 1rem;
display: flex;
flex-direction: row;
flex-wrap: wrap;
justify-content: space-evenly;
}
/*
===========================
<main>
===========================
*/
main{
margin: 0 auto;
padding-left: 10%;
padding-right: 10%;
}
/*
===========================
HEADER & FOOTER SETTINGS
===========================
*/
header, footer{
background: rgb(56,59,58);
background: linear-gradient(0deg, rgba(56,59,58,1) 0%, rgba(27,187,133,1) 35%, rgba(128,31,125,1) 100%);
}
header{
padding: 3%;
text-align: center;
}
footer{
padding: 3%;
text-align: center;
font-weight: bold;
}
#footer-text{
font-size: 0.9rem;
line-height: 1.5;
}
.main-layout{
min-width: 390px;
}
/*
===========================
page: questions
===========================
*/
.questions{
margin-top: 20px;
margin-bottom: 20px;
list-style-type:decimal;
font-size: 2rem;
}
.questions > strong{
display: inline-block;
font-size: 1.4rem;
max-width: 50em;
}
/*
===========================
page: variables
===========================
*/
.uppgifts-div{
background-color: white;
height: fit-content;
border: 2px solid #1bbb85;
border-radius: 5px;
padding: 20px;
box-shadow: 2px 2px 3px #1bbb85, 2px -2px 3px #1bbb85, -2px 2px 3px #1bbb85, -2px -2px 3px #1bbb85;
margin-bottom: 30px;
}
.variabel-ul{
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
}
.variabel-ul > li{
width: 250px;
}
.variabelP{
font-size: 1.1rem;
text-align: center;
}
.variabelP > a:hover,
.variabelP > a:focus,
.backA:hover,
.backA:focus{
color: black;
font-weight: bold;
}
/*
===========================
page: iterations
===========================
*/
.courseList{
display: flex;
flex-direction: column;
}
.courseList > li{
margin-left: 50px;
}
/*
===========================
page: forms
===========================
*/
#form, #form2{
display: grid;
grid-template-rows: 1fr 1fr;
gap: 10px;
}
label{
display: block;
}
input{
width: 100%;
}
#send,
#send2{
margin-bottom: 20px;
}
/*
===========================
page: fileread
===========================
*/
/*
===========================
MEDIA QUERIES
===========================
*/
@media only screen and (min-width: 1350px){
#nav-ul{
justify-content: center;
align-content: center;
}
}
@media only screen and (max-width : 600px){
#nav-ul{
justify-content: center;
align-content: center;
}
.menu-btn{
padding: 10px;
margin: 5px;
width: 175px;
}
h1{
font-size: 2rem;
}
span,
i,
p{
text-align: justify;
}
}
p-calculate.php
<?php include("include/config.php");?>
<?php
// Markera nuvarande sida med Box-shadow under dess Menyknapp (se c-nav.php)
$currentBtn=4;
?>
<title><?= pageTitle("Startsida"); ?></title>
<?php include("include/c-header.php");?>
<?php include("include/c-nav.php");?>
<div class="uppgifts-div">
<h3>Beräkna arean</h3>
<?php
// Kolla att Skicka knapp klickats
if(isset($_POST['skicka2'])){
// Kolla att BÅDA fält matats in
if(!empty($_POST['langd']) && !empty($_POST['bredd'])){
$langd = $_POST['langd'];
$bredd = $_POST['langd'];
echo "Längden $langd meter och bredden $bredd meter ger en area på " . $langd*$bredd . " kvadratmeter.";
}
// Annars skriv ut uppmaning om att mata in båda fält.
else{
echo "<span style='color: red; font-size:1rem;'>Både längd och bredd måste anges!</span>";
}
echo "<br><br><a href='p-forms.php' class='backA' style='display:block; text-align:center;'>Gå tillbaks till föregående sida</a>";
}
?>
</div>
<?php include("include/c-footer.php");?>
p-conditions.php
<?php include("include/config.php");?>
<?php
// Markera nuvarande sida med Box-shadow under dess Menyknapp (se c-nav.php)
$currentBtn=2;
?>
<title><?= pageTitle("Villkor"); ?></title>
<?php include("include/c-header.php");?>
<?php include("include/c-nav.php");?>
<h2>Moment 2 - 2. Villkor</h2>
<div class="uppgifts-div">
<h3>Datum/klockslag: ÅÅÅÅ-MM-DD:TT.MM</h3>
<?php
$dateNow = date('Y-m-d') . ':' . date('H.i');
echo "<p style='text-align: center;'>Datum/klockslag: $dateNow<br><br></p>";
?>
<h3>Idag är det (inte) söndag</h3>
<p style='text-align: center;'>Idag är det
<?php
$isSunday = date('D');
echo $isSunday === 'Sun' ? ' söndag' : ' inte söndag';
?>.<br><br></p>
<h3>Det är morgon/förmiddag/eftermiddag eller kväll/natt</h3>
<p style='text-align: center;'>Det är
<?php
// Gammalt variabelnamn från JS-Intro-kursen - gammal favorit!
$getHM = date('H:i');
if($getHM >= '06:00' && $getHM <= '08:59'){
echo 'morgon';
}
else if($getHM >= "09:00" && $getHM <= '11:59'){
echo 'förmiddag';
}
else if($getHM >= '12:00' && $getHM <= '17:59'){
echo 'eftermiddag';
}
else if($getHM >= '18:00' && $getHM <= '05:59'){
echo 'kväll/natt';
}
?>.</p>
<h3>Idag är det <i>Veckodag</i></h3>
<p style='text-align: center;'>Idag är det
<?php
$weekDay = date('D');
switch($weekDay){
case 'Mon':
echo 'måndag';
break;
case 'Tue':
echo 'tisdag';
break;
case 'Wed':
echo 'onsdag';
break;
case 'Thu':
echo 'torsdag';
break;
case 'Fri':
echo 'fredag';
break;
case 'Sat':
echo 'lördag';
break;
case 'Sun':
echo 'söndag';
break;
}?>.</p><br>
<?php echo nextPage('p-iterations','3. Upprepningar');?>
</div>
<?php include("include/c-footer.php");?>
p-fileread.php
<?php include("include/config.php");?>
<?php
// Markera nuvarande sida med Box-shadow under dess Menyknapp (se c-nav.php)
$currentBtn=5;
?>
<title><?= pageTitle("5. Filinläsning"); ?></title>
<?php include("include/c-header.php");?>
<?php include("include/c-nav.php");?>
<h2>Moment 2 - 5. Filinläsning</h2>
<div class="uppgifts-div">
<h3>Inläsning av extern textfil</h3>
<?php
// Om filen ej existerar.
if(!file_exists('courses.txt')){
echo "Filen kunde inte hittas!";
}
// Öppnna annars för inläsning ('r')
else{
echo "Filen finns. Öppnar den nu och skriver ut som en punktlista...<br><br>";
$fp = fopen('courses.txt','r');
// Skriver ut <ul>-element
echo "<ul style='margin-left: 30px;'>";
// feof = slutet på filen så betyder "så länge INTE
// slutet på filen har nåtts för öppnad fil $fp så..."
while(!feof($fp)){
echo "<li>" . fgets($fp) . "</li>";
}
// Avsluta punktlistan, skapa luft nedanför innan nästa länk
echo "</ul><br>";
}?>
<?php echo nextPage('index','0. Startsida/Frågor');?>
</div>
<?php include("include/c-footer.php");?>
p-forms.php
<?php include("include/config.php");?>
<?php
// Markera nuvarande sida med Box-shadow under dess Menyknapp (se c-nav.php)
$currentBtn=4;
?>
<title><?= pageTitle("4. Formulär"); ?></title>
<?php include("include/c-header.php");?>
<?php include("include/c-nav.php");?>
<h2>Moment 2 - 4. Formulär</h2>
<div class="uppgifts-div">
<h3>Del 1 - Skicka data med GET</h3>
<?php
// Kolla att Skicka knapp klickats
if(isset($_GET['skicka1'])){
// Kolla att BÅDA fält matats in
if(!empty($_GET['fname']) && !empty($_GET['ename'])){
$fornamn = $_GET['fname'];
$efternamn = $_GET['ename'];
// Skriv ut för -& efternamn
echo "Hej " . $fornamn . " " . $efternamn . "!";
}
// Annars skriv ut uppmaning om att mata in båda fält.
else{
echo "<span style='color: red; font-size:1rem;'>Du måste ange både för- och efternamn!</span>";
}
}
?>
<form id="form" action="p-forms.php" method="GET">
<div>
<label for="fnamn">Förnamn:</label>
<input id="fnamn" type="text" name="fname">
</div>
<div>
<label for="enamn">Efternamn:</label>
<input id="enamn" type="text" name="ename">
</div>
<input type="submit" name="skicka1" value="Skicka" id="send">
</form>
<h3>Del 2 - Skicka data med POST</h3>
<form id="form2" action="p-calculate.php" method="POST">
<div>
<p style="font-size: 1rem; margin-bottom: 5px;">Beräkna arean på en yta genom att ange längd och bredd.</p>
<label for="langd">Längd:</label>
<input id="langd" type="number" name="langd">
</div>
<div>
<label for="bredd">Bredd:</label>
<input id="bredd" type="number" name="bredd">
</div>
<input type="submit" value="Skicka" name="skicka2" id="send2">
</form>
<?php echo nextPage('p-fileread','5. Filinläsning');?>
</div>
<?php include("include/c-footer.php");?>
p-iterations.php
<?php include("include/config.php");?>
<?php
// Markera nuvarande sida med Box-shadow under dess Menyknapp (se c-nav.php)
$currentBtn=3;
?>
<title><?= pageTitle("3. Upprepningar"); ?></title>
<?php include("include/c-header.php");?>
<?php include("include/c-nav.php");?>
<h2>Moment 2 - 3. Upprepningar</h2>
<div class="uppgifts-div">
<h3>Del 1</h3>
<p style='text-align: center;'>
<?php
for($i = 10; $i>0; $i--){
echo $i . '<br>';
}
?>
</p><br>
<h3>Del 2</h3>
<p style="margin-bottom: 10px; text-align: center;">Kurslistan i den ordning kurserna ges:</p>
<?php
$arrCourses = array(
"Webbutveckling I","Introduktion till programmering med JavaScript",
"Grafisk teknik för webb för webb","Webbanvändbarhet","Webbutveckling II","Databaser",
"Webbdesign för CMS","Webbutveckling III"
);
// Skriv ut
echo '<ul class="courseList">';
foreach($arrCourses as $arrCourse){
echo "<li>$arrCourse</li>";
}
echo '</ul>';
?><br>
<h3>Del 3</h3>
<p style="margin-bottom: 10px; text-align: center;">Kurslistan i bokstavsordning:</p>
<?php
// Sortera och skriv ut
sort($arrCourses);
echo '<ul class="courseList">';
foreach($arrCourses as $arrCourse){
echo "<li>$arrCourse</li>";
}
echo '</ul>';
?><br>
<?php echo nextPage('p-forms','4. Formulär');?>
</div>
<?php include("include/c-footer.php");?>
p-questions.php
<h2>Moment 2 - Frågor</h2>
<ul>
<li class="questions">
<strong>Har du tidigare erfarenhet av utveckling med PHP?</strong>
<br><p>Nej, inte i denna utsträckning. Jag har för länge sedan kikat på det men förvirrats av dess sätt att användas på som exempelvis att skriva den direkt inuti HTML-kod. För säkert 10 år sedan öppnade jag upp diverse Wordpress-php-filer och förstod så klart ingenting.<br><br>Det blir roligt att öppna om samma Wordpress-filer efter CMS-kursen som då fokuserar på just Wordpress om jag minns rätt</p>
</li>
<li class="questions">
<strong>Beskriv kortfattat vad du upplever är fördelarna med att använda PHP för att skapa webbplatser.</strong>
<br><p>Två starka fördelar:<br><br>1) Den första är att kunna skapa mer dynamiska webbplatser snabbare tack vare det modulära tänket vilket jag älskar. Jag hoppas vi aldrig går tillbaka till "vanilla HTML" på det viset utan får hålla på med både modulär php, javascript, och så vidare. C# är ju objektorienterat och OOP anammar ju delvis det där modulära tänket som jag rent av älskar!<br><br>2) Den andra stora fördelen är att kunna skapa säkra webbplatser tack vare att php-koden döljs undan. Jag upptäckte även att kommentarer inuti php döljs men om man skriver HTML-kommentarer precis utanför php-koden så syns de slags kommentarerna.</p>
</li>
<li class="questions">
<strong>Hur har du valt att strukturera upp dina filer och kataloger?</strong>
<br><p>Jag har <i>index.php</i> i "webbserverns" rotkatalog. I mappen <i>include</i> så finns filer med prefix i filnamnen för att lättare veta vad som syftar på vad: "c" = component/komponent till en viss sida, "f" = funktion till en viss sida.<br><br>Notera således att funktionerna i <i>config.php</i> är medvetet globala då den filen ändå inkluderas på alla sidor. En första tanke var dock katalogerna <i>page</i> för sidorna (det vill säga, "p" = page/sida) och <i>function</i> för funktionerna.<br><br>Men det skippade jag då jag har haft problem med att länka rätt mellan filer som ligger i olika nivåer i olika kataloger än så länge.</p>
</li>
<li class="questions">
<strong>Har du följt guiden, eller skapat på egen hand?</strong>
<br><p>Jag har delvis följt guiden för den grundläggande strukturen sedd i <i>index.php</i>. Då var det bara att kopiera och klistra in för alla undersidor och inkludera nödvändig php-kod där för att lösa respektive uppgift.</p>
</li>
<li class="questions">
<strong>Har du gjort några förbättringar eller vidareutvecklingar av guiden (om du följt denna)?</strong>
<br><p>Vad som kan tolkas som förbättringar jag har gjort är i form av funktioner som kan anropas.
<br><br>Exempelvis så sätts ett värde för vilken sida man är på vilket sedan anropas i
<i>c-header.php</i> för att markera vilken nuvarande sida är. Detta syns <i>$currentBtn</i>-variabeln i början av undersidorna.
<br><br>Annan funktion är den som anropas inuti varje <i>title</i>-element för att skriva ut undersidans namn efter webbplatsens namn.
<br><br>En ytterligare funktion är den som anropas i slutet på varje uppgift: <i>nextPage</i> som returnar länknamn (ej filändelse) och strängen inom parentesen. Medför snabbare navigering.
<br><br>Funktionerna finns i <i>config.php</i> då de används på varje webbsida, exklusive <i>nextPage</i> på denna sida.</p>
</li>
<li class="questions">
<strong>Vilken utvecklingsmiljö har du använt för att genomföra uppgiften (editor, webbserver-paket (Xampp, Lamp, Wamp eller liknande)?</strong>
<br><p>Jag har använt mig av VSCode som huvudsaklig utvecklingsmiljö. Jag har använt mig av XAMPP som webbserver för PHP.<br><br>Installerade även <i>Apache</i> direkt som Service i Windows 10 för att slippa behöva starta XAMPP manuellt varje gång jag startar datorn.</p>
</li>
<li class="questions">
<strong>Har något varit svårt med denna uppgift?</strong>
<br><p>Ja, CSS som vanligt. En sak jag inte förstod var varför jag fick felmeddelande när jag valde att inkludera typsnitt lokalt, alltså med <i>@font-face</i>.<br><br>Då stod det i <i>Console</i> att <i>"download failed font"</i> (trots att jag såg att sökvägen till filen var rätt med kataloger och filnamn).<br><br>Så jag fick använda direktlänk till Google Fonts för det futuristiska typsnittet på denna webbplats. Jag vet inte om jag hade valt fel slags varianter av typsnitten (det var .tff) eller om det är något php och typsnitt jag inte begriper mig ännu på.</p>
</li>
</ul>
p-variables.php
<?php include("include/config.php");?>
<?php
// Markera nuvarande sida med Box-shadow under dess Menyknapp (se c-nav.php)
$currentBtn=1;
?>
<title><?= pageTitle("1. Variabler"); ?></title>
<?php include("include/c-header.php");?>
<?php include("include/c-nav.php");?>
<h2>Moment 2 - 1. Variabler</h2>
<div class="uppgifts-div">
<h3>Enskilda</h3>
<?php
// Skapar variabler
$name = "WebbKodsLärlingen";
$age = "33";
$email = "WKL@yolo.com";
echo "<ul class='variabel-ul'><li>$name</li><li>$age</li><li>$email</li></ul><br>";
?>
<h3>Kombinerade</h3>
<?php
echo "<p class='variabelP'>Hej! Jag heter $name"
. ", är " . $age . " år gammal och nås på följande e-post: "
. "<a href='mailto:$email'>$email</a>.</p><br>";
echo nextPage('p-conditions','2. Villkor');
?>
</div>
<?php include("include/c-footer.php");?>
include/c-footer.php
</main>
<footer>
<span id="footer-text">© 2023 WebbKodsLärlingen<br>
VT2023 DT093G Datateknik GR (B), Webbutveckling II, 7,5 hp (distans) - Moment 2</span>
</footer>
</div>
</body>
</html>
include/c-header.php
</head>
<body>
<div class="main-layout">
<div>
<header>
<h1>FRAMTIDSBLOGGEN I PHP MOMENT 2</h1>
</header>
include/c-nav.php
<nav>
<ul id="nav-ul">
<li class="menu-btn <?php echo setCurrentBtn(0); ?>">0.
<a href="index.php">
Startsida
</a>
</li>
<li class="menu-btn <?php echo setCurrentBtn(1); ?>">1.
<a href="p-variables.php">
Variabler
</a>
</li>
<li class="menu-btn <?php echo setCurrentBtn(2); ?>">2.
<a href="p-conditions.php">
Villkor
</a>
</li>
<li class="menu-btn <?php echo setCurrentBtn(3); ?>">3.
<a href="p-iterations.php">
Upprepningar
</a>
</li>
<li class="menu-btn <?php echo setCurrentBtn(4); ?>">4.
<a href="p-forms.php">
Formulär
</a>
</li>
<li class="menu-btn <?php echo setCurrentBtn(5); ?>">5.
<a href="p-fileread.php">
Filinläsning
</a>
</li>
</ul>
</nav>
</div>
<main>
include/config.php
<?php
// PHP-kod konfiguration innan någon faktisk HTML ens laddas först
// Funktion som ger extra CSS-klass så att vald menyknapp får grön box-shadow
function setCurrentBtn($btnNumber){
return $GLOBALS['currentBtn']==$btnNumber ? 'current-btn' : '';
}
// Funktion som skriver ut anropad sträng i <title>-element
function pageTitle($pTitle){
return "FRAMTIDSBLOGGEN i PHP Moment 2 | " . $pTitle;
}
// Funktion som länkar till nästa uppgiftslösning (undersida)
function nextPage($nPage, $pName){
return "<p style='text-align: center;' class='variabelP'><a href='$nPage.php'>Nästa uppgift ($pName)</a></p>";
}
// Här slutar PHP-koden och HTML laddas in. Dessa kommentarer syns ej i webbläsaren! :-)
?>
<!DOCTYPE html>
<html lang="sv">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="stylesheet" href="css/styles.css">
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Orbitron:wght@400;80..." rel="stylesheet">
På återseende!
Mvh,
WKL.
---------
✔️(B) HT2022 DT057G Datateknik GR (A), Webbutveckling I, 7,5 hp (distans)
✔️(A) HT2022 DT084G Datateknik GR (A), Introduktion till programmering i JavaScript, 7,5 hp (distans)
✔️(A) HT2022 DT068G Datateknik GR (B), Webbanvändbarhet, 7,5 hp (distans)
🚧(Inväntar slutbetyg) HT2022 DT200G Datateknik GR (A), Grafisk teknik för webb, 7,5 hp (distans)
🚧(Pågående) VT2023 DT093G Datateknik GR (B), Webbutveckling II, 7,5 hp (distans)
🚧(Pågående) VT2023 DT003G Datateknik GR (A), Databaser, 7,5 hp (distans)
Nu vet jag inte vad exakt uppgiften är, men skulder, förseningar, svartlistade och så vidare
Sen är det inte så enkelt med förnamn och efternamn, i asien är det vanligt att man säger ’Larsson Mikael’, dvs att familjenamnet kommer först
Sen kan jag tycka att man kan återanvända ett adressobjekt till alla delar istället för separata
Nu ska det också sägas att jag inte själv gjort exakt sådana diagram, så kanske är att jag missförstått något
Regissören har väl också ett namn, adresser kan innehålla land eller delstat och sånt, …
Går att göra mycket mer, som att tänka på underhåll och vad som händer om man vill ändra något i framtiden