Med boken følger det en nettbasert ressursside der du får tilgang til «kom i gang»-beskrivelser, programkode til bokens eksempler, flere oppgaver, løsningsforslag og annet fagstoff. Funksjonelle websider med PHP er en innføringsbok i webprogrammering skrevet for studenter ved høgskoler og universiteter og elever i den videregående skolen. Peter André Busch er førsteamanuensis ved Universitetet i Agder. Her underviser han i webprogrammering, e-forvaltning og hvordan IKT påvirker oss på ulike samfunnsområder og ulike nivåer.
Funksjonelle websider med PHP
Forfatteren har lagt opp boken slik at du tidlig kommer i gang med enkle programmer og hele tiden lærer teori hånd i hånd med den praktiske utførelsen. Sentrale elementer som tilordning, valg, løkker, innebygde funksjoner og metoder blir grundig forklart før objektorienterte begreper og metoder blir introdusert. Sikkerhetsaspekter ved webprogrammering blir behandlet tematisk. Boken har mange illustrerende eksempler underveis, og til slutt i hvert kapittel er det spørsmål, oppgaver og en rekke øvelser du kan teste ferdighetene dine på.
Peter André Busch
I denne boken vil du lære å utvikle funksjonelle og dynamiske websider ved å bruke et av verdens mest utbredte webprogrammeringsspråk, PHP. PHP er svært anvendelig og egnet for nybegynnere, og det har stor overføringsverdi til andre språk. Boken bygger på de siste utviklingene i PHP og gir deg en grunnleggende innføring i webprogrammering — fra nybegynnernivå til avansert bruker.
Funksjonelle websider med PHP
9788215049694_Busch_Objektorientert web-programmering i PHP.indd 1
03.02.2022 15:52
9788215049694_Busch_Objektorientert web-programmering i PHP.indd 2
03.02.2022 15:52
Peter André Busch
Funksjonelle websider med PHP En innføring i webprogrammering
universitetsforlaget
9788215049694_Busch_Objektorientert web-programmering i PHP.indd 3
03.02.2022 15:52
© Universitetsforlaget 2022 ISBN 978-82-15-04969-4 Materialet i denne publikasjonen er omfattet av åndsverklovens bestemmelser. Uten særskilt avtale med rettighetshaverne er enhver eksemplarfremstilling og tilgjengeliggjøring bare tillatt i den utstrekning det er hjemlet i lov eller tillatt gjennom avtale med Kopinor, interesseorgan for rettighetshavere til åndsverk. Utnyttelse i strid med lov eller avtale kan medføre erstatningsansvar og inndragning og kan straffes med bøter eller fengsel. Boken er utgitt med støtte fra Kunnskapsdepartementet ved Lærebokutvalget for høyere utdanning. Forfatteren har fått støtte fra Det faglitterære fond. Illustrasjonene til figur 1.5, 2.1, 4.2, 7.1 og 9.2 er laget av Linnea Vestre. Henvendelser om denne utgivelsen kan rettes til: Universitetsforlaget AS Postboks 508 Sentrum 0105 Oslo www.universitetsforlaget.no Omslag: Mette Gundersen Sats: ottaBOK Trykk og innbinding: 07 Media – 07.no Boken er satt med: Times LT Std 10,5/14
ED
79
07
M
NO - 1470
RKET TRY K ME RI KE
MIL JØ
Papir: 100 g Arctic Matt
IA – 2041
03
9788215049694_Busch_Objektorientert web-programmering i PHP.indd 4
03.02.2022 15:52
Innhold
Forord. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Takk . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
17 18
Kapittel 1 Hvordan fungerer weben? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Webens historie. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Webens innhold og struktur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . HTML. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . CSS. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Dynamisk innhold . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Kommunikasjon på internett. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Kort introduksjon til HTML. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Hva er PHP?. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Historikk. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Utbredelse. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Hvorfor velge PHP?. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Hva kan vi gjøre med PHP?. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Skjema. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Database. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Tilstandsbevaring. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Filbehandling. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . E-post. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Bli god i PHP-programmering. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Installering av PHP. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Spørsmål. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Oppgaver. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
19 19 21 22 23 26 26 31 37 40 41 42 43 43 43 43 44 44 45 46 49 49
Kapittel 2 Introduksjon til programmering med PHP. . . . . . . . . . . . . . . . . . . Grunnregler. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Identifisering av PHP-kode . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
51 51 51
5
9788215049694_Busch_Objektorientert web-programmering i PHP.indd 5
03.02.2022 15:52
Innhold
Mellomrom og linjeskift. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Små og store bokstaver. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Variabler og konstanter. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Hva er en variabel?. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Variable variabler. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Hva er en konstant? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Utskrift av variabler og konstanter. . . . . . . . . . . . . . . . . . . . . . . . . . . . . Datatyper . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Tekststrenger . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Numeriske verdier . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Boolske verdier. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Andre datatyper . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Finne datatype . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Endre datatype. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Operatorer. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Operatorenes forrang og evalueringsretning . . . . . . . . . . . . . . . . . . . . . Aritmetiske operatorer. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Operatorer for automatisk økning eller reduksjon. . . . . . . . . . . . . . . . . Sammenlikningsoperatorer. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Logiske operatorer. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Tilordningsoperatorer. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Bitvise operatorer. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Spesielle typer variabler og konstanter. . . . . . . . . . . . . . . . . . . . . . . . . . . . Superglobale variabler. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Predefinerte konstanter. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Sikkerhet på weben. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Ikke stol på eksterne data. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Beskyttelse av data. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . SQL-innsprøytning. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Cross-site scripting. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Tilganger . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Svake loggrutiner. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Manglende eller ufullstendige sikkerhetsinnstillinger. . . . . . . . . . . . . . Språkkunnskap og problemløsning . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Omformuler problemet. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Del opp problemet. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Start med det som er kjent. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Forenkle problemet. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Se etter analogier. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Eksperimenter. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
53 53 54 54 56 57 57 58 58 61 62 62 63 63 63 64 65 66 66 67 68 69 72 72 73 75 75 75 75 75 76 76 76 76 77 78 79 80 81 81
6
9788215049694_Busch_Objektorientert web-programmering i PHP.indd 6
03.02.2022 15:52
Innhold
Spørsmål. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Oppgaver. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Øvinger. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Øving 1. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Øving 2. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Øving 3. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Øving 4. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Øving 5. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
83 83 84 84 84 84 84 84
Kapittel 3 Funksjoner . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Hva er en funksjon, og hva brukes den til?. . . . . . . . . . . . . . . . . . . . . . . . . Funksjonsbiblioteket til PHP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Parametere . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Returverdier. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Hva kan innebygde funksjoner gjøre? . . . . . . . . . . . . . . . . . . . . . . . . . . . . Teksthåndtering . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Behandling av dato og tidspunkt . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Bruk av DateTime-familien. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Matematiske operasjoner. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Behandling av variabler. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Egenutviklede funksjoner. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Parametere . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Returverdier. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Kalle funksjoner. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Organisering av funksjoner . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Parametere med standardverdier . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Variablers arbeidsområde. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Dynamisk antall parametere. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Dynamiske funksjonskall. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Spørsmål. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Oppgaver. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Øvinger. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Øving 1. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Øving 2. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Øving 3. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Øving 4. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Øving 5. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
85 85 86 88 89 89 90 95 97 101 103 105 105 106 107 107 108 109 111 112 113 114 114 114 114 114 115 115
7
9788215049694_Busch_Objektorientert web-programmering i PHP.indd 7
03.02.2022 15:52
Innhold
Kapittel 4 Uttrykk og kontrollflyt . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Valgsetninger . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Bruksområde . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . if-setningen. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ?-operatoren. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Switch-setningen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Match-setningen. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Løkker. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Bruksområde . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . While-løkken . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Do..while-løkken . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . For-løkken . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Nøstede løkker. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Kontrollkommandoer. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Bruksområde . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Break og continue. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Goto. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Spørsmål. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Oppgaver. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Øvinger. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Øving 1. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Øving 2. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Øving 3. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Øving 4. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Øving 5. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
117 118 118 118 122 123 125 127 127 127 130 132 133 134 134 135 136 137 138 138 138 139 139 139 139
Kapittel 5 Matriser. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Hva er en matrise? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Bruksområde . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Nummererte og assosiative matriser . . . . . . . . . . . . . . . . . . . . . . . . . . . Referanser til elementer i matrisen. . . . . . . . . . . . . . . . . . . . . . . . . . . . . Multidimensjonal matrise. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Opprette, legge til og slette data i en matrise. . . . . . . . . . . . . . . . . . . . . . . Opprette matrise. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Opprette matrise med en rekke av verdier. . . . . . . . . . . . . . . . . . . . . . . Legge til verdier. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Slette verdier. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Organisering av matriser. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Størrelse på matrise . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Sjekke om et element eksisterer. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
141 141 141 142 143 144 145 145 148 148 149 150 150 151
8
9788215049694_Busch_Objektorientert web-programmering i PHP.indd 8
03.02.2022 15:52
Innhold
Hente nøkler eller verdier. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Sortering. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Sortering i naturlig rekkefølge. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Sortering av flere matriser på en gang. . . . . . . . . . . . . . . . . . . . . . . . . . Snu rekkefølgen av elementer i en matrise . . . . . . . . . . . . . . . . . . . . . . Lage tilfeldig organisering i matrise . . . . . . . . . . . . . . . . . . . . . . . . . . . Køsystem . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Fjerne duplikater . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Dele opp matrise. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Gå gjennom matriser . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Foreach-løkken. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Iterator-funksjonene. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Kjøring av funksjon på hvert element i matrisen. . . . . . . . . . . . . . . . . . Søke i matrise. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Konvertering mellom matriser og variabler. . . . . . . . . . . . . . . . . . . . . . . . Fra numeriske matriseelementer til variabler. . . . . . . . . . . . . . . . . . . . . Fra assosiative matriseelementer til variabler . . . . . . . . . . . . . . . . . . . . Lage matriseelementer fra variabler. . . . . . . . . . . . . . . . . . . . . . . . . . . . Operasjoner på hele matriser . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Kalkulere summen av en matrise. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Slå sammen matriser . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Forskjellen mellom matriser. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Spørsmål. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Oppgaver. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Øvinger. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Øving 1. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Øving 2. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Øving 3. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Øving 4. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Øving 5. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
152 153 155 156 157 158 158 159 159 160 160 162 163 164 166 166 168 168 169 169 170 171 172 172 173 173 173 173 173 174
Kapittel 6 Skjemabehandling . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Skjemaelementer i HTML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Tekstbokser. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Tekstfelt . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Avkrysningsbokser. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Radioknapper. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Nedtrekkslister. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Fargevelger. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Tall og glidebryter . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
175 175 176 176 177 179 180 182 182
9
9788215049694_Busch_Objektorientert web-programmering i PHP.indd 9
03.02.2022 15:52
Innhold
Dato- og tidsvelgere. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Skjulte felt . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Bruk av label-taggen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Sendknappen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Nyttige attributter i HTML5. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Automatisk utfylling av skjemafelt . . . . . . . . . . . . . . . . . . . . . . . . . . . . Automatisk fokusering på element. . . . . . . . . . . . . . . . . . . . . . . . . . . . . Hint om forventet innhold . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Påkrevd felt. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Overstyring. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Minimums- og maksimumsverdier . . . . . . . . . . . . . . . . . . . . . . . . . . . . Intervallverdier. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Skjematilhørighet. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Predefinerte lister. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Lage og sende skjema. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Bruk av skjemadata og skjemasikkerhet. . . . . . . . . . . . . . . . . . . . . . . . . . . Hente skjemadata. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Vaske skjemadata. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Validere skjemadata. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Kode-injisering. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Spørsmål. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Oppgaver. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Øvinger. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Øving 1. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Øving 2. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Øving 3. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Øving 4. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Øving 5. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
182 183 183 184 184 184 185 185 186 186 187 187 187 188 188 191 191 193 195 197 199 199 200 200 200 200 200 201
Kapittel 7 Organisering av kode og oppgaver. . . . . . . . . . . . . . . . . . . . . . . . . Struktur og navngivning for filer og kataloger. . . . . . . . . . . . . . . . . . . . . . Videresending. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Inkludering av filer. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Bruksområde . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Hvordan fungerer inkludering? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Funksjoner og klasser. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Organisering av kode i funksjoner. . . . . . . . . . . . . . . . . . . . . . . . . . . . . Organisering av kode i klasser. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Dokumentasjon. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Feilsøking. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
203 203 205 205 206 206 208 209 209 209 212
10
9788215049694_Busch_Objektorientert web-programmering i PHP.indd 10
03.02.2022 15:52
Innhold
Ulike typer feil i PHP. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Feilsøking i ulike faser av programmeringen. . . . . . . . . . . . . . . . . . . . . Exceptions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Slå av feilrapportering . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Lage egen feilbehandler. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Trigge feilmelding. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Feillogg. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Manuell feilsøking. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Feilsøking med XDebug. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Testing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Hvorfor tester vi?. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Når tester vi? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Hva tester vi?. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Hvordan tester vi? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . God programmeringspraksis. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Designprinsipper . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Kodestandarder. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Cron-jobber. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Bruksområde . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Koble til Linux-tjeneren. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Redigering av crontab . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Sette opp en cron-jobb. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Slette en cron-jobb. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Spørsmål. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Oppgaver. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Øvinger. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Øving 1. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Øving 2. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Øving 3. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Øving 4. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Øving 5. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
212 213 216 217 218 221 221 222 224 225 225 226 226 226 227 228 230 235 236 236 237 238 239 240 240 241 241 241 241 241 241
Kapittel 8 Objektorientert programmering. . . . . . . . . . . . . . . . . . . . . . . . . . . Hva er objektorientert programmering?. . . . . . . . . . . . . . . . . . . . . . . . . . . Bruksområde. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Grunnleggende innføring i objektorientert programmering. . . . . . . . . . . . Klasser. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Objekter. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Klasseegenskaper. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Klassemetoder . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
243 243 244 245 245 247 248 252
11
9788215049694_Busch_Objektorientert web-programmering i PHP.indd 11
03.02.2022 15:52
Innhold
Arv av klasser. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Hva er arv?. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Definere underklasse . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Overstyre forelderklasse. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Tilgangskontroll. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Synlighetsmodifikatorer. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Overlasting. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Metoder for å sette og hente verdier. . . . . . . . . . . . . . . . . . . . . . . . . . . . Statiske klasseegenskaper. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Statiske klassemetoder. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Oppgaver når objekt opprettes og opphører. . . . . . . . . . . . . . . . . . . . . . . . Konstruktor. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Destruktor. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Spørsmål. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Oppgaver. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Øvinger. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Øving 1. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Øving 2. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Øving 3. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Øving 4. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Øving 5. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
257 257 258 263 264 264 266 267 269 270 270 270 272 273 274 274 274 274 275 275 275
Kapittel 9 Databaser. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Innføring i praktisk bruk av databaser . . . . . . . . . . . . . . . . . . . . . . . . . . . . Hvordan fungerer SQL?. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . JOIN-spørringer. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Normalisering og design av database. . . . . . . . . . . . . . . . . . . . . . . . . . . MySQL og MariaDB. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Bruk av PDO . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Håndtering av databaser gjennom grafiske brukergrensesnitt. . . . . . . . Bruk av PHP for samhandling med databasen. . . . . . . . . . . . . . . . . . . . . . Tilkobling. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Forberedte spørringer. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Feilsøking. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Opprette og beskrive tabell. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Slette tabell. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Legge til data . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Hente data. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Oppdatere data. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Slette data. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
277 277 278 281 287 291 292 293 293 294 295 296 297 299 299 302 303 304
12
9788215049694_Busch_Objektorientert web-programmering i PHP.indd 12
03.02.2022 15:52
Innhold
Hente data fra flere tabeller . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Transaksjoner. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Bruk av egenutviklede klasser. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Databasesikkerhet. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . SQL-injection . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Privilegier i databasen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Sikkerhetskopiering og gjenoppretting av databasen. . . . . . . . . . . . . . . Spørsmål. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Oppgaver. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Øvinger. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Øving 1. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Øving 2. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Øving 3. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Øving 4. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Øving 5. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
305 306 309 312 312 315 317 320 320 321 321 321 321 322 322
Kapittel 10 Autentisering og tilstandsbevaring. . . . . . . . . . . . . . . . . . . . . . . . Autentisering . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Lage passord. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Kryptere passord . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Verifisere passord. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Sjekke passord mot database. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . HTTP-autentisering. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Tilstandsbevaring med GET og POST. . . . . . . . . . . . . . . . . . . . . . . . . . . . Bruk av spørrestreng . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Bruk av skjult element. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Tilstandsbevaring med informasjonskapsler. . . . . . . . . . . . . . . . . . . . . . . . Hva er en informasjonskapsel?. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Bruksområder. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Opprette informasjonskapsler . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Lese informasjonskapsler. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Slette informasjonskapsler. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Tilstandsbevaring med økter. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Hva er en økt?. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Bruksområder. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Begynne en økt. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Avslutte en økt. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Tidsavbrudd. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Spørsmål. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Oppgaver. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
323 323 323 324 327 328 330 333 333 334 336 336 337 338 339 340 340 340 340 341 343 344 345 345
13
9788215049694_Busch_Objektorientert web-programmering i PHP.indd 13
03.02.2022 15:52
Innhold
Øvinger. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Øving 1. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Øving 2. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Øving 3. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Øving 4. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Øving 5. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
346 346 346 346 346 347
Kapittel 11 Fil- og bildehåndtering. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Bruksområder. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Grunnleggende informasjon om filer og kataloger. . . . . . . . . . . . . . . . . . . Lese katalogstrukturer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Sjekke om en fil eller katalog eksisterer. . . . . . . . . . . . . . . . . . . . . . . . . Finne absolutt filsti. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Finne filattributter. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Sjekke modus. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Finne filstørrelse. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Skrive til og lese fra filer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Åpne filer. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Låse filer. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Lukke filer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Lese fra filer. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Skrive til filer. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Laste opp filer. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Laste ned filer. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Kopiere og flytte filer. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Slette filer. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Grafiske elementer. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Grunnleggende grafikkbegreper. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . GD-biblioteket. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Lage og tegne bilder. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Bruke eksisterende bilde . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Bilder med tekst. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Tegnefunksjonalitet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Skalere bilder. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Gjennomsiktighet. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Frigi minne. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . PDF-filer. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . FPDF og FPDI. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Lage enkel PDF-fil. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Bruke grafikk i PDF-fil. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
349 349 349 350 351 351 352 352 355 355 355 356 357 357 359 360 365 366 367 367 368 369 370 372 372 376 380 381 382 383 383 384 386
14
9788215049694_Busch_Objektorientert web-programmering i PHP.indd 14
03.02.2022 15:52
Innhold
Lage hyperlenker i PDF-fil. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Lage tabeller i PDF-fil. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Overskrive PDF-filer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Spørsmål. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Oppgaver. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Øvinger. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Øving 1. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Øving 2. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Øving 3. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Øving 4. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Øving 5. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
388 390 393 398 398 399 399 399 399 399 399
Kapittel 12 Kommunikasjon og utveksling av data. . . . . . . . . . . . . . . . . . . . . Sende e-post. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Konfigurasjonsendringer i lokale installasjoner. . . . . . . . . . . . . . . . . . . Sende e-post med PHP. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Sende e-post i HTML-format. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Sende e-post med PHPMailer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Sende SMS. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Utveksling av data med JSON, XML og CSV. . . . . . . . . . . . . . . . . . . . . . JSON . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . XML. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . CSV . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . REST API. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Ressurser . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Forespørsler . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Responskoder fra webtjeneren. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Hente ressurser. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Legge til ressurser . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Oppdatere ressurser . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Slette ressurser. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Spørsmål. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Oppgaver. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Øvinger. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Øving 1. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Øving 2. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Øving 3. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Øving 4. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Øving 5. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
401 401 402 404 405 407 409 410 410 412 418 421 421 422 422 423 424 426 427 428 428 429 429 429 429 429 429
15
9788215049694_Busch_Objektorientert web-programmering i PHP.indd 15
03.02.2022 15:52
Innhold
Kapittel 13 Ajax og PHP. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Hva er Ajax?. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Hvordan fungerer Ajax?. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Kort introduksjon til JavaScript. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Forespørsler . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Respons . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Status på forespørsel. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Hente tekst fra ekstern kilde. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Identifisere Ajax-forespørsler. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Scrolling med stadig nye elementer. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Enkel webside med nyheter. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Stadig nye forespørsler ved scrolling. . . . . . . . . . . . . . . . . . . . . . . . . . . Hente flere nyheter med PHP. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Søk med tilpassede forslag. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Lage søkefelt . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Sende en forespørsel til Ajax. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Identifisere resultater . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Spørsmål. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Oppgaver. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Øvinger. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Øving 1. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Øving 2. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Øving 3. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Øving 4. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Øving 5. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
431 431 432 432 435 436 438 440 442 443 443 444 449 451 451 453 456 458 459 460 460 460 460 460 460
Stikkord. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
461
9788215049694_Busch_Objektorientert web-programmering i PHP.indd 16
03.02.2022 15:52
Forord
Jeg ble interessert i programmering i den videregående skolen, hvor jeg først lærte Pascal. Etter å ha vært innom både Visual Basic og Perl endte jeg opp med å programmere i PHP. Det skjedde egentlig litt tilfeldig. En kamerat og jeg hadde interesse for programmering og vurderte PHP som et svært godt alternativ den gangen. Det mener jeg fortsatt at det er. Da jeg begynte å programmere, var weben noe helt nytt. Skjønt, helt nytt var det jo ikke. Men for allmennheten var dette en ny verden. Og jeg ble raskt oppslukt. Muligheten for å skape interaktive webapplikasjoner var utrolig spennende. Jeg kjøpte mange ulike bøker og lærte meg flere triks. Mye har skjedd siden da. I dag kjører store deler av weben med PHP som programmeringsspråk, og de siste versjonene har gjort språket mer robust enn noensinne. Folkene som benytter PHP, er mange, trivelige og hjelpsomme. Ved å lese denne boken har du tatt ditt første steg mot en spennende verden av undring, oppdagelser og skaperglede. Du bestemmer selv hvor mye du vil fordype deg i PHP, men ikke bli overrasket om også du blir begeistret. Kanskje du er den som utvikler webtjenesten vi «alle» kommer til å benytte i fremtiden? Det er kun fantasien som setter grenser. PHP gir deg mulighetene. Når du nå gjør deg klar til å lære deg PHP, vil jeg gjerne gi deg noen råd om hvordan du bør lese og forstå denne boken. Boken er lagt opp slik at du kan arbeide individuelt med å lære deg PHP, og du vil tidlig se resultater av programmeringen din. Dette er viktig ettersom læringen øker når du praktiserer det du har lest. Jeg anbefaler imidlertid å oppsøke miljøer og forumer hvor du kan få hjelp i læringsprosessen. Det finnes i tillegg flere ressurser på weben, også for denne boken. Jeg har selv undervist i programmering i mange år, og progresjonen i boken er et resultat av de erfaringene jeg har gjort meg. Boken er lagt opp slik at den bør leses kronologisk for dem som er nybegynnere, og vanskelighetsgraden øker etter hvert. Vi begynner med en såkalt prosedural fremgangsmåte fordi den er lettest å lære. Du vil deretter bli introdusert for den objektorienterte fremgangsmåten omtrent halvveis i boken.
17
9788215049694_Busch_Objektorientert web-programmering i PHP.indd 17
03.02.2022 15:52
Forord
Bakerst i hvert kapittel er det spørsmål, oppgaver og øvinger. Spørsmålene er en lett kontroll av innholdet i kapitlet. Der oppgavene er mindre omfattende, vil øvingene kreve mer av dine problemløsningsevner og din tid. Jeg vil anbefale deg å arbeide godt med hvert kapittel og få med deg alle spørsmål, oppgaver og øvinger før du går videre. Ikke vær redd for å prøve og feile. Øvelse gjør, som kjent, mester. Med dette ønsker jeg deg lykke til på din reise og god lesing! Kristiansand, 10. november 2021 Peter André Busch
Takk Takk for all støtte fra min kone, fagmiljøet og studentene ved UiA samt PHP-miljøet i Kristiansand. En spesiell takk til Ketil Danielsen som leste gjennom hele boken og ga nyttige innspill.
9788215049694_Busch_Objektorientert web-programmering i PHP.indd 18
03.02.2022 15:52
1
Hvordan fungerer weben?
Store deler av verden kan koble seg til internett, og stadig flere geografiske områder får tilgang hvert år. Dette store nettverket binder sammen land og kulturer gjennom milliarder av elektroniske enheter. Utvidelsene har gjort det attraktivt for mange å skape sitt eget hjem på internett, enten det er i form av en nettbutikk, en blogg eller en bedriftsside. I dag finnes det flere hundre millioner registrerte domenenavn og enda flere nettsteder knyttet sammen i en verdensvid vev av websider (forkortet www på engelsk). Vi bruker begrepet nettsted om en samling av websider som naturlig hører sammen. I noen tilfeller har et nettsted sitt eget domenenavn, som for eksempel universitetsforlaget.no. I andre tilfeller kan flere nettsteder ligge under det samme domenenavnet, som for eksempel wordpress.org. Internett og weben ikke er det samme. I dagligtale sier vi gjerne at vi gjør internettsøk, mens det i virkeligheten er weben vi søker på. Internett er et stort nettverk av nettverk som alle kan koble seg til ved hjelp av en digital enhet. Det finnes imidlertid mange forskjellige måter å bruke internett på. Noen leser og skriver e-post, andre utveksler filer, mens andre igjen bruker weben. Weben vi bruker til å lese nyheter og kjøpe klær, er altså bare én del av internett, men riktignok en av de viktigste og mest brukte delene av nettverket. Ved å lese denne boken vil du tidlig lære å lage din første webside slik at også du kan delta. I dette kapitlet skal vi begynne med å se på hvordan weben oppsto, hva weben er, og hvilken rolle PHP spiller i dette store puslespillet. Deretter skal vi gå gjennom forberedelsene vi er nødt til å gjøre før vi kommer i gang med å programmere i PHP.
Webens historie Tim Berners-Lee er webens far. For å lage websider utviklet han et eget språk som kalles Hypertext Markup Language (HTML). En HTML-side består av ulike
19
9788215049694_Busch_Objektorientert web-programmering i PHP.indd 19
03.02.2022 15:52
Kapittel 1 Hvordan fungerer weben?
HTML-tagger som angir hva innholdet på websiden skal være. For å kunne utveksle data gjennom såkalte hyperlenker laget Berners-Lee et sett med regler (HTTP). For å gjøre websidene tilgjengelige for andre laget han en webtjener som kunne sende websider til datamaskiner som ba om dem. Han utviklet også en nettleser som kunne tolke HTML-kode og vise websidene til brukerne på deres egne datamaskiner. Disse oppfinnelsene representerte en revolusjon når de kom. Enkeltindivider og organisasjoner kunne skaffe seg et digitalt hjem på weben for å presentere seg selv. Det ble imidlertid raskt klart at noe manglet. Websidene var statiske og viste det samme innholdet til alle som besøkte nettstedet, uten at de kunne få en personlig brukeropplevelse. Det betyr ikke at statiske websider ikke kan ha en funksjon. De egner seg godt til å vise informasjon som ikke endres mye over tid. Et eksempel på et statisk nettsted kan være et kjøpesenter som presenterer informasjon om butikkene, åpningstider, hvordan vi kan kontakte de ulike butikkene, og annen praktisk informasjon som barnepass, toaletter og parkering. Det er med andre ord ikke slik at statiske sider er unyttige, men de gir oss begrensede muligheter. Vi kan for eksempel ikke logge oss inn på websidene til et kjøpesenter for å registrere en CV og søke ledige stillinger, og vi kan ikke se hva vi har handlet, eller endre vår kundeinformasjon. Til tross for at det i webens begynnelse var mye blinkende tekst, stadig skiftende farger og animerte bilder på websidene, ble de statiske websidene kjedelige. Om du har lyst til å se hvordan ulike websider så ut tidligere, kan du besøke internettarkivet (https://archive.org/web/). Flere begynte dermed å se etter muligheter for at brukerne kunne samhandle med websidene. Samhandling innebærer at brukerne kan få en personlig brukeropplevelse på websidene. Fordi hver enkelt bruker kan utføre ulike oppgaver i møtet med de samme websidene, sier vi at de er dynamiske. De tilpasser seg hver enkelt brukers behov. En slik samhandling finner sted for eksempel når vi bruker en søkemaskin som Google. Du er kanskje interessert i fuglearter på google.no, mens jeg kan prøve å finne ut hva som menes med begrepet epistemologi. En nettbutikk er et annet eksempel hvor du og jeg kan handle ulike produkter som vi har behov for, samtidig som nettbutikken holder seg oppdatert på hvilke og hvor mange varer som til enhver tid er tilgjengelige på lager. Enda et eksempel er bedrifters kunde sider, hvor kundene kan logge seg på en personlig side, finne fakturainformasjon og gjøre endringer i kundeforholdet. For å lage dynamiske websider som samhandler med brukerne, må vi benytte et programmeringsspråk. PHP er et eksempel på et slikt programmeringsspråk, og denne boken vil lære deg hvordan du kan bruke PHP til å lage websider som brukerne kan samhandle med. Mark Zuckerberg lærte seg dette og utviklet Facebook i PHP. Det ble en stor suksess. Kanskje du kan gjøre noe liknende? Figur 1.1 viser hvordan Facebook, som da ble kalt The Facebook, så ut i 2005.
20
9788215049694_Busch_Objektorientert web-programmering i PHP.indd 20
03.02.2022 15:52
Webens innhold og struktur
Figur 1.1. Tidlig versjon av Facebook (fra internettarkivet)
Webens innhold og struktur Nå har du fått et lite innblikk i webens historie. Vi skal se nærmere på hvilke teknologier som benyttes for å lage websider.
21
9788215049694_Busch_Objektorientert web-programmering i PHP.indd 21
03.02.2022 15:52
Kapittel 1 Hvordan fungerer weben?
HTML HTML er fremdeles grunnspråket som benyttes for å lage websider. Som navnet tilsier, er hypertekst og tekstformatering sentralt i språket. HTML brukes til å legge til innhold på websiden i form av tekst, bilder, tabeller og liknende. Tanken med HTML er å knytte websider sammen ved hjelp av koblinger i innholdet, som vi kaller hypertekst. Disse koblingene blir kalt hyperlenker, og vi kjenner til dem gjennom vår daglige bruk av weben. Hypertekst blir umiddelbart tilgjengelig for brukeren gjennom hyperlenkene. Disse hyperlenkene kan aktiveres med museklikk, tastetrykk eller ved å berøre skjermen. I tillegg benyttes HTML til å formatere tekst på websidene. Det vil si at vi kan bestemme at deler av teksten skal være en overskrift, en annen del av teksten skal være brødtekst, og liknende. Det er vanlig å si at HTML brukes til å strukturere websidene. HTML har tradisjonelt vært en «løs» standard. Selv om HTML-koden ikke ble helt riktig skrevet, så fungerte den likevel. I tillegg til inkonsekvente regler som kunne være noe irriterende, hadde HTML flere begrensninger. Det var ikke mulig å manipulere grafikk og ta i bruk video og lyd uten å ha særskilte tillegg for dette. For eksempel ble Flash mye brukt sammen med HTML tidligere, men denne teknologien er nå faset ut for godt. En videreutvikling av HTML førte til at XHTML-standarden kom. Med d enne standarden ble bruken av HTML strengere håndhevet blant annet ved at alle elementer skulle avsluttes. XHTML skulle egentlig erstatte HTML, men det ble ikke slik. Isteden ble HTML5 arvtakeren. HTML5 ble påbegynt allerede i 2004 av utviklerne i Mozilla Foundation og Opera Software, som sto bak de tidligere mye brukte nettleserne Mozilla og Opera. I 2013 var første utkast ferdig, og det ble sendt til World Wide Web Consortium (W3C). Siden 2016 har vi hatt en stabil versjon. Med HTML5 er mulighetene utvidet og inkonsekvente regler adressert. Ny funksjonalitet for blant annet video, lyd, grafikk, manipulering av tekst og utvidet skjemakontroll er introdusert for å bøte på tidligere begrensninger. HTML er ikke spesielt vanskelig, og vi skal gå gjennom det mest grunnleggende ved språket litt senere i kapitlet. Vi skal begynne med å se på hvordan en webside kan se ut med HTML-kode. Websiden vi har laget, er en enkel blogg.
22
9788215049694_Busch_Objektorientert web-programmering i PHP.indd 22
03.02.2022 15:52
Med boken følger det en nettbasert ressursside der du får tilgang til «kom i gang»-beskrivelser, programkode til bokens eksempler, flere oppgaver, løsningsforslag og annet fagstoff. Funksjonelle websider med PHP er en innføringsbok i webprogrammering skrevet for studenter ved høgskoler og universiteter og elever i den videregående skolen. Peter André Busch er førsteamanuensis ved Universitetet i Agder. Her underviser han i webprogrammering, e-forvaltning og hvordan IKT påvirker oss på ulike samfunnsområder og ulike nivåer.
Funksjonelle websider med PHP
Forfatteren har lagt opp boken slik at du tidlig kommer i gang med enkle programmer og hele tiden lærer teori hånd i hånd med den praktiske utførelsen. Sentrale elementer som tilordning, valg, løkker, innebygde funksjoner og metoder blir grundig forklart før objektorienterte begreper og metoder blir introdusert. Sikkerhetsaspekter ved webprogrammering blir behandlet tematisk. Boken har mange illustrerende eksempler underveis, og til slutt i hvert kapittel er det spørsmål, oppgaver og en rekke øvelser du kan teste ferdighetene dine på.
Peter André Busch
I denne boken vil du lære å utvikle funksjonelle og dynamiske websider ved å bruke et av verdens mest utbredte webprogrammeringsspråk, PHP. PHP er svært anvendelig og egnet for nybegynnere, og det har stor overføringsverdi til andre språk. Boken bygger på de siste utviklingene i PHP og gir deg en grunnleggende innføring i webprogrammering — fra nybegynnernivå til avansert bruker.