Webapplicaties in PHP en MySQLinformatica.haperen.com/files/PHP_Cursus_v3-2.pdf · kun je vinden in...

60
PHP Cursus Pagina 1 Webapplicaties in PHP en MySQL Koos van Gogh Loet van Haperen Sept 2014

Transcript of Webapplicaties in PHP en MySQLinformatica.haperen.com/files/PHP_Cursus_v3-2.pdf · kun je vinden in...

Page 1: Webapplicaties in PHP en MySQLinformatica.haperen.com/files/PHP_Cursus_v3-2.pdf · kun je vinden in de ELO-BRONNEN-GEDEELDE DOCUMENTEN-INFORMATICA-HST 09 PHP & MYSQL. het gaat om

PHP Cursus Pagina 1

Webapplicaties in PHP en MySQL

Koos van Gogh Loet van Haperen

Sept 2014

Page 2: Webapplicaties in PHP en MySQLinformatica.haperen.com/files/PHP_Cursus_v3-2.pdf · kun je vinden in de ELO-BRONNEN-GEDEELDE DOCUMENTEN-INFORMATICA-HST 09 PHP & MYSQL. het gaat om

PHP Cursus Pagina 2

Inhoudsopgave Introductie en hulpmiddelen ........................................................................................................ 5

1 Een webpagina opvragen ...................................................................................................... 6

2 Inhoud van de cursus ........................................................................................................... 9

2.1 Opdrachten en extra stof............................................................................................... 9

3 De software: Usb Webserver .............................................................................................. 10

3.1 De Software: phpMyAdmin......................................... Fout! Bladwijzer niet gedefinieerd.

3.1.1 Oefeningen met phpMyAdmin ............................................................................. 15

3.2 Opdrachten ................................................................................................................. 16

Programmeren in PHP................................................................................................................ 17

4 PHP en HTML ..................................................................................................................... 18

4.1 Opdrachten ................................................................................................................. 20

5 Basisconstructies in PHP ...................................................................................................... 21

5.1 Commentaar in PHP ..................................................................................................... 21

5.2 Variabelen in PHP ........................................................................................................ 22

5.2.1 Opdrachten .......................................................................................................... 23

5.3 Selectie in PHP: Keuzes maken...................................................................................... 23

5.3.1 Opdrachten .......................................................................................................... 24

5.4 Repetitie in PHP: Herhalen ........................................................................................... 25

5.4.1 * De for Repetitie ................................................................................................. 25

5.4.2 Opdrachten .......................................................................................................... 26

5.5 Arrays in PHP: Lijsten................................................................................................... 26

5.5.1 Associatieve arrays in PHP .................................................................................... 26

5.5.2 Opdrachten .......................................................................................................... 27

5.6 * (Associatieve) Arrays en PHP: Repetitie over alle waarden ....................................... 27

5.6.1 * Opdrachten ....................................................................................................... 28

5.7 Programma’s opdelen in aparte onderdelen .................................................................. 28

6 Communicatie met een MySQL Database............................................................................. 29

6.1 PHP en MySQL: Connectie maken ............................................................................... 29

6.2 PHP en MySQL: Database selecteren ........................................................................... 30

6.3 PHP en MySQL: Query voorbereiden .......................................................................... 30

6.4 PHP en MySQL: Query uitvoeren ................................................................................ 30

6.5 PHP en MySQL: Resultaten opvragen........................................................................... 31

6.6 Opdrachten ................................................................................................................. 32

Page 3: Webapplicaties in PHP en MySQLinformatica.haperen.com/files/PHP_Cursus_v3-2.pdf · kun je vinden in de ELO-BRONNEN-GEDEELDE DOCUMENTEN-INFORMATICA-HST 09 PHP & MYSQL. het gaat om

PHP Cursus Pagina 3

Formulieren en Invoer................................................................................................................ 33

7 Opfrissen: HTML.................................................................................................................. 34

8 Het maken van een eenvoudig formulier............................................................................. 34

8.1 Eenvoudige controls..................................................................................................... 35

8.2 Een zeer eenvoudig formulier ..................................................................................... 35

8.3 Opdrachten ................................................................................................................. 35

9 Uitgebreide formulieren ...................................................................................................... 36

9.1 Tekstvakken ................................................................................................................ 36

9.2 * Labels voor aankruisvakjes en keuzerondjes ............................................................. 36

9.3 * Selectievakken .......................................................................................................... 37

9.3.1 * Meervoudige selectievakken .............................................................................. 37

9.4 Opdrachten ................................................................................................................. 37

10 Het uitlezen van een formulier........................................................................................ 38

10.1 Opdrachten.............................................................................................................. 38

11 Fomulier invoer namaken via een hyperlink..................................................................... 39

11.1 Opdrachten.............................................................................................................. 39

12 * Sessies ......................................................................................................................... 40

12.1 * Opdracht............................................................................................................... 40

Beveiliging.................................................................................................................................. 41

13 Beveiligen: Waar het fout kan gaan.................................................................................. 42

13.1 Opdracht ................................................................................................................. 44

14 Tips voor het maken van een veiligere applicatie ............................................................ 45

14.1 Opdracht ................................................................................................................. 47

15 Onveilige applicaties in de praktijk ................................................................................... 48

15.1 SQL Injection ........................................................................................................... 48

15.1.1 Opdracht.............................................................................................................. 48

15.2 Cross-site scripting ................................................................................................... 48

15.2.1 * Hulpmiddel voor Session Hijacking ..................................................................... 49

15.2.2 Opdrachten .......................................................................................................... 49

15.3 Opdrachten.............................................................................................................. 49

Appendix.................................................................................................................................... 50

A Database aanmaken in phpMyAdmin ................................................................................... 51

B Overzicht HTML................................................................................................................... 53

B.1 Eenvoudige opmaak van tekst ..................................................................................... 53

Page 4: Webapplicaties in PHP en MySQLinformatica.haperen.com/files/PHP_Cursus_v3-2.pdf · kun je vinden in de ELO-BRONNEN-GEDEELDE DOCUMENTEN-INFORMATICA-HST 09 PHP & MYSQL. het gaat om

PHP Cursus Pagina 4

B.2 Hyperlinks ................................................................................................................... 53

B.3 Alinea opmaak ............................................................................................................ 53

B.4 Opsommingen, Geordend ............................................................................................ 53

B.5 Opsommingen, Niet geordend ..................................................................................... 54

B.6 Tabellen ...................................................................................................................... 54

B.7 Structuur aanbrengen met titels .................................................................................. 54

B.8 Attributen, Style Sheets (CSS) en Javascript .................................................................. 54

C Overzicht SQL...................................................................................................................... 55

C.1 Informatie ophalen via SELECT...................................................................................... 55

C.2 Informatie opslaan via INSERT ...................................................................................... 55

C.3 Informatie wijzigen via UPDATE ................................................................................... 55

C.4 Informatie verwijderen via DELETE................................................................................ 56

D Overzicht PHP en Visual Basic.............................................................................................. 58

D.1 Commentaar ............................................................................................................... 58

D.2 Variabelen ................................................................................................................... 58

D.3 Selectie ....................................................................................................................... 58

D.4 Repetitie ..................................................................................................................... 58

D.5 Repetitie via for ........................................................................................................... 59

D.6 Arrays ......................................................................................................................... 59

E Extra bronnen ..................................................................................................................... 60

E.1 Overzicht bronnen ....................................................................................................... 60

E.2 Bekijk online informatie met een kritische blik ........................................................... 60

Page 5: Webapplicaties in PHP en MySQLinformatica.haperen.com/files/PHP_Cursus_v3-2.pdf · kun je vinden in de ELO-BRONNEN-GEDEELDE DOCUMENTEN-INFORMATICA-HST 09 PHP & MYSQL. het gaat om

PHP Cursus Pagina 5

Introductie en hulpmiddelen

Koos van Gogh

Loet van Haperen Sept 2014

Nadat je ervaring hebt opgedaan met HTML en SQL, dan kan de vraag opborrelen of het mogelijk is om webpagina’s te maken die gegevens uit een database bevatten. Zo’n pagina met databasegegevens wordt gemaakt door een webapplicatie. Om zelf een webapplicatie te maken is er naast kennis van HTML en SQL ook programmeerkennis nodig. Deze cursus is een introductie tot de wereld van webapplicaties. Eerst zullen we behandelen hoe het opvragen van webpagina’s werkt. Vervolgens kijken we hoe HTML, SQL en programmeren daar een rol in spelen. Daarbij wordt er gebruik gemaakt van specifieke software. Ook de werking van deze specifieke software zullen we kort doornemen.

Page 6: Webapplicaties in PHP en MySQLinformatica.haperen.com/files/PHP_Cursus_v3-2.pdf · kun je vinden in de ELO-BRONNEN-GEDEELDE DOCUMENTEN-INFORMATICA-HST 09 PHP & MYSQL. het gaat om

PHP Cursus Pagina 6

k

1 Een webpagina opvragen

Voordat we webapplicaties gaan maken, bespreken we het hele proces van het opvragen van een

webpagina. Daarbij wordt ook besproken wat de rol van de webapplicatie binnen dat proces is. De

volgende figuur gebruiken we als schematische weergave van wat er gebeurt als een webpagina, via

een browser, wordt opgevraagd.

Client Netwerk Server

Webpagina Webpagina Gegevens

Verzoek Voert uit Query

Gebruiker PC

Webserver (Apache)

Applicatie (PHP)

Database (MySQL)

Figuur 1: Opvragen van een webpagina

Binnen de wereld van webapplicaties wordt gebruik gemaakt van jargon(vaktaal). Zo kan je enkele van de termen in de voorgaande figuur tegen komen in (online) documentatie. We bespreken dan ook al deze termen. Bovenstaande figuur is verdeeld in twee onderdelen. Dit zijn de cliënt en de server, en deze onderdelen zijn onderling verbonden door een netwerk. De cliënt: De gebruiker die via zijn browser (Internet Explorer, Firefox of een ander) op zijn PC

websites bekijkt. Dit doet hij bijvoorbeeld door in zijn browser het adres van de pagina te typen die hij wil ontvangen.

De Server: Een computer, die door middel van speciale software een dienst aanbiedt aan andere

computers. Voorbeelden van diensten zijn het delen van bestanden (bestandserver of fileserver) en het delen van een printer (printserver). Webpagina’s worden aangeboden aan andere computers door webservers.

Het Netwerk: Alle kabels en apparaten die er voor zorgen dat de cliënt en de server gegevens

naar elkaar kunnen sturen (kunnen communiceren). Met het netwerk zelf heb je heel weinig te maken, dat doet zijn werk namelijk op de achtergrond.

Nu we de belangrijkste onderdelen hebben beschreven die zijn betrokken bij het opvragen van een

Page 7: Webapplicaties in PHP en MySQLinformatica.haperen.com/files/PHP_Cursus_v3-2.pdf · kun je vinden in de ELO-BRONNEN-GEDEELDE DOCUMENTEN-INFORMATICA-HST 09 PHP & MYSQL. het gaat om

PHP Cursus Pagina 7

webpagina, kunnen we het opvragen van de webpagina zelf beschrijven.

Page 8: Webapplicaties in PHP en MySQLinformatica.haperen.com/files/PHP_Cursus_v3-2.pdf · kun je vinden in de ELO-BRONNEN-GEDEELDE DOCUMENTEN-INFORMATICA-HST 09 PHP & MYSQL. het gaat om

PHP Cursus Pagina 8

De gebruiker vraagt via een browser op zijn PC een webpagina op, bijvoorbeeld door een hyperlink in de adresbalk van de browser te typen. Vervolgens gaat dit verzoek via het netwerk naar de webserver. De webserver controleert of het verzoek geldig is, en vervolgens zoekt de webserver uit welk programma antwoord kan geven op dat verzoek. Zo’n programma dat antwoord kan geven op verzoeken van een webserver heet een webapplicatie. De webserver start de gevonden webapplicatie op, en wacht vervolgens op de uitvoer van de webapplicatie. Als de webapplicatie gegevens nodig heeft uit een database, dan stuurt de applicatie queries (SQL opdrachten) naar de database. De database geeft als resultaat de opgevraagde gegevens en de webapplicatie verwerkt deze gegevens in een leesbare webpagina. Als de webapplicatie klaar is met het maken van de webpagina, dan wordt die pagina teruggestuurd naar de webserver. De webserver stuurt de webpagina vervolgens door naar de cliënt, waar de gebruiker via zijn browser het resultaat kan zien.

Page 9: Webapplicaties in PHP en MySQLinformatica.haperen.com/files/PHP_Cursus_v3-2.pdf · kun je vinden in de ELO-BRONNEN-GEDEELDE DOCUMENTEN-INFORMATICA-HST 09 PHP & MYSQL. het gaat om

PHP Cursus Pagina 9

2 Inhoud van de cursus Voor het schrijven van webapplicaties gaan we uit van de volgende aanwezige voorkennis:

• HTML (en eventueel CSS), dit gebruiken we voor het opmaken van informatie. • Programmeren, dit gebruiken we voor het verwerken van informatie. • Databases en SQL, dit gebruiken we voor het opslaan en opvragen van informatie.

Al deze voorkennis staat tot nu toe nog geheel los van elkaar. Deze cursus heeft als doel alle voorgaande kennis te combineren tot het begrip webapplicaties. De cursus heeft daarvoor de volgende onderwerpen:

• De werking van Webserver-Apache, MySQL en andere hulpmiddelen. • De programmeertaal PHP. • Communicatie tussen databases en webapplicaties (in PHP). • Maken en uitlezen van formulieren. • Beveiligen van een webapplicatie.

De werking van de software zal verder in dit deel besproken worden. Het programmeren in PHP is de inhoud van het volgende deel. Het derde deel gaat over het verwerken van invoer, en het laatste deel gaat in op het onderwerp beveiligen en veiligheid. Concrete dingen die mogelijk zijn na deze cursus is het zelf maken van een eenvoudige website die toegang geeft tot informatie in een database. Voorbeelden van zo’n website zijn gastenboeken, blogs en eenvoudige fora.

2.1 Opdrachten en extra stof In deze cursus zijn opdrachten verwerkt. Sommige van deze opdrachten zijn losstaand. Maar het merendeel van de opdrachten neemt je bij de hand om stap voor stap een werkende blogapplicatie te maken. Er zijn enkele onderwerpen en opdrachten die zijn opgenomen, maar niet verplicht zijn. Deze zijn bedoeld voor iedereen die verder wil gaan dan de basis. Het wordt aangeraden om deze stof door te nemen als daar de tijd voor is. Alle niet-verplichte onderwerpen en opdrachten zijn aangegeven met een ster (*).

Page 10: Webapplicaties in PHP en MySQLinformatica.haperen.com/files/PHP_Cursus_v3-2.pdf · kun je vinden in de ELO-BRONNEN-GEDEELDE DOCUMENTEN-INFORMATICA-HST 09 PHP & MYSQL. het gaat om

PHP Cursus Pagina 10

3 De software: De software die we gaan gebruiken is allemaal webbased wat zoveel wil zeggen dat je ermee kunt

werken op elke plek op de wereld zolang je maar een PC en internet tot je beschikking hebt.

Om deze omgeving in te richten moet je zelf een aantal stappen ondernemen, op de eerste plaats

heb je als het goed is van je docent een email ontvangen waarin de inlog gegevens stonden

genoteerd van jouw eigen web-ontwikkel-omgeving. Dit is een complete hosting oplossing met een

eigen domeinnaam en eigen servers. Hierdoor is het mogelijk om ook andere te laten zien wat je aan

het maken bent of wat je gemaakt hebt.

Je moet nu eerst gaan naar Magister want daar moet je een tweetal bestanden downloaden, deze

kun je vinden in de ELO-BRONNEN-GEDEELDE DOCUMENTEN-INFORMATICA-HST 09 PHP & MYSQL.

het gaat om het bestand voorbeeld.zip en rooster0809.sql, sla deze even ergens op zodat je direct

weer terug kunt vinden. (ZIP niet uitpakken !!)

Nadat je de bestanden hebt gedownload ga je naar je eigen omgeving door een webbrowser te

starten, dit mag iedere browser zijn waar jij het prettigst bij voelt. Op school zal dit zijn Internet-

Explorer. Nu ga je naar je eigen omgeving door te gaan naar http://ln999999.haperen.eu:2222

waarbij de 999999 staat voor jouw eigen leerling nummer zoals je ook in Magister inlogt.

Op het bovenstaande venster moet je nu inloggen met de gegevens zoals ze in de mail zijn vermeld,

dit is voor je Usernaam, ln999999 (waarbij dan 999999 weer je leerling nummer is) en het tijdelijke

wachtwoord is Welkom1 Als het goed is kom je nu in het beheer portaal van je eigen server. Hier

gaan we nu als eerste het wachtwoord aanpassen:

Page 11: Webapplicaties in PHP en MySQLinformatica.haperen.com/files/PHP_Cursus_v3-2.pdf · kun je vinden in de ELO-BRONNEN-GEDEELDE DOCUMENTEN-INFORMATICA-HST 09 PHP & MYSQL. het gaat om

PHP Cursus Pagina 11

Je moet nu eerst het tijdelijke wachtwoord opgeven en dan zelf een nieuw wachtwoord maken, houd het simpel en wellicht hetzelfde als het wachtwoord op de computer. Na deze stap gaan we de database server starten en klaar maken, dit doen we door te klikken op MySQL Management, en dan te kiezen voor “Create new Database”. Dit moet je doen want er zal tenminste een database beschikbaar moeten zijn voordat je verder kun gaan werken.

Page 12: Webapplicaties in PHP en MySQLinformatica.haperen.com/files/PHP_Cursus_v3-2.pdf · kun je vinden in de ELO-BRONNEN-GEDEELDE DOCUMENTEN-INFORMATICA-HST 09 PHP & MYSQL. het gaat om

PHP Cursus Pagina 12

Vul nu in bij de volgende velden de volgende gegevens:

Database Name: ln999999_ln99999_rooster0708 Database Username: ln999999_root Username Password: Welkom1 Confirm Password: Welkom1

Nu druk je op de knop “Create” en de database zal gemaakt worden, met als resultaat het onderstaande scherm:

Nu kies je voor “Click Here to go back” zodat je weer terug komt in de beheer portal van de site. Als het goed is heb je nu éé’n database met een gebruiker, druk nu op de knop phpMyAdmin.

Page 13: Webapplicaties in PHP en MySQLinformatica.haperen.com/files/PHP_Cursus_v3-2.pdf · kun je vinden in de ELO-BRONNEN-GEDEELDE DOCUMENTEN-INFORMATICA-HST 09 PHP & MYSQL. het gaat om

PHP Cursus Pagina 13

Op het inlog venster wat nu verschijnt moet je wederom je eigen inlog gegevens invullen zoals je deze ontvangen hebt en natuurlijk wel het nieuwe wachtwoord wat je net hebt aangepast.

Nadat je bent ingelogd zie je het onderstaande overzicht:

Nu moet je eerste de zojuist aangemaakte database selecteren, dit gaat door er op te klikken. En vervolgens kies je direct voor “Importeren”. Klik nu op bladeren en zoek het zojuist gedownloade bestand op “ln99999_rooster0708.sql” en vervolgens druk je op “Start”

Page 14: Webapplicaties in PHP en MySQLinformatica.haperen.com/files/PHP_Cursus_v3-2.pdf · kun je vinden in de ELO-BRONNEN-GEDEELDE DOCUMENTEN-INFORMATICA-HST 09 PHP & MYSQL. het gaat om

PHP Cursus Pagina 14

Dit duurt even en dan is de database gevuld waarmee we aan de slag gaan. Tot slot moet ook de voorbeeld website nog ingeladen worden. Dit gaat door terug te gaan naar het portaal “Direct Admin” en daar te kiezen voor “File Manager”, vervolgens kies je voor de map “public_html”.

Kies nu voor “upload files to current directory” en klik dan op het eerste “bladeren” knop. Nu moet je op zoek gaan naar de andere file die je gedownload hebt “voorbeeld.zip”

Vervolgens kies je op “upload files” en dan op de knop “Click here to go back”. Nu kom je terug in het hoofdvenster waar als het goed is de voorbeeld.zip helemaal onderaan staat.

Klik nu op Extract en de zip wordt uitgepakt in de map voorbeeld. Dit kun je nu testen door te gaan in een nieuwe browser naar http://ln999999.haperen.eu/voorbeeld waarbij natuurlijk de 99999 weer vervangen moet worden door je eigen leerling nummer.

Page 15: Webapplicaties in PHP en MySQLinformatica.haperen.com/files/PHP_Cursus_v3-2.pdf · kun je vinden in de ELO-BRONNEN-GEDEELDE DOCUMENTEN-INFORMATICA-HST 09 PHP & MYSQL. het gaat om

PHP Cursus Pagina 15

3.1.1 Oefeningen met phpMyAdmin De volgende oefeningen zijn bedoeld om je kennis te laten maken met phpMyAdmin. Tip: Als je meerdere vensters opent, dan kan je in het ene venster zien hoe de database struc tuur in elkaar zit, en in het andere venster SQL queries uitvoeren. Je kunt meerdere vensters openen door je browser nogmaals op te starten. Vervolgens ga je ook in het nieuwe scherm naar http://ln999999.haperen.eu/phpmyadmin

1. open in je browser de volgende link waarbij de 999999 wederom je eigen leerlingnummer is, http://ln999999.haperen.eu/phpmyadmin

2. Ga naar de database ln99999_rooster0708 en bekijk de structuur van alle tabellen.

3. Zoek in de tabel adminnr_naam op welk administratienummer Lisanne van der Wiel heeft.

Doe dit door middel van de verkenner.

4. Zoek in de tabel adminnr_naam op welk administratienummer Jos Engelen heeft. Doe dit door middel van een SQL query.

5. Voer een query uit waarin je laat zien in welke groepen Chris Keizer zit.

6. Voer een query uit waarin je laat zien welke vakken alle leraren geven. Zorg ervoor dat elke

combinatie van vak - leraar maar 1 keer getoond wordt.

7. Voer een query uit waarin je laat zien welke leraren een les geven op maandag, 1e uur. Laat naast de leraar ook het vak, het lokaal en de groep zien.

8. Voer een query uit waarin je laat zien welke lessen Lydia Li volgt, oftewel: print het rooster.

Zorg ervoor dat alle lessen netjes geordend zijn op tijd. Je mag het administratienummer gebruiken.

9. Pas de query uit de vorige opdracht zodanig aan dat je een naam gebruikt als identificatie.

Dat wil zeggen: als je buurman zijn rooster op wil vragen, dan hoeft hij in jouw query alleen maar de naam aan te passen.

Page 16: Webapplicaties in PHP en MySQLinformatica.haperen.com/files/PHP_Cursus_v3-2.pdf · kun je vinden in de ELO-BRONNEN-GEDEELDE DOCUMENTEN-INFORMATICA-HST 09 PHP & MYSQL. het gaat om

PHP Cursus Pagina 16

3.2 Opdrachten We gaan nu een database aanmaken voor het maken van een blogapplicatie. In de volgende hoofdstukken gaan we om deze database een webapplicatie maken, zodat mensen blogs en reacties kunnen plaatsen en lezen (zonder dat ze zelf SQL moeten invoeren). 1. Ga naar http://ln99999.haperen.eu/voorbeeld/. Daar is het bestand met SQL queries voor het

aanmaken van de blog database te vinden, rechts onderin de tekst. Kopieer de inhoud van dit bestand database_blog.txt.

2. Ga nu naar je “Direct admin” portaal en maak een nieuwe database aan zoals je dat ook al hebt gedaan voor de ln99999_rooster0708 database.

3. Ga daarna naar http://nl99999.haperen.eu/phpmyadmin Kies in de linker kolom de knop SQL. Een pop up opent zich, waar je SQL queries kan uitvoeren. Plak hier de inhoud van het bestand database_blog.txt. Klik nu op Start, als phpMyAdmin klaar is, dan is er een nieuwe database aangemaakt voor alle blog-data.

4. Ga via het hoofdvenster van phpMyAdmin naar de nieuwe database, blog_opdracht. Als deze nog niet zichtbaar is, sluit dan de browser af en open hem opnieuw. Kies SQL in het rechtervenster als je de database geopend hebt.

5. Schrijf een query om een blog entry op te vragen, inclusief de informatie over de schrijver.

6. Schrijf vervolgens een query om de reacties op een blog entry op te vragen. Deze en volgende queries zullen we later in de webapplicatie gebruiken om diezelfde informatie op te vragen.

7. Schrijf vervolgens een SQL querie voor het invoeren van een nieuwe gebruiker (jezelf bijvoor- beeld). Maak gebruik van een INSERT query.

8. Plaats een nieuw blog en een nieuwe reactie op dat blog, beide op je eigen naam. Je kan voor

het veld tijd de waarde NOW() gebruiken. Maak gebruik van een INSERT query.

Page 17: Webapplicaties in PHP en MySQLinformatica.haperen.com/files/PHP_Cursus_v3-2.pdf · kun je vinden in de ELO-BRONNEN-GEDEELDE DOCUMENTEN-INFORMATICA-HST 09 PHP & MYSQL. het gaat om

PHP Cursus Pagina 17

Programmeren in PHP

Koos van Gogh Loet van Haperen

Sept 2014

In de vorige module heb je geleerd hoe je met USB-webserver en phpMyAdmin een webserver kunt opzetten en daarin databases kunt beheren. Nu is het tijd voor een eerste webapplicatie. Deze webapplicaties gaan we schrijven in de programmeertaal PHP.

In deze module zul je leren hoe je de programmeertaal PHP combineert met HTML. Verder bespre- ken we variabelen en de standaardconstructies. Daarvan zou het meeste bekend moeten voorkomen aangezien ze deze constructies ook in Visual Basic voorkomen. Als laatste gaan we bespreken hoe je PHP laat communiceren met een MySQL Databaseserver.

Page 18: Webapplicaties in PHP en MySQLinformatica.haperen.com/files/PHP_Cursus_v3-2.pdf · kun je vinden in de ELO-BRONNEN-GEDEELDE DOCUMENTEN-INFORMATICA-HST 09 PHP & MYSQL. het gaat om

PHP Cursus Pagina 18

4 PHP en HTML Om nu te kunnen gaan programeren moet er eens nog een een online editor omgeving ingericht worden,

dit gaat ook weer met een webbased applicatie. We gaan naar http://codeanywhere.com kies daar voor

“Sign up for Free”.

En kies dan voor de gratis optie, dit is voldoende voor het doel waar wij hem voor gaan gebruiken. Geeft

nu je email adres is en kies ook hier weer voor een wachtwoord, verstandig is hiervoor hetzelfde te

gebruiken als dat je gebruikt in de eigen webserver omgeving.

Druk nu op “Register” en schrijf ergens je inlog gegevens op. De omgeving wordt nu geopend en deze

moet je nu nog even koppelen aan jouw domein. Sla wel even de rondleiding over. Dit doe je door te

klikken op “FTP” en het venster wat dan geopend wordt moet je de volgende gegevens invullen waarbij

het weer zo is dat de 99999 vervangen moet worden door jouw eigen leerlingnummer en het

wachtwoord is het wachtwoord wat je gebruikt om in te loggen op je eigen webserver omgeving.

Page 19: Webapplicaties in PHP en MySQLinformatica.haperen.com/files/PHP_Cursus_v3-2.pdf · kun je vinden in de ELO-BRONNEN-GEDEELDE DOCUMENTEN-INFORMATICA-HST 09 PHP & MYSQL. het gaat om

PHP Cursus Pagina 19

Nu zal er onder het kopje FTP een extra knop verschijnen, dit is je eigen webserver omgeving.

Klik nu op haperen.eu en kom je automatisch in de root directory van je website. Vanaf nu gaan we een

aantal oefeningen doen om bestanden daar te maken en te testen. Het aanmaken van een nieuw bestand

gaat door met de rechtermuis knop te klikken op haperen.eu en dan te kiezen voor “create file”.

Page 20: Webapplicaties in PHP en MySQLinformatica.haperen.com/files/PHP_Cursus_v3-2.pdf · kun je vinden in de ELO-BRONNEN-GEDEELDE DOCUMENTEN-INFORMATICA-HST 09 PHP & MYSQL. het gaat om

PHP Cursus Pagina 20

PHP word direct opgenomen in HTML-pagina’s, zodat de PHP code tussen de HTML code staat. Hiervoor voegt PHP een eigen notatie toe aan HTML. Elk stukje PHP code is omsloten met <?php en ?>. Als je PHP wilt gebruiken, dan dient de bestandsnaam van je pagina te eindigen op .php. Dan weet ook de webserver dat het bestand PHP kan bevatten. Hieronder staat een voorbeeld, waarin zowel PHP code en HTML is opgenomen.

De opdracht echo wordt gebruikt om uitvoer toe te voegen aan de uiteindelijke webpagina. Om dit voorbeeld uit te proberen dien je in de Root directory van je webserver een bestand te maken, waarvan de bestandsnaam eindigt op .php, bijvoorbeeld voorbeeld.php. Vervolgens kan je de pagina bekijken door in je browser naar http://ln99999.haperen.eu/voorbeeld.php te gaan.

4.1 Opdrachten 1. Maak het bovenstaande voorbeeld aan, en kijk of je de correcte uitvoer te zien kan krijgen in je

browser. 2. Maak een nieuwe directory aan met de naam opdrachten in de directory Root/public_hmtl. In deze

directory kan je al je toekomstige voorbeelden en opdrachten zetten. Door naar http://ln99999.haperen.eu/opdrachten/ te gaan zie je de inhoud van de directory.

3. Maak in de map opdrachten een PHP programma dat je naam weergeeft.

<html> <head> <title>Voorbeeld</title> </head>

<body> <?php echo "Uitvoer door PHP!"; ?>

<br><b>Dit is weer normale HTML-code.</b> </body>

</html>

Page 21: Webapplicaties in PHP en MySQLinformatica.haperen.com/files/PHP_Cursus_v3-2.pdf · kun je vinden in de ELO-BRONNEN-GEDEELDE DOCUMENTEN-INFORMATICA-HST 09 PHP & MYSQL. het gaat om

PHP Cursus Pagina 21

5 Basisconstructies in PHP Elke programmeertaal heeft standaardconstructies, die het mogelijk maken om informatie op te slaan (variabelen), om keuzes te maken (selectie) of om zaken te herhalen (repetitie). Ook bevatten programmeertalen constructies om commentaar te plaatsen en om lijsten (arrays) bij te houden. Deze constructies bevat PHP ook, en die worden hier besproken.

5.1 Commentaar in PHP Commentaar is erg belangrijk: Het wordt niet door PHP uitgevoerd, maar het stelt je in staat de werking van je programma’s te beschrijven in normale mensentaal. PHP kent twee vormen van commentaar, commentaar dat eindigt op het einde van de regel en commentaar dat meerdere regels lang kan zijn. Het volgende voorbeeld doet beide voor.

Met commentaar kan je je programma’s leesbaarder en beter te begrijpen houden op de langere termijn.

<html> <head> <title>Voorbeeld</title> </head> <body> <?php // De volgende regel bevat eenvoudige uitvoer.

echo "Uitvoer door PHP!"; // Deze regel wordt niet uitgevoerd: echo "Ik ben er niet!"; ?> <br> <?php /* Dit is een commentaar dat meerdere regels lang is, zo wordt echo "Dit dus ook niet uitgevoerd"; */ echo "Dit dan weer wel!"; ?> </body> </html>

Page 22: Webapplicaties in PHP en MySQLinformatica.haperen.com/files/PHP_Cursus_v3-2.pdf · kun je vinden in de ELO-BRONNEN-GEDEELDE DOCUMENTEN-INFORMATICA-HST 09 PHP & MYSQL. het gaat om

PHP Cursus Pagina 22

5.2 Variabelen in PHP Variabelen zijn bedoeld om in je programma stukjes informatie (zoals een tekst, een getal) op te slaan. In PHP gedragen variabelen zich als volgt:

Variabelen in PHP beginnen altijd met een $-teken. Dus $variabele is wel een variabele en variabele is dat niet.

Variabelen hebben een naam en een waarde, $variabele is dus de variabele met naam variabele.

Variabelen in PHP zijn hoofdlettergevoelig. $Variabele is dus een andere variabele dan $variabele.

PHP maakt geen onderscheid tussen de verschillende soorten inhoud van variabelen. Teksten en getallen kunnen bijvoorbeeld in dezelfde variabele worden opgeslagen. Hier gaan we dadelijk nog verder op in.

Om je programma’s leesbaar te houden geef je elke variabele in je programma altijd een duidelijke naam, die beschrijft wat het doet (en wat er voor informatie in zit). Je kunt bijvoorbeeld hoofd- letters gebruiken of _ om verschillende woorden in de naam van een variabele te onderscheiden. Gebruik wel altijd dezelfde manier. Het volgende voorbeeld geeft het gebruik van variabelen weer:

<html> <head> <title>Voorbeeld</title> </head> <body> <?php

$eenGetal = 43; echo $eenGetal; //Nu komt er dus '43' op je webpagina te staan. echo '<br>'; // Een nieuwe regel in je webpagina. $tweedeGetal = $eenGetal + 37; // Je kan ook reken met variabelen. echo $tweedeGetal; echo '<br>'; /* Met de punt plak je aan een variabele een andere tekst. Tekst wordt opgenomen binnen 'aanhalingstekens'. Als tekst wordt opgenomen binnen "dubbele aanhalingstekens", dan worden variabelen in de tekst vervangen door hun waarde. */ $mijnGetal = $tweedeGetal . ' is een mooi getal<br>'; echo $mijnGetal; echo "Een getal: $tweedeGetal <br>"; echo 'Geen getal: $tweedeGetal <br> '; ?> </body> </html>

Page 23: Webapplicaties in PHP en MySQLinformatica.haperen.com/files/PHP_Cursus_v3-2.pdf · kun je vinden in de ELO-BRONNEN-GEDEELDE DOCUMENTEN-INFORMATICA-HST 09 PHP & MYSQL. het gaat om

PHP Cursus Pagina 23

5.2.1 Opdrachten

1. Maak een programma waarin je rekent met variabelen. Je kunt de volgende operaties ge- bruiken: optellen (+), aftrekken (-), vermenigvuldigen (*), delen (/) en teksten aan elkaar plakken met de punt (.). Probeer ze allemaal eens uit.

2. Maak een programma aan waarin je de tekst ‘43 appels’ optelt bij het getal 12. Laat de uitkomst opslaan in een variabele, laat hem vervolgens zien in je webpagina. Probeer de uitkomst ook op te nemen in een andere tekst, door de variabele op te nemen tussen ”dubbele aanhalings- tekens”.

5.3 Selectie in PHP: Keuzes maken Noot: In de komende voorbeelden worden alleen de belangrijke nieuwe zaken getoond, binnen <?php en ?>. Maak hier zelf een webpagina van om te kijken wat de uitvoer is. Vaak moet je in je programma keuzes maken. Bijvoorbeeld om te kijken of iemand is ingelogd op zijn website, waarna je iets anders krijgt te zien als je ingelogd bent. Binnen PHP kan je keuzes maken met de opdracht if. De basisvorm is als volgt:

Er kunnen meerdere alternatieve voorwaarde worden opgenomen met else if. Zowel else if en else kunnen worden weggelaten. Het volgende voorbeeld laat enkele if, else if en else opdrachten zien.

<?php if (voorwaarde_1) {

// Dit wordt uitgevoerd als voorwaarde_1 waar is. opdrachten; } else if (voorwaarde_2) { // Dit wordt uitgevoerd als voorwaarde_1 niet waar is, en voorwaarde_2 // wel waar is. opdrachten;

} else { // Dit wordt uitgevoerd als voorwaarde_1 en voorwaarde_2 niet waar zijn. opdrachten; }

<?php if (2 < 3) { echo '2 is kleiner dan 3!<br>'; } if (2 > 3) { echo '2 is groter dan 3!<br>'; }

else { echo '2 is niet groter dan 3!<br>'; }

Page 24: Webapplicaties in PHP en MySQLinformatica.haperen.com/files/PHP_Cursus_v3-2.pdf · kun je vinden in de ELO-BRONNEN-GEDEELDE DOCUMENTEN-INFORMATICA-HST 09 PHP & MYSQL. het gaat om

PHP Cursus Pagina 24

5.3.1 Opdrachten

1. Getallen kunnen gelijk zijn (==), ongelijk zijn (!=), groter dan (>), kleiner dan (<), groter dan of gelijk aan (>=) of kleiner dan of gelijk aan (<=). Maak een programma en verwerk enkele vergelijkingen in if-statements.

2. Teksten kunnen gelijk (==) of niet gelijk != zijn. Maak een programma en probeer ook dat uit.

3. Meerdere voorwaarden kunnen worden gecombineerd met and (beide voorwaarden zijn waar)

en or (een van de voorwaarden is waar). Bijvoorbeeld:

Probeer and en or uit in een programma.

4. Bekijk of de tekst "3 appels" gelijk is aan 3. Om te testen of twee variabele compleet gelijk zijn (allebei tekst, en dezelfde tekst bijvoorbeeld) kan === gebruiken. Bekijk of "3 appels" compleet gelijk is aan 3.

if (2 > 3) { echo '2 is groter dan 3!<br>'; } else if (2 < 5) { echo '2 is kleiner dan 5!<br>'; } // Het werkt natuurlijk ook met variabelen. $eenTekst = 'Ik'; $andereTekst = 'Jij '; if ($eenTekst == $andereTekst) { echo 'De teksten zijn gelijk'; } else if ($eenTekst == 'Ik') { echo "Ik zeg niet $andereTekst"; }

?>

<?php if ((3 < $variabele) and ($variabele < 5)) { echo '$variabele is kleiner dan vijf en groter dan drie!';

} ?>

Page 25: Webapplicaties in PHP en MySQLinformatica.haperen.com/files/PHP_Cursus_v3-2.pdf · kun je vinden in de ELO-BRONNEN-GEDEELDE DOCUMENTEN-INFORMATICA-HST 09 PHP & MYSQL. het gaat om

PHP Cursus Pagina 25

5.4 Repetitie in PHP: Herhalen Als je stukken programma meermalen wil uitvoeren, dan kan dat met behulp van repetitie. PHP heeft meerdere constructies om repetitie uit te voeren, wij beperken ons tot de eenvoudigste, namelijk de while repetitie. De basisvorm is als volgt: Het volgende voorbeeld gebruikt de while repetitie om de tafel van 7 uit te rekenen.

5.4.1 * De for Repetitie

Een alternatieve vorm van repetitie is de for- repetitie. De basisvorm is als volgt: Daarbij wordt initialisatie uitgevoerd voordat de for repetitie begint. Als aan de voorwaarde voldaan wordt, dan worden de opdrachten uitgevoerd, waarna er weer gekeken wordt of voorwaarde waar is. De opdracht verandering is een opdracht die (ooit) de voorwaarde onwaar dient te maken. De for repetitie doet hetzelfde als de volgende while repetitie:

<?php while (voorwaarde) { opdrachten; } ?>

<?php $getal = 1; // We beginnen bij 1, en gaan door tot en met 10. while ($getal <= 10) { // Zolang $getal kleiner dan of gelijk is aan 10 wordt het // volgende uitgevoerd. echo "$getal x 7 = " . $getal * 7 . '<br>'; $getal = $getal + 1; // Verhoog $getal zodat we de volgende keer de volgende regel

// uit de tafel weer te geven. }

?>

<?php for (initialisatie; voorwaarde; verandering) { opdrachten; } ?>

<?php initialisatie; while(voorwaarde) { opdrachten; verandering; } ?>

Page 26: Webapplicaties in PHP en MySQLinformatica.haperen.com/files/PHP_Cursus_v3-2.pdf · kun je vinden in de ELO-BRONNEN-GEDEELDE DOCUMENTEN-INFORMATICA-HST 09 PHP & MYSQL. het gaat om

PHP Cursus Pagina 26

Het volgende voorbeeld gebruikt de for repetitie om de tafel van 7 uit te rekenen.

5.4.2 Opdrachten

1. Maak een programma dat de alle tafels van 10 laat zien. 2. Herschrijf bovenstaande programma zodat het de for repetitie gebruikt.

5.5 Arrays in PHP: Lijsten In PHP zijn arrays variabelen die niet één waarde, maar een hele lijst met waarden kunnen bijhou- den. Daarbij is elk element in de array op te vragen door middel van een sleutel (ook wel index genoemd). Standaard beginnen de sleutels in PHP bij 0, en gaan door tot de lengte van de lijst minus 1. De basisoperaties met een variabele van het type array zijn als volgt:

5.5.1 Associatieve arrays in PHP

PHP beperkt de sleutel in een array niet tot alleen numerieke waarden. Je kunt ook tekstuele sleutels gebruikeren. Dit wordt een associatieve array genoemd. Zo’n associatieve array kan je voorstellen als een tabel(sleutel, waarde), waarbij je eenvoudig op de sleutel kan zoeken. De basisoperaties met een associatieve array zijn als volgt:

<?php for ($getal = 1; $getal <= 10; $getal = $getal + 1) { echo "$getal x 7 = " . $getal * 7 . '<br>'; } ?>

<?php // eenLijst wordt een array met enkele waarden. $eenLijst = array(1, 3, 5, 7, 9, 11, 13); // Met [sleutel] kan je een waarde opvragen. echo $eenLijst[4] . '<br>'; // Met [sleutel] kan je een waarde wijzigen. $eenLijst[4] = 17;

echo $eenLijst[4] . '<br>'; // Met count() kan je de lengte van een lijst opvragen. echo count($eenLijst) . '<br>'; // Met [ ] kan je een element aan het einde van de lijst toevoegen. $eenLijst[] = 19; echo count($eenLijst) . '<br>'; ?>

<?php // eenLijst wordt een array met enkele waarden. $eenLijst = array('vijf' => 5, 'twee' => 2, 'drie' => 3); echo count($eenLijst) . '<br>';

Page 27: Webapplicaties in PHP en MySQLinformatica.haperen.com/files/PHP_Cursus_v3-2.pdf · kun je vinden in de ELO-BRONNEN-GEDEELDE DOCUMENTEN-INFORMATICA-HST 09 PHP & MYSQL. het gaat om

PHP Cursus Pagina 27

5.5.2 Opdrachten

1. Maak een programma waarin je enkele operaties op associatieve en gewone arrays uitvoert. 2. Onderzoek wat $variabele[] = ’3’ doet bij een associatieve array. 3. Maak een programma waarin je door middel van while repetitie alle waarden uit een

gewone array weer geeft.

5.6 * (Associatieve) Arrays en PHP: Repetitie over alle waarden Bij een normale array is het eenvoudig om alle waarden te bekijken. Het volgende voorbeeld doet dat bijvoorbeeld: Maar een associatieve array heeft sleutels die niet netjes te voorspellen zijn. Daarom biedt PHP de foreach repetitie aan. De basisvorm is als volgt:

<?php $eenLijst = array(1, 2, 3, 5, 7, 9); $sleutel = 0; while ($sleutel < count($eenLijst)) { echo $eenLijst[$sleutel] . ' zit in de lijst<br>'; $sleutel = $sleutel + 1; } ?>

<?php // $eenLijst is een (associatieve) array. foreach ($eenLijst as $sleutel => $waarde) { // Nu bestaat de variabele $sleutel, en $waarde = $eenLijst[$sleutel]. opdrachten; // Veranderingen in $sleutel en $waarde hebben geen invloed op $eenLijst. } ?>

// de operatie [sleutel] kan nog steeds gebruikt worden. echo $eenLijst['drie '] . '<br>'; $andereLijst['drie'] = 11; echo $andereLijst['drie'] . '<br>';

// De operatie [sleutel] kan ook gebruikt worden om nieuwe elementen // toe te voegen. $andereLijst['zeven'] = 9; echo count($eenLijst) . '<br>'; // Verder kan de operatie isset() gebruikt worden om te testen of een // sleutel in de array zit. if (isset($eenLijst['vijfendertig'])) { echo 'Ik ben er niet<br>'; } else if (isset($eenLijst['dri'’])) { echo 'En ik ben er wel<br>'; }

?>

Page 28: Webapplicaties in PHP en MySQLinformatica.haperen.com/files/PHP_Cursus_v3-2.pdf · kun je vinden in de ELO-BRONNEN-GEDEELDE DOCUMENTEN-INFORMATICA-HST 09 PHP & MYSQL. het gaat om

PHP Cursus Pagina 28

5.6.1 * Opdrachten

1. Schrijf een programma dat foreach gebruikt om over alle waarden in een normale array te lopen.

2. Schrijf een programma dat foreach gebruikt om over alle waarden in een associatieve

array te lopen.

5.7 Programma’s opdelen in aparte onderdelen Onderdelen in je PHP programma’s zul je vaak gebruiken, zoals de eerste regels HTML en de laatste regels HTML. Het is mogelijk deze onderdelen in aparte bestanden te zetten, en ze vervolgens in te voegen in je daadwerkelijke programma. Dit kan met de opdracht require, waarvan het volgende voorbeeld de werking demonstreert.

<?php // Het bestand bovenkant.php ?> <html> <head> <title>Voorbeeld</title> </head> <body>

<?php // Andere opdrachten. require('bovenkant.php'); // Andere opdrachten. require('onderkant.php'); // Andere opdrachten. ?>

<?php // Het bestand onderkant.php ?> </body> </html>

Page 29: Webapplicaties in PHP en MySQLinformatica.haperen.com/files/PHP_Cursus_v3-2.pdf · kun je vinden in de ELO-BRONNEN-GEDEELDE DOCUMENTEN-INFORMATICA-HST 09 PHP & MYSQL. het gaat om

PHP Cursus Pagina 29

6 Communicatie met een MySQL Database We hebben inmiddels wat basisconstructies uitgelegd voor het maken van eenvoudige programma’s. Met deze basisconstructies heb je voldoende achtergrond om met een MySQL Server te gaan communiceren. Daarom is dat het volgende onderwerp. Voor het laten uitvoeren van SQL opdrachten op een MySQL Server (vanuit PHP) zijn de volgende stappen nodig: Connectie maken: Eerst moet er een connectie gemaakt worden met de MySQL Server die

alle databases met informatie bevat. Database selecteren: Vervolgens dien je een database te selecteren, zodat de MySQL Server

weet op welke database jouw queries uitgevoerd dienen te worden. Query voorbereiden: De SQL query die je wilt sturen dient gemaakt te worden, eventuele

variabelen in de query dienen ingevuld te worden. Query uitvoeren: Als de query af is, dan kan de query naar de MySQL Server gestuurd

worden. Dit zodat de MySQL Server de query kan uitvoeren. Eventuele resultaten opvragen: Als je een SELECT query uitvoert, dan wil je ook de resultaten kunnen opragen, zodat je die kan weergeven.

6.1 PHP en MySQL: Connectie maken Connecties maken gaat met de opdracht mysql_connect($server, $gebruiker, $wachtwoord);. Deze opdracht retourneert een resource als het maken van een connectie slaagt. Als het maken van een connectie niet lukt dan retourneert de opdracht onwaar (false). Een resource is een variabele van een speciaal type: het slaat namelijk voor PHP alle informatie op die nodig is om met de MySQL server te praten. De waardes voor $server, $gebruiker en $wachtwoord zijn afhankelijk van de instellingen van de MySQL Server. Voor UsbWebserver kunnen de volgende gegevens gebruikt worden:

$server: De waarde ’localhost’. $gebruiker: De waarde ’ln99999’. (waarbij de 99999 dan jouw leerlingnummer is) $wachtwoord: De waarde ’wachtwoord’. (dit is dan weer je eigen wachtwoord)

Het volgende voorbeeld maakt connectie met de MySQL server.

<?php $connectie = mysql_connect('localhost', 'ln99999', 'jouw_wachtwoord'); if ($connectie == false) { // Er is iets fout gegaan, geef een foutmelding. } ?>

Page 30: Webapplicaties in PHP en MySQLinformatica.haperen.com/files/PHP_Cursus_v3-2.pdf · kun je vinden in de ELO-BRONNEN-GEDEELDE DOCUMENTEN-INFORMATICA-HST 09 PHP & MYSQL. het gaat om

PHP Cursus Pagina 30

6.2 PHP en MySQL: Database selecteren De database selecteren gaat met de opdracht mysql_select_db($database, $connectie) Deze opdracht retourneert waar (true) als het selecteren van een database lukt, als het selecteren niet lukt, dan retourneert de opdracht onwaar (false). Verder is $database de naam van de database die je wilt selecteren, en $connectie een resource die afkomstig is van een aanroep van mysql_connect(). Het volgende voorbeeld maakt connectie met de MySQL server en selecteert de roostertabel.

6.3 PHP en MySQL: Query voorbereiden Dit is niets nieuws. Een query is gewoon wat tekst, als je daar variabelen in wilt verwerken dan kan dat op twee manieren. Namelijk door teksten aan elkaar te plakken met de punt ., of door Variabelen op te nemen binnen ”dubbele aanhallingstekens”. Wel dien je tekstuele variabelen die je wilt opnemen in een query te laten opschonen met de opdracht mysql_real_escape_string($tekst, $connectie), waarbij $tekst de invoertekst is, en $connectie een resource die afkomstig is van een aanroep van mysql_connect(). De opdracht mysql_real_escape_string() is nodig om er voor te zorgen dat ook MySQL de tekst als tekst ziet (en niet als onderdeel van de query). Zie het voorbeeld bij het uitvoeren van een query voor het gebruik van mysql_real_escape_string().

6.4 PHP en MySQL: Query uitvoeren Als je de tekst van je query hebt bepaald, dan kan je de query uitvoeren. Dit kan met de op- dracht mysql_query($query, $connectie) , waarbij $query de SQL query is, en $connectie een resource die afkomstig is van een aanroep van mysql_connect(). Het resultaat van de opdracht mysql_query() hangt af van het type query en of de query goed uitgevoerd is:

• Als een query niet goed uitgevoerd is: dan is het resultaat onwaar (false). • Als de query wel goed is uitgevoerd en de query resultaten heeft: dan is het resultaat een

resource met alle informatie voor PHP om het resultaat op te vragen bij de MySQL Server. Queries die beginnen met SELECT zijn queries die resultaat hebben.

• Als de query wel goed is uitgevoerd en de query geen resultaten heeft: dan is het resultaat waar (true). Queries die beginnen met INSERT, UPDATE en DELETE zijn queries die geen resultaat hebben.

<?php $connectie = mysql_connect('localhost', 'ln99999', 'jouw_wachtwoord'); if ($connectie == false) { // Er is iets fout gegaan, geef een foutmelding. } if (mysql_select_db('ln99999_rooster0708', $connectie) == false) { // Er is iets fout gegaan, geef een foutmelding. } ?>

Page 31: Webapplicaties in PHP en MySQLinformatica.haperen.com/files/PHP_Cursus_v3-2.pdf · kun je vinden in de ELO-BRONNEN-GEDEELDE DOCUMENTEN-INFORMATICA-HST 09 PHP & MYSQL. het gaat om

PHP Cursus Pagina 31

Het volgende voorbeeld vraagt alle groepscodes voor V6 uit de roosterdatabase op.

6.5 PHP en MySQL: Resultaten opvragen Tot nu toe hebben we alles besproken, behalve het weergeven van de resultaten van een query. Daarvoor dienen we deze resultaten eerst beschikbaar te hebben binnen PHP. Om een rij resultaten op te halen nadat een query is uitgevoerd kan de functie mysql_fetch_assoc($resultaat) gebruikt worden, waarbij $resultaat een resource is die afkomstig is van een aanroep van mysql_query(). Deze functie zet de resultaten om in een associatieve array, waarbij de sleutel de kolomnaam is. De functie mysql_fetch_assoc() geeft niet waar (false) als resultaat als er geen rijen meer zijn. Als je vervolgens de resultaten van de query wil weergeven, in je webpagina, dan moet je uitkijken. De gegevens in de database kunnen namelijk tekst bevatten die er voor een broswer uitziet als HTML. De opdracht htmlentities($tekst), waarbij $tekst een tekst is, kan gebruikt worden om er voor te zorgen dat ook de broswer de resultaten die je naar hem stuurt als tekst ziet. Het volgende voorbeeld gaat verder waar het vorige voorbeeld ophield: het vraagt alle groepscodes voor V6 op uit de roosterdatabase, en laat ze vervolgens zien.

<?php $connectie = mysql_connect('localhost', 'ln99999', 'jouw_wachtwoord'); if ($connectie == false) { // Er is iets fout gegaan, geef een foutmelding. } if (mysql_select_db('ln99999_rooster0708', $connectie) == false) { // Er is iets fout gegaan, geef een foutmelding. }

$code = mysql_real_escape_string('V6', $connectie); $query = "SELECT * FROM adminnr_groep WHERE groep LIKE ’$code%’;"; $resultaat = mysql_query($query, $connectie); if ($resultaat == false) { // Er is iets fout gegaan, geef een foutmelding. } ?>

<?php $connectie = mysql_connect('localhost', 'ln99999', 'jouw_wachtwoord'); if ($connectie == false) { // Er is iets fout gegaan, geef een foutmelding. } if (mysql_select_db('ln99999_rooster0708', $connectie) == false) { // Er is iets fout gegaan, geef een foutmelding. }

Page 32: Webapplicaties in PHP en MySQLinformatica.haperen.com/files/PHP_Cursus_v3-2.pdf · kun je vinden in de ELO-BRONNEN-GEDEELDE DOCUMENTEN-INFORMATICA-HST 09 PHP & MYSQL. het gaat om

PHP Cursus Pagina 32

6.6 Opdrachten 1. Maak een webpagina die de aanwezige blogs weergeeft. 2. Maak een webpagina die één blog en bijbehorende reacties weergeeft. Laat het blog dat

weergegeven wordt afhangen van een variabele $id, die je de vaste waarde 1 geeft. Noot: Later wordt besproken hoe je dit van gebruikersinvoer kan laten afhangen.

10 11 $code = mysql_real_escape_string('V6', $connectie); 12 $query = "SELECT * 13 FROM adminnr_groep 14 WHERE groep LIKE '$code%';"; 15 16 $resultaat = mysql_query($query, $connectie); 17 if ($resultaat == false) { 18 // Er is iets fout gegaan, geef een foutmelding. 19 } 20 21 // Een voorwaarde zoals $x = waarde doet het volgende: 22 // - Geef de variabel $x de waarde. 23 // - Kijk vervolgens of de waarde van $x waar is. 24 while ($rij = mysql_fetch_assoc($resultaat)) { 25 echo htmlentities($rij['groep']) . '<br>'; 26 } 27 ?>

Page 33: Webapplicaties in PHP en MySQLinformatica.haperen.com/files/PHP_Cursus_v3-2.pdf · kun je vinden in de ELO-BRONNEN-GEDEELDE DOCUMENTEN-INFORMATICA-HST 09 PHP & MYSQL. het gaat om

PHP Cursus Pagina 33

Formulieren en Invoer

Koos van Gogh Loet van Haperen

Sept 2014

Met een database vol gegevens en een eenvoudig programmatje kunnen we evenveel als dat we al konden met HTML alleen. We kunnen namelijk prima webpagina’s maken met een vaste inhoud. Het wordt tijd dat we het geheel dynamisch gaan maken, zodat we niet alleen gegevens kunnen bekijken, maar ook kunnen toevoegen, aanpassen en verwijderen.

Daarvoor hebben we natuurlijk wel een manier nodig om aan nieuwe gegevens te komen, namelijk formulieren. Een formulier is een (onderdeel van een) webpagina waar gegevens kunnen worden ingevuld, zodat ze vervolgens kunnen worden opgestuurd naar een webapplicatie. Dit deel gaat over het aanmaken en uitlezen van deze formulieren.

Page 34: Webapplicaties in PHP en MySQLinformatica.haperen.com/files/PHP_Cursus_v3-2.pdf · kun je vinden in de ELO-BRONNEN-GEDEELDE DOCUMENTEN-INFORMATICA-HST 09 PHP & MYSQL. het gaat om

PHP Cursus Pagina 34

7 Opfrissen: HTML Formulieren zijn onderdeel van de webpagina, en ze worden dus aangemaakt door middel van HTML code. Dus voordat we formulieren kunnen maken frissen we even onze kennis van HTML op. HTML is een taal, die bedoeld is om informatie mee op te maken. Dit kun je doen door stukken informatie te omsluiten met HTML tags. Deze tags zorgen er vervolgens voor dat het omsloten stukje tekst speciaal word behandeld. In het volgende stukje HTML zijn de belangrijkste zaken zichtbaar. Alle HTML tags beginnen met < en eindigen met >.

1 Deze <b style="color: green;">tekst</b> is een voorbeeld. De tekst tekst is omsloten door <b>-tags. Daarbij is <b style="color: green;"> de begin-tag, deze geeft het begin van de omsloten tekst aan. Verder is </b> de sluit-tag, deze geeft het einde van de omsloten tekst aan. De tagnaam van de begin-tag <b style="color: green;"> is b. De naam is altijd de eerste tekst direct na het teken <. Verder heeft de begin-tag één attribuut met de naam style en de waarde "color: green;". Attributen maken het mogelijk om het gedrag van een tag verder aan te passen. De meeste tags worden in begin en sluit-tag paren gebruikt, waarbij de sluit-tag altijd de vorm </tagnaam> heeft.

8 Het maken van een eenvoudig formulier Formulieren dienen altijd compleet omsloten te zijn door de <form> tag. Deze zorgt ervoor dat alle invoerelementen in het formulier worden verzonden naar een specifieke plek. De <form> tag heeft twee belangrijke attributen, namelijk:

action: De hyperlink van de webapplicatie die de inhoud van het formulier verwerkt.

method: De methode waarmee het formulier verstuurt word, er zijn twee mogelijke

manieren:

GET: De browser verpakt alle gegevens van het formulier in de hyperlink van de webappli- catie die de inhoud van het formulier verwerkt. Vervolgens word deze hyperlink door de browser opgevraagd. Hierdoor komt het snel voor dat een formulier meermalen word verzonden, gebruik deze methode dan ook alleen voor het opvragen van informatie.

POST: De geprefereerde methode. De browser vraagt de webapplicatie op die het formulier dient te verwerken. Vervolgens stuurt de browser alle gegevens van het formulier naar deze webapplicatie.

Page 35: Webapplicaties in PHP en MySQLinformatica.haperen.com/files/PHP_Cursus_v3-2.pdf · kun je vinden in de ELO-BRONNEN-GEDEELDE DOCUMENTEN-INFORMATICA-HST 09 PHP & MYSQL. het gaat om

PHP Cursus Pagina 35

8.1 Eenvoudige controls Binnen de <form> tags plaats je controls, zoals invoervelden en knoppen. Alle controls hebben een attribuut name, dat de naam aangeeft van het control. Deze naam is nodig om het control later (binnen PHP) uit te lezen. De meeste controls maak je door middel van de <input> tag, en om onderscheid te maken tussen de verschillende controls heeft de <input> tag het attribuut type. De volgende waardes voor type kunnen gebruikt worden: text: Een eenvoudig tekstveld, waar een regel tekst kan worden ingevoerd. Met het attribuut

value kan de standaardinhoud van het tekstveld ingesteld worden. password: Een eenvoudig tekstveld, waar een regel tekst kan worden ingevoerd. Je kunt als

gebruiker niet zien wat je ingetypt hebt. Met het attribuut value kan de standaardinhoud van het tekstveld ingesteld worden.

checkbox: Een aankruisvakje kan gebruikt worden voor ja/nee keuzes. Het attribuut value is

verplicht, en bevat de waarde van het aankruisvakje. Deze waarde wordt verstuurd naar de webserver als het aankruisvakje aangevinkt wordt.

radio: Meerdere keuzerondjes met dezelfde naam kunnen worden gebruikt om een keuze

tussen meerdere opties te maken. Het attribuut value is verplicht, en bevat de waarde van een keuzerondje. De waarde van het geselecteerde keuzerondje wordt verstuurd naar de webserver.

submit: De knop waarmee het formulier verstuurd kan worden. Met het attribuut value kan de

tekst op de knop ingesteld worden. reset: De knop waarmee de inhoud van het formulier terug gezet kan worden naar de

standaard- waarde. Met het attribuut value kan de tekst op de knop ingesteld worden.

8.2 Een zeer eenvoudig formulier Het volgende stukje HTML geeft een voorbeeld van een eenvoudig formulier.

8.3 Opdrachten Deze opdrachten zijn bedoeld om te oefenen van het maken van formulieren met behulp van HTML code.

1. Maak een eenvoudig formulier met de besproken controls. Probeer het netjes op te maken. Laat het formulier zijn gegevens versturen met de POST-methode.

2. Verstuur het formulier, en let op de adresbalk. Pas vervolgens het formulier aan zodat het zijn gegevens verstuurt via de GET-methode. Verstuur ook dit nieuwe formulier, en let weer op de adresbalk.

<form action="een_pagina.php" method="post"> Gebruikersnaam: <input name="gebruikersnaam" type="text"> <input type="submit" value="versturen"> </form>

Page 36: Webapplicaties in PHP en MySQLinformatica.haperen.com/files/PHP_Cursus_v3-2.pdf · kun je vinden in de ELO-BRONNEN-GEDEELDE DOCUMENTEN-INFORMATICA-HST 09 PHP & MYSQL. het gaat om

PHP Cursus Pagina 36

9 Uitgebreide formulieren Er zijn meer controls mogelijk dan die hierboven beschreven zijn. Ook kunnen formulieren (net als alle andere HTML onderdelen) compleet aangepast worden naar je eigen wensen. Zorg er wel voor dat je niet te ver doordraaft, een goed formulier werkt namelijk zoals mensen verwachten dat het werkt: zoals alle andere formulieren werken. Zie het voorbeeldprogramma voorbeeld_formulier voor goede (en slechte) voorbeelden van formulieren. De uitgebreide controls die in de rest van dit hoofdstuk worden besproken zijn ook in dat voorbeeldprogramma terug te vinden.

9.1 Tekstvakken Voor het invoeren van grote hoeveelheden tekst, over meerdere regels, is het eenvoudige tekstveld niet geschikt. Je kunt daarvoor beter het tekstvak gebruiken. Deze wordt aangemaakt door de tag <textarea>, de tag heeft extra attributen cols en rows voor het instellen van de grote van het tekstvak. Het volgende fragment HTML geeft een voorbeeld van het gebruik van een tekstvak.

9.2 * Labels voor aankruisvakjes en keuzerondjes Aankruisvakjes en keuzerondjes zijn nogal klein. Meestal word er rechts van deze controls tekst geplaatst, een zogenaamde label. Het is mogelijk deze tekst aan de control te koppelen, zodat als er op de tekst geklikt word, het aankruisvakje of keuzerondje gekozen wordt. Dit krijg je werkend door de controls het attribuut id te geven, met als waarde een unieke naam. Vervolgens omsluit je de tekst met de tag <label>, deze heeft het attribuut for, die als waarde de id van een control heeft. Het volgende fragment HTML geeft een voorbeeld van het gebruik van keuzerondjes met labels.

<form action="een_pagina.php" method="post"> Reactie: <textarea name="reactie">Typ hier je reactie</textarea> </form>

<form action="een_pagina.php" method="post"> Wat hoort er niet bij:<br> <input id="school" name="antwoord" type="radio"> <label for="school">School</label> <input id="feest" name="antwoord" type="radio"> <label for="feest">Feest</label> <input id="pretpark" name="antwoord" type="radio"> <label for="pretpark">Pretpark</label> </form>

Page 37: Webapplicaties in PHP en MySQLinformatica.haperen.com/files/PHP_Cursus_v3-2.pdf · kun je vinden in de ELO-BRONNEN-GEDEELDE DOCUMENTEN-INFORMATICA-HST 09 PHP & MYSQL. het gaat om

PHP Cursus Pagina 37

9.3 * Selectievakken Een selectievak doet hetzelfde als het keuzerondje, het maakt het mogelijk een optie te kiezen uit een lijst met opties. Een selectievak wordt aangemaakt door middel van de <select> tag. Deze tag dient een verzameling mogelijke waardes te omsluiten. Zo’n waarde wordt opgegeven met een <option> tag. De <option> tag heeft het attribuut value, deze bevat de waarde van de optie. De waarde van de geselecteerde optie wordt verstuurd naar de webserver. Het volgende fragment HTML geeft een voorbeeld van het gebruik van een selectievak.

9.3.1 * Meervoudige selectievakken Door aan de <select> tag het attribuut multiple (zonder waarde) toe te voegen maak je van het selectievak een meervoudig selectievak. Vervolgens kan je met het attribuut size het aantal regels dat het selectievak groot is opgeven. Om alle gegevens te kunnen ontvangen in PHP dien je de naam van de select tag te laten eindigen op []. Daarmee slaat PHP alle ontvangen waardes voor deze select tag op in een array.

9.4 Opdrachten Deze opdrachten zijn bedoeld om te oefenen met het maken van formulieren met behulp van HTML code. Na het uitvoeren van deze opdrachten hebben we weer een stukje van het blog af, namelijk de invoerformulieren.

1. Maak een formulier waarmee je een blog kan plaatsen. Vergeet niet om ook een invoerveld toe te voegen voor de gebruikersnaam.

2. Maak een formulier waarmee je een reactie kan plaatsen. Vergeet niet om ook een invoerveld toe te voegen voor de gebruikersnaam.

<form action="een_pagina.php" method="post"> Wat hoort er niet bij: <select name="antwoord"> <option value="school">School</option> <option value="feest">Feest</option> <option value="pretpark">Pretpark</option> </select> </form>

Page 38: Webapplicaties in PHP en MySQLinformatica.haperen.com/files/PHP_Cursus_v3-2.pdf · kun je vinden in de ELO-BRONNEN-GEDEELDE DOCUMENTEN-INFORMATICA-HST 09 PHP & MYSQL. het gaat om

PHP Cursus Pagina 38

10 Het uitlezen van een formulier Het uitlezen van een formulier in PHP is simpel. PHP maakt namelijk twee variabelen aan met alle formuliergegevens. Deze variabelen zijn overal in je programma beschikbaar. Formulieren die via de POST-methode zijn verstuurd kunnen worden uitgelezen via de variabele $_POST, Forulieren die via de GET-methode zijn verstuurd kunnen worden uitgelezen via de variabele $_GET. Zowel $_POST als $_GET zijn associatieve arrays, waarbij de sleutel gelijk is aan de naam van een control, en de waarde gelijk is aan de inhoud van dat control. Als verschillende controls dezelfde naam hebben, dan wordt maar een waarde onthouden. Dit kan voorkomen worden door de naam te laten eindigen op [], als een naam daarmee eindigt dan wordt er in plaats van één waarde een array met alle waardes bijgehouden door PHP. We geven een voorbeeld, namelijk het reactieformulier met tekstvak. Deze kan worden verwerkt door de pagina een_pagina.php met de volgende inhoud. Natuurlijk doet dit voorbeeld niet veel spannends. Het voorbeeldprogramma voorbeeld_formulier demonstreert ook hoe een formulier uitgelezen wordt.

10.1 Opdrachten

Deze opdrachten zijn bedoeld om te oefenen met het uitlezen van formulieren met behulp van PHP. Na het uitvoeren van deze opdrachten hebben we weer een stukje van het blog af, namelijk het verwerken van de invoerformulieren.

1. Pas het voorbeeld voor het verwerken van een formulier met een reactie zodanig aan dat alles via de GET-methode verstuurd word. Let vervolgens op alle verschillen. Hint: let op de adresbalk, en vernieuw de pagina met het resultaat naar het versturen van het formulier.

2. Lees het formulier uit voor het plaatsen van een blog, en plaats deze gegevens in de database. Controleer of alle invoer bestaat, zoek de gebruiker_id die hoort bij de gebruikersnaam en gebruik mysql_real_escape_string() om de invoer veilig te maken. In INSERT queries kan de waarde NOW() gebruikt worden als de huidige tijd, dit voor het veld tijd.

3. Lees het formulier uit voor het plaatsen van een reactie, en plaats deze gegevens in de database.

<form action="een_pagina.php" method="post"> Reactie: <textarea name="reactie">Typ hier je reactie</textarea> </form>

<?php $inhoud_reactie = $_POST['reactie']; ?> Reactie was: <?php echo htmlentities($inhoud_reactie); ?>

Page 39: Webapplicaties in PHP en MySQLinformatica.haperen.com/files/PHP_Cursus_v3-2.pdf · kun je vinden in de ELO-BRONNEN-GEDEELDE DOCUMENTEN-INFORMATICA-HST 09 PHP & MYSQL. het gaat om

PHP Cursus Pagina 39

11 Fomulier invoer namaken via een hyperlink Bij de GET-methode van het versturen van informatie verpakt de browser alle gegevens van het formulier in de hyperlink van de webapplicatie. Dit kan je zelf ook nadoen, en dat is een handige methode om informatie door te geven aan andere pagina’s. De GET-methode versleutelt de informatie op de volgende manier in een hyperlink:

http://iets/bestand.php?naam_1=waarde_1&naam_2=waarde_2.

Daarbij zijn naam_1 en naam_2 de namen van de verschillende velden, en tevens de sleutel in de associatieve array $_GET. Verder wordt het vraagteken (?) gebruikt om de bestandsnaam te scheiden van de formulierinformatie, en & wordt gebruikt om verschillende formuliervelden te maken. Het volgende voorbeeld, om formulieren uit te lezen, kan dus ook aangestuurd worden met speciale hyperlinks.

11.1 Opdrachten 1. Je hebt in het vorige hoofdstuk een pagina gemaakt waarin een blog met zijn reacties wordt

weergegeven. Deze koos het blog door middel van een variabele $id. Stel de waarde van deze variabele in met de waarde van $_GET[’id’]. Hint: Controleer of $_GET[’id’] bestaat met isset(), controleer of $_GET[’id’] een numerieke waarde heeft met is_numeric(). Zet hem vervolgens om in een getal door middel van casting.

2. Je hebt ook een overzichtpagina gemaakt met alle blogs. Voeg aan elke blog een hyperlink toe naar de pagina met het blog en alle reacties. Zorg ervoor dat de hyperlink de goede vorm heeft.

<?php // Sla dit voorbeeld op als pagina.php, in de Root directory van UsbWebserver. // Roep het vervolgens aan via http://ln99999.haperen.eu/pagina.php en via // http://ln99999.haperen.eu/pagina.php?id=iets. if (isset($_GET['id'])) { echo 'Het veld id heeft de waarde ' . htmlentities($_GET['id']); } ?>

Page 40: Webapplicaties in PHP en MySQLinformatica.haperen.com/files/PHP_Cursus_v3-2.pdf · kun je vinden in de ELO-BRONNEN-GEDEELDE DOCUMENTEN-INFORMATICA-HST 09 PHP & MYSQL. het gaat om

PHP Cursus Pagina 40

12 * Sessies PHP bied de mogelijkheid om de waarde van enkele variabelen te onthouden tussen verschillende aanroepen van een webapplicatie. Dit kan erg handig zijn, als je bijvoorbeeld wil bijhouden welke gebruiker is ingelogd. Deze techniek heet sessies, en er is een beetje werk voor nodig om het allemaal werkend te krijgen. Als je sessies serieus wilt gaan gebruiken in je applicatie, dan raden we het aan om je een beetje te verdiepen in de achterliggende techniek en in de veiligheid van sessies. Het laatste deel van deze cursus kan daarvoor een aanknopingspunt zijn. Voordat je sessies kan gebruiken, dien je PHP te laten weten dat je met sessies gaat werken. Dit gaat door middel van de opdracht session_start(). Door het uitvoeren van deze opdracht zoekt PHP uit of er al een sessie is voor de huidige cliënt. Als deze er niet is (het is een nieuwe sessie) dan maakt PHP een nieuwe sessie aan. De opdracht session_start() dient altijd aan het begin van je webapplicatie uitgevoerd te worden, voordat je gegevens naar de cliënt stuurt. Als een sessie is gestart kan je eenvoudig informatie opslaan en uitlezen in de associatieve ar- ray $_SESSION. Als je de sessie niet meer nodig hebt, kan je hem afsluiten met de functie session_destroy(). Standaard worden sessies vernietigd als de gebruiker zijn browser afsluit. Als je dit wil voorkomen, dan dien je zelf de duur van de sessie in te stellen. Dit kan met de functie session_set_cookie_params(getal), waarbij getal aangeeft over hoeveel seconden de sessie ophoudt te bestaan. Zie het voorbeeldprogramma voorbeeld_sessies voor een voorbeeld van het gebruik van sessies.

12.1 * Opdracht Pas het voorbeeldprogramma voorbeeld_sessies aan, zodat de sessie blijft bestaan als je de browser afsluit.

Page 41: Webapplicaties in PHP en MySQLinformatica.haperen.com/files/PHP_Cursus_v3-2.pdf · kun je vinden in de ELO-BRONNEN-GEDEELDE DOCUMENTEN-INFORMATICA-HST 09 PHP & MYSQL. het gaat om

PHP Cursus Pagina 41

Beveiliging

Koos van Gogh Loet van Haperen

Sept 2014 Een applicatie schrijven is niet enorm moeilijk, een veilige applicatie schrijven is daarentegen zeer moeilijk (misschien zelfs onmogelijk). Voor het schrijven van een “beveiligde” applicatie is vooral kennis nodig over de omgeving waarin de applicatie draait. Met omgeving wordt ondermeer de gebruikers, andere applicaties, het netwerk en de tabellen met gegevens in de databases bedoeld.

Page 42: Webapplicaties in PHP en MySQLinformatica.haperen.com/files/PHP_Cursus_v3-2.pdf · kun je vinden in de ELO-BRONNEN-GEDEELDE DOCUMENTEN-INFORMATICA-HST 09 PHP & MYSQL. het gaat om

PHP Cursus Pagina 42

13 Beveiligen: Waar het fout kan gaan Voor de veiligheid van je applicaties is het belangrijk om je applicaties goed te ontwerpen. Bij zo’n ontwerp houd je ook rekening met kwaadwillende gebruikers. Dat kwaadwillende gebruikers op veel punten dingen fout kunnen laten gaan, laten we zien door bij elk onderdeel dat betrokken is bij het opvragen van een webpagina mogelijke beveiligingsproblemen op te noemen.

Client Netwerk Server

Webpagina Webpagina Gegevens

Verzoek Voert uit Query

Gebruiker PC

Webserver (Apache)

Applicatie (PHP)

Database (MySQL)

Figuur 2: Onderdelen in een webapplicatie

Gebruiker: De gebruiker wordt voor de grap wel eens het grootste gat in de beveiliging genoemd. De gebruiker kan bijvoorbeeld notities achterlaten met zijn wachtwoord, hij kan een wacht- woord kiezen dat heel eenvoudig te raden is of hij kan zijn pc onbeheerd achterlaten waardoor onbevoegden toegang hebben tot alles waarbij de gebruiker is ingelogd. Dit laatste is al snel een risico als je applicatie de gebruiker kan onthouden (bijvoorbeeld de optie “Onthoud mij” bij Hyves). Mensen die misbruik willen maken van een systeem door middel van de gebruiker hebben niet veel technische kennis nodig, vooral persoonsinformatie is handig. Het internet maakt het verkrijgen van persoonsinformatie steeds makelijker, bijvoorbeeld via de berg aan informatie die mensen achterlaten op profielsites zoals Hyves en MySpace. Met deze persoonsinformatie kan soms zelfs wachtwoordbeveiliging omzeild worden. Zo is het bij Hotmail mogelijk je (vergeten) wachtwoord opnieuw in te stellen als je het antwoord weet op een “geheime vraag”. Een voorbeeld van zo’n vraag is “De naam van mijn favoriete huisdier?”.

PC: Op de pc kan een hoop ongewenste rommel staan, zoals spyware die bijhoudt wat de

gebruiker intypt. Of virussen die de gebruikers bewust doorsturen naar verkeerde website, zoals een nep-site die zich voordoet als de website van een bank.Veel van deze problemen worden veroorzaakt door onkunde van de gebruiker zelf, en daar kan je met een webapplicatie niets tegen doen. Wel kan je proberen de gebruiker “op te voeden”. De Nederlandse Vereniging van Banken probeert dit bijvoorbeeld via http://www.3xkloppen.nl/.

Page 43: Webapplicaties in PHP en MySQLinformatica.haperen.com/files/PHP_Cursus_v3-2.pdf · kun je vinden in de ELO-BRONNEN-GEDEELDE DOCUMENTEN-INFORMATICA-HST 09 PHP & MYSQL. het gaat om

PHP Cursus Pagina 43

Page 44: Webapplicaties in PHP en MySQLinformatica.haperen.com/files/PHP_Cursus_v3-2.pdf · kun je vinden in de ELO-BRONNEN-GEDEELDE DOCUMENTEN-INFORMATICA-HST 09 PHP & MYSQL. het gaat om

PHP Cursus Pagina 44

Netwerk: Standaard word alle informatie als gewone tekst verstuurd over het netwerk, zelfs inge- vulde formulieren met wachtwoorden worden zonder beveiliging verstuurd. Dit veroorzaakt problemen als het netwerk niet veilig is. Zo kan een onveilig netwerk apparatuur bevatten dat al het netwerkverkeer afluistert. Er kan gebruik worden gemaakt van een beveiligde verbinding om er voor te zorgen dat gegevens niet als gewone tekst verstuurd worden. Zo’n beveiligde verbinding is te herkennen aan de adresbalk, die begint dan met https:// in plaats van http://. Voor zo’n beveiligde verbinding heeft de webserver een certificaat nodig, dat zijn documenten met gegevens om het dataverkeer mee te versleutelen. Een beveiligde verbinding heeft wel enkele nadelen. Zo kosten de certificaten geld, en het aanmaken van een beveiligde verbinding kost meer rekenkracht en dataverkeer dan een gewone onveilige verbinding.

Webserver: De voornaamste problemen bij de webserver worden veroorzaakt doordat de webserver

niet goed is ingesteld of doordat er fouten (“bugs”) in de webserver zitten. Zowel een foute instelling als een bug in de webserver kunnen de buitenwereld toegang geven tot systeembe- standen, zoals bestanden met wachtwoorden. Het is dan ook belangrijk om de webserver, en andere software op servers, goed in te (laten) stellen en vervolgens up-to-date te houden.

Applicatie: Ook bugs in de webapplicatie zelf kunnen de buitenwereld toegang geven tot sys-

teembestanden, maar de meeste bugs in webapplicaties veroorzaken andere soorten aanval- len. Veel voorkomende aanvallen zijn SQL Injection en Cross-site scripting. Deze aanvallen worden beide apart besproken.

Database: Het komt niet erg vaak voor dat bugs in de databasesoftware een veiligheidsprobleem

opleveren. Als de database bij een beveiligingsprobleem betrokken is, dan is dat meestal door een fout in een webapplicatie (SQL Injection). Wel kan de manier waarop gevoelige gegevens, zoals wachtwoorden, worden opgeslagen in de database een beveiligingsprobleem vormen als onbevoegden toegang hebben tot deze gegevens.

De bovenstaande lijst is natuurlijk niet compleet. Het doel van de bovenstaande lijst is dan ook om je bewust te maken van het feit dat onveiligheden op heel veel plekken in je applicatie kan sluipen. Dit gebeurt zelfs buiten het gebied dat je zelf controleert als programmeur.

13.1 Opdracht Bekijk de volgende uitspraken over beveiliging.

1. Beveiligen is een bewustwordingsproces. 2. Beveiliging is een compromis. 3. Een kwaadwillende komt altijd binnen.

Probeer, voor elke uitspraak, de uitspraak te beschrijven in eigen woorden of geef een voorbeeld die de uitspraak ondersteunt.

Page 45: Webapplicaties in PHP en MySQLinformatica.haperen.com/files/PHP_Cursus_v3-2.pdf · kun je vinden in de ELO-BRONNEN-GEDEELDE DOCUMENTEN-INFORMATICA-HST 09 PHP & MYSQL. het gaat om

PHP Cursus Pagina 45

14 Tips voor het maken van een veiligere applicatie We hebben zojuist gekeken waar de veiligheid van je applicatie in het geding kan zijn, maar dit draagt niet direct bij tot de veiligheid van je applicatie. Daarom geven we enkele tips die je kan gebruiken tijdens het bedenken, ontwerpen en maken van je applicatie. Bij elke tip wordt uitleg geven over het hoe en waarom van die tip. Houd er rekening mee dat er kwaadwillende zijn: Bekijk alles wat je maakt kritisch. Bedenk bij elk onderdeel manieren waarop je je applicatie kan misbruiken, en zorg er vervolgens voor dat je je applicatie tegen elke vorm van misbruik die je kan bedenken en ontdekken beschermt.

• Deze kritische kijk moet je tijdens het gehele ontwikkelproces aanhouden. Programmeer defensief: Controleer of alle opdrachten die fout kunnen gaan, wel goed zijn uit- gevoerd.

• Controleer bijvoorbeeld of het aanmaken van de databaseconnectie gelukt is en of de queries goed uitgevoerd zijn.

• Controleer of er bij een query resultaat is. Dit hoeft namelijk niet altijd zo te zijn, een gebruiker kan ook gegevens opvragen die niet (meer) bestaan.

• Zorg ervoor dat er geen fouten met onhandige foutmeldingen ontstaan. Deze zijn voor de gewone gebruiker onplezierig en een kwaadwillende kan uit foutmeldingen informatie halen over de werking van je systeem.

Vertrouw geen invoer: Controleer altijd of je alle invoer hebt die nodig is en controleer of het de vorm heeft die je verwacht. Controleer bijvoorbeeld bij teksten die numeriek behoren te zijn, of ze ook echt numeriek zijn. Als ze numeriek zijn, zet ze dan pas om naar een integer.

• Door numerieke teksten om te zetten naar een integer weet je zeker dat het ook een vaste vorm heeft. Zo vind PHP de tekst 1e3 numeriek (het is voor PHP namelijk het getal 1 × 103 = 1000), maar andere applicaties zoals MySQL vinden 1e3 helemaal geen getal. Door de tekst 1e3 om te zetten naar een getal weet je zeker dat MySQL de invoer begrijpt.

Zet invoer om in een “veilige” vorm: Gewone tekstuele invoer kan schadelijke inhoud hebben.

• Vervang in een SQL opdracht speciale tekens, zoals ’. Dit kan in PHP en MySQL met de opdracht mysql_real_escape_string(). Hiermee voorkom je dat een creatieve gebruiker direct opdrachten kan uitvoeren op de database.

• Vervang in teksten die in de uiteindelijke webpagina worden opgenomen ongewenste HTML. Dit kan in PHP met de opdracht htmlentities(). Hiermee voorkom je dat een creatieve gebruiker het uiterlijk van de website kan aanpassen. Ook voorkom je dat diezelfde gebruiker javascript opdrachten in de website kan verwerken.

Zorg ervoor dat alle uitvoer veilig is: Ook uitvoer waarvan je niet verwacht dat het HTML kan bevatten, zoals informatie over de webserver, kan HTML bevatten. Ook bij deze uitvoer dient de ongewenste HTML vervangen te worden met behulp van de opdracht htmlentities().

Page 46: Webapplicaties in PHP en MySQLinformatica.haperen.com/files/PHP_Cursus_v3-2.pdf · kun je vinden in de ELO-BRONNEN-GEDEELDE DOCUMENTEN-INFORMATICA-HST 09 PHP & MYSQL. het gaat om

PHP Cursus Pagina 46

Gebruik standaard de POST-methode voor het verzenden van formulier: Bij de GET- methode verpakt de browser alle gegevens van een formulier in een hyperlink. Vervolgens word deze hyperlink door de browser opgevraagt. Een kwaadwillende kan ook zo’n hyperlink maken, en vervolgens een gebruiker verleiden op die hyperlink te klikken. Voor de webappli- catie lijkt het dan dat alsof de niets vermoedende gebruiker een formulier heeft ingevoerd. Als dit formulier bestemd is voor het verwijderen van bijvoorbeeld het gebruikersaccount, dan verwijdert de gebruiker ongewenst zijn account.

• In de praktijk gebruik je de GET-methode alleen voor het opvragen van informatie, bijvoorbeeld bij zoekpagina’s.

• Gebruik altijd de POST-methode als het formulier gegevens toevoegt, verwijdert of aanpast in de database.

Ga verstandig om met vertrouwelijke gegevens: Sla vertrouwelijke gegevens, zoals wachtwoor- den, niet zomaar op in een tabel.

• Gebruikers hebben vaak een (of enkele) wachtwoorden die ze gebruiken voor heel veel webpagina’s en applicaties. Als iemand toegang verkrijgt tot jou database, waar deze wachtwoorden leesbaar instaan, dan heeft de gemiddelde gebruiker dus een probleem aangezien zijn vaak gebruikte wachtwoord bekend is.

• Het opslaan van vertrouwelijke gegevens dient wel te gebeuren, en dit is absoluut geen triviale bezigheid. Er bestaat dan ook geen algemene werkbare oplossing voor.

Vertrouw sessies niet: Een sessie zorgt ervoor dat informatie tussen verschillende verzoeken van eenzelfde gebruiker bijgehouden kan worden. Deze techniek wordt gebruikt voor het inge- logd blijven van een gebruiker. Maar sessies zijn eenvoudig over te nemen door een andere gebruiker. Een andere gebruiker kan bijvoorbeeld op dezelfde pc verder gaan werken. Ook zijn er veel technische manieren om een sessie over te nemen.

Vraag dus altijd om een wachtwoord bij het wijzigen van wachtwoorden en email adres- sen (deze worden vaak gebruikt om het wachtwoord opnieuw in te stellen).

Vraag voor administratieve taken om extra identificatie. Administratieve taken zijn bijvoorbeeld het aanpassen van rechten en wachtwoorden van de verschillende gebruikers.

Gebruik bij het aanmaken van een nieuwe sessie de functie session_regenerate_id() direct na de functie session_start(). Dit kan bijvoorbeeld zijn tijdens het inloggen van een gebruiker. Dit om er zeker van te zijn dat de sessie-id (waaraan PHP de sessie herkent) geheel door PHP aangemaakt is.

Bekijk online informatie met een kritische blik: Online informatie zoals documentatie, voor- beelden en tutorials voor en over webapplicaties zijn overvloedig. Maar vaak wordt deze informatie geschreven door gewone gebruikers zoals jij en ik, en deze informatie bevat dan ook vaak genoeg fouten en gebreken.

De documentatie van PHP en MySQL wordt grotendeels geschreven door vrijwilligers. Vooral de “User Contributed Notes” (PHP) en “User Comments” (MySQL) worden geschreven door beginners, De kwaliteit daar is vaak ver te zoeken.

Veel tutorials op sites zoals www.phpfreakz.nl zijn verouderd of bevatten grote fouten in de beveiliging.

Page 47: Webapplicaties in PHP en MySQLinformatica.haperen.com/files/PHP_Cursus_v3-2.pdf · kun je vinden in de ELO-BRONNEN-GEDEELDE DOCUMENTEN-INFORMATICA-HST 09 PHP & MYSQL. het gaat om

PHP Cursus Pagina 47

Gebruik online informatie dan ook altijd verstandig. Online informatie is goed bruikbaar als naslagwerk of inspiratie, maar houd altijd een kritische blik en ga nooit domweg alles kopiëren wat je ziet. Zorg voor een veilige omgeving: Door het draaien van je webapplicatie in een veilige omgeving minimaliseer je de gevolgen als er toch iemand weet in te breken. Laat je voor het opzetten van een veilige server desnoods adviseren of bijstaan door een professional.

Een veilige server bevat software die de laatste beveiligingsupdates heeft.

De server heeft een firewall, die alleen netwerkverkeer toelaat dat gewenst is. op de server zijn alleen essentiële zaken ingeschakeld. Alles wat ingeschakeld is, kan Namelijk ook worden gebruikt bij een inbraak.

De omgeving draait al zijn applicaties zoveel mogelijk geïsoleerd. Programma’s (ook je webapplicatie) hoeven alleen toegang te hebben tot hun eigen bestanden en tabellen.

o Maak bijvoorbeeld voor databasetoegang aparte gebruikers aan, die alleen bij jou tabellen kunnen, en die alleen de opdrachten kunnen uitvoeren die nodig zijn (dus wel SELECT en INSERT, maar niet DROP TABLE).

o Mocht er dan toch worden ingebroken in een van de applicaties, dan blijft de schade beperkt tot alles waar die applicatie toegang toe heeft.

Gebruik, waar dat mogelijk en wenselijk is, voor het versturen en ontvangen van vertrouwelijke informatie (zoals wachtwoorden) beveiligde verbindingen.

Om een veilige omgeving te maken en onderhouden is wel wat kennis nodig, dus zoals al gezegd: laat je adviseren of bijstaan door een professional.

14.1 Opdracht Beschrijf een veilige manier voor het opslaan van wachtwoorden in je database. Noem zowel voordelen als nadelen van je manier.

Page 48: Webapplicaties in PHP en MySQLinformatica.haperen.com/files/PHP_Cursus_v3-2.pdf · kun je vinden in de ELO-BRONNEN-GEDEELDE DOCUMENTEN-INFORMATICA-HST 09 PHP & MYSQL. het gaat om

PHP Cursus Pagina 48

15 Onveilige applicaties in de praktijk We laten in dit hoofdstuk enkele veel voorkomende fouten in de beveiliging van een webapplicatie zien. Dit doen we aan de hand van het voorbeeld voorbeeld_beveiliging, dat onderdeel is van de voorbeeldprogramma’s. Het voorbeeld voorbeeld_beveiliging is een eenvoudig maar slecht gastenboek.

15.1 SQL Injection SQL Injection is de naam voor aanvallen waarbij een kwaadwillende via normale invoer de SQL queries kan aanpassen en zo andere SQL queries kan uitvoeren dan de bedoeling is. Daarmee kan de informatie in de database behoorlijk eenvoudig verwijdert of aangepast worden. De werking is eenvoudig. Als een webapplicatie de volgende opdracht bevat:

1 $resultaat = "DELETE * 2 FROM tabelnaam 3 WHERE tabel_id = $id;";

En de variabele $id de waarde 1 OR tabel_id <> 1 heeft, dan wordt de volgende query uitge- voerd:

1 DELETE * 2 FROM tabelnaam 3 WHERE tabel_id = 1 OR tabel_id <> 1;

Wat dus inhoud dat alle rijen in de tabel worden verwijderd in plaats van één rij. Dat is niet de bedoeling. Het beveiligen tegen SQL Injection is in principe zeer eenvoudig. Je dient alleen je invoer goed te controleren. Zo word in het bovenstaande voorbeeld een getal verwacht, en 1 OR tabel_id <> 1 is dat niet. Soms moet je teksten opnemen in je query. Je zoekt bijvoorbeeld de gegevens van een gebruiker en je hebt alleen zijn naam. In zo’n geval dien je speciale tekens (zoals ’ die het einde van tekst in een query aangeeft) in de tekst weg te halen. Dit om te voorkomen dat de invoer van de gebruiker de betekenis van je query aanpast. De functie mysql_real_escape_string() zet speciale tekens zoals ’ om, in tekens die voor MySQL de tekst ’ uitdrukken in plaats van het teken ’ dat het einde van een tekst in een query aangeeft. Wij hebben in al onze voorbeelden de invoer gecontroleerd en de functie mysql_real_escape_string() gebruikt om invoer veilig te maken voor gebruik in queries.

15.1.1 Opdracht Het voorbeeldprogramma controleert niet overal de invoer. Pas de broncode aan, zodat SQL Injection niet meer mogelijk is.

15.2 Cross-site scripting Bij Cross-site Scripting kan door de gebruiker HTML verwerkt worden in de uitvoer. Een kwaadwillende kan daardoor het uiterlijk van de website aanpassen, of javascriptprogramma’s laten uitvoeren. Coss-site scripting is eenvoudig te voorkomen. Je hoeft alleen alle speciale HTML tekens (zoals < en >) om te zetten in tekens die de speciale HTML tekens correct weergeven in de browser. Ook PHP heeft daar een functie voor, namelijk htmlentities(). Deze functie wordt in alle voorbeelden gebruikt om de uitvoer om

Page 49: Webapplicaties in PHP en MySQLinformatica.haperen.com/files/PHP_Cursus_v3-2.pdf · kun je vinden in de ELO-BRONNEN-GEDEELDE DOCUMENTEN-INFORMATICA-HST 09 PHP & MYSQL. het gaat om

PHP Cursus Pagina 49

te zetten naar een vorm zonder speciale HTML tekens.

15.2.1 * Hulpmiddel voor Session Hijacking Alle gegevens van een sessie worden op de server opgeslagen en PHP verbindt aan al deze gegevens een sessie-id. Met de sessie-id zijn de sessiegegevens in het vervolg opvraagbaar. PHP maakt deze sessie-id aan de pc van de gebruiker bekend door middel van een cookie. Een cookie is een stuk informatie dat de pc van de gebruiker bijhoudt, de pc stuurt deze informatie mee met volgende bezoeken aan dezelfde website. Een kwaadwillende kan dan ook heel eenvoudig een sessie overnemen. Hij hoeft alleen, op zijn pc, een geldige cookie met bestaande sessie-id aan te maken. Hiervoor bestaan vele hulpprogramma’s, die vaak gebruikt worden door ontwikkelaars om webapplicaties mee te testen. Als er geen sessie-id’s bij de kwaadwillende bekend zijn, dan zal hij veel sessie-id’s moeten raden, voordat hij een bestaande sessie-id heeft. Maar als door een fout in de verwerking van uitvoer het voor de kwaadwillende mogelijk is javascript te plaatsen op de website waar hij sessies wil overnemen, dan kan hij met een eenvoudig javascriptprogramma alle cookies van alle bezoekende gebruikers naar zich toe laten sturen. Het plaatsen van javascript op een website is een voorbeeld van Cross-site scripting. Dit principe wordt voorgedaan in het voorbeeld voorbeeld_hijacking. Een webapplicatie kan nooit volledig tegen het overnemen van sessies worden beschermd, houd je daarom altijd aan de in het vorige hoofdstuk besproken tips rondom sessies.

15.2.2 Opdrachten

1. Probeer via de webapplicatie “beveiligen” het uiterlijk van de webpagina te veranderen. 2. Pas de broncode aan, zodat Cross-site scripting niet meer mogelijk is.

15.3 Opdrachten

1. De voorbeeldapplicatie bevat nog wel wat meer onvolkomenheden die niet in overeenkomst zijn met de tips, die besproken zijn in dit deel hoofdstuk. Zoek enkele van deze onvolkomen- heden op.

2. Kijk na of je eigen blogapplicatie fouten bevat. Verbeter de fouten en gebreken die je vindt.

3. * Zorg dat gebruikers in kunnen loggen, en dat blogs en reacties onder de naam van de ingelogde

gebruiker worden geplaatst. Dit doormiddel van het gebruik van sessies. Maak een inlogpagina, waar gebruikers naam en wachtwoord kunnen geven. Als deze kloppen stel je

een sessie in met als inhoud het id van de gebruiker. Vervolgens kan je bij het plaatsen van een reactie het opgeslagen id van de gebruiker gebruiken.

Page 50: Webapplicaties in PHP en MySQLinformatica.haperen.com/files/PHP_Cursus_v3-2.pdf · kun je vinden in de ELO-BRONNEN-GEDEELDE DOCUMENTEN-INFORMATICA-HST 09 PHP & MYSQL. het gaat om

PHP Cursus Pagina 50

Appendix

Koos van Gogh Loet van Haperen

Sept 2014

Page 51: Webapplicaties in PHP en MySQLinformatica.haperen.com/files/PHP_Cursus_v3-2.pdf · kun je vinden in de ELO-BRONNEN-GEDEELDE DOCUMENTEN-INFORMATICA-HST 09 PHP & MYSQL. het gaat om

PHP Cursus Pagina 51

A Database aanmaken in phpMyAdmin

Binnen je eigen webapplicatie gebruik je al snel een zelf ontworpen datamodel. Dit datamodel dient omgezet te worden in een MySQL database. Dit kan erg eenvoudig met behulp van phpMyAdmin.

Voordat je je database aan gaat maken in phpMyAdmin dien je de tabellen al te hebben ontworpen, bijvoorbeeld doormiddel van een strokendiagram op papier. Je moet dit model goed overdenken, want een database met tabellen aanpassen nadat deze in gebruik is genomen is niet erg eenvoudig. In het slechtste geval dien je de hele database opnieuw te vullen.

Binnen PHP en MySQL is het erg handig om voor primaire sleutel een numeriek id te gebruiken. Deze id kan door MySQL automatisch gegenereerd worden, waardoor hij altijd uniek is. We gaan er van uit dat je datamodel numerieke primaire sleutels bevat.

De volgende strokendiagrammen gebruiken wij voor dit voorbeeld. gebruiker (gebruiker_id, naam) artikel (artikel_id, gebruiker_id, titel, inhoud, aanmaak_tijd)

Dit is dus een database met twee tabellen (gebruiker en artikel). Voordat je deze strokendiagram omzet naar een database dien je de datatypes van elk veld te bepalen. Je kan kiezen uit vele types, maar de volgende drie zijn erg handig voor normaal gebruik:

INT Een numeriek getal, kan in dit voorbeeld gebruikt worden voor de velden gebruiker_id en artikel_id.

TEXT Deze kan een tekst van onbeperkte lengte vasthouden, kan in dit voorbeeld gebruikt worden voor

de velden naam, titel en inhoud .

DATETIME Deze kan een datum en tijd vasthouden, kan in dit voorbeeld gebruikt worden voor het veld aanmaak_tijd

Voor het aanmaken van je database ga je naar het hoofdscherm phpMyAdmin, vervolgens voer je de volgende stappen uit:

• Ga naar het formulier Nieuwe database aanmaken en vul daar een naam voor je database in. Kies vervolgens Aanmaken.

• Maak nu je tabellen aan. We beginnen in dit voorbeeld met gebruiker.

– Ga naar het formulier Nieuwe tabel aanmaken in database, vul de naam van de tabel in bij Naam,

en het aantal velden onder Number of fields. Dat is in dit voorbeeld dus gebruiker en 2. – Vul onder het kopje veld de veldnamen in. In dit voorbeeld is dat gebruiker_id en

naam.

Page 52: Webapplicaties in PHP en MySQLinformatica.haperen.com/files/PHP_Cursus_v3-2.pdf · kun je vinden in de ELO-BRONNEN-GEDEELDE DOCUMENTEN-INFORMATICA-HST 09 PHP & MYSQL. het gaat om

PHP Cursus Pagina 52

– Vul het gekozen type in. In dit voorbeeld is dat INT voor het veld gebruiker_id en TEXT voor het veld naam.

– Stel in dat de primaire sleutel automatisch gemaakt wordt, door voor het veld ge- bruiker_id bij Extra de optie auto_increment te kiezen. Kies tevens het keuzerondje Primaire Sleutel (gerepresenteerd door een tabel met een sleutel).

– Alle andere instellingen zijn standaard in orde, dus kies Opslaan om je tabel aan te maken.

• Klik in het linkermenu op de database en maak de overige tabellen aan.

Noot: Er zijn vele extra eisen en instellingen die je kan toevoegen aan je database met tabellen. De meeste daarvan zijn ook zeer handig voor het verzekeren van de correctheid van de inhoud van de tabellen of voor het verhogen van de prestaties van de database. Maar met deze basisset kan je prima kleinschalige werkende webapplicaties maken. Bekijk de begeleidende documentatie op www.mysql.com voor alle mogelijkheden tijdens het aanmaken van een database binnen MySQL.

Page 53: Webapplicaties in PHP en MySQLinformatica.haperen.com/files/PHP_Cursus_v3-2.pdf · kun je vinden in de ELO-BRONNEN-GEDEELDE DOCUMENTEN-INFORMATICA-HST 09 PHP & MYSQL. het gaat om

PHP Cursus Pagina 53

B Overzicht HTML

In deze cursus wordt voor het opmaken van informatie HTML gebruikt. Daarom geven we hier een klein overzicht te vinden van erg bruikbare HTML.

Noot: Er kunnen opmaakverschillen bestaan tussen dit document en de uitkomst in je browser. De exacte opmaak is namelijk afhankelijk van de browser en de eventuele aanwezige opmaakregels.

B.1 Eenvoudige opmaak van tekst

1 <b>Dikgedrukt</b> 2 <i>Cursief</i> 3 <u>Onderstreept</u> 4 <s>Doorgehaald</s>

Dikgedrukt Cursief Onderstreept Doorgehaald

B.2 Hyperlinks

Maak een hyperlink om verschillende pagina’s aan elkaar te kunnen koppellen.

1 <a href="hyperlink">De klikbare tekst</a>

Daarbij word de tekst De klikbare tekst aanklikbaar. De opmaak van deze tekst is standaard blauw en onderstreept.

Als de hyprlink begint met http://, dan wordt er bij het klikken direct naar die hyperlink gegaan. Als de hyperlink niet met http:// begint en de huidige pagina het adres http://server/directory/bestand.php heeft, dan wordt er bij het klikken naar http://server/directory/(inhoud hyperlink) gegaan.

B.3 Alinea opmaak

<p> Geeft een nieuwe alinea (met extra witruimte). <br> Geeft nieuwe regel (aansluitend aan de huidige regel).

B.4 Opsommingen, Geordend

1 <ol> 2 <li>Eerste element</li> 3 <li>Tweede element</li> 4 <li>Derde element</li> 5 </ol>

1. Eerste element 2. Tweede element 3. Derde element

Page 54: Webapplicaties in PHP en MySQLinformatica.haperen.com/files/PHP_Cursus_v3-2.pdf · kun je vinden in de ELO-BRONNEN-GEDEELDE DOCUMENTEN-INFORMATICA-HST 09 PHP & MYSQL. het gaat om

PHP Cursus Pagina 54

1,1 1,2

2,1 2,2

B.5 Opsommingen, Niet geordend

1 <ul> 2 <li>Eerste element</li> 3 <li>Tweede element</li> 4 <li>Derde element</li> 5 </ul>

• Eerste element • Tweede element • Derde element

B.6 Tabellen

Gebruik binnen <table> verschillende <tr> tags voor de rijen. Gebruik binnen de <tr> tag ver- schillende <td> voor de individuele kolommen binnen de rij.

1 <table> 2 <tr><td>1,1</td><td>1,2</td></tr> 3 <tr><td>2,1</td><td>2,2</td></tr> 4 </table>

B.7 Structuur aanbrengen met titels

Om structuur in je webpagina aan te brengen kan je gebruik maken van verschillende titels. Dit kan door middel van de tags <h1>, <h2>, <h3>, . . . <h7>. Daarbij is <h1> de hoofdtitel (bijvoorbeeld van een hoofstuk), en <h7> de minst belangrijke titel (bijvoorbeeld van een paragraaf ). Onderstaande HTML code kan bijvoorbeeld gebruikt worden voor het omzetten van deze cursus in HTML.

1 <h1>Webapplicaties in PHP en MySQL</h1> 2 <h2>Deel IV: Appendix</h2> 3 <h3>B Overzicht HTML</h3> 4 <h4>B.7 Structuur aanbrengen met titels</h4>

B.8 Attributen, Style Sheets (CSS) en Javascript

HTML tags kunnen attributen hebben, dit zijn extra instellingen die het gedrag van de tag besturen. Alle tags hebben de attributen id, class en style. Met deze attributen kan de opmaak worden bestuurd door middel van een style sheet.

Voor het verder verfraaien en werkbaar maken van je webpagina zijn zowel CSS als Javascript veel gebruikte technieken. Het is aan te raden je in deze technieken te verdiepen als je verder wilt gaan met het maken van websites en webapplicaties.

Page 55: Webapplicaties in PHP en MySQLinformatica.haperen.com/files/PHP_Cursus_v3-2.pdf · kun je vinden in de ELO-BRONNEN-GEDEELDE DOCUMENTEN-INFORMATICA-HST 09 PHP & MYSQL. het gaat om

PHP Cursus Pagina 55

C Overzicht SQL

C.1 Informatie ophalen via SELECT

1 SELECT kolommen 2 FROM tabellen 3 WHERE voorwaarden 4 GROUP BY velden 5 HAVING groepvoorwaarden 6 ORDER BY velden volgorde;

Selecteer de aangegeven kolommen van de rijen die voldoen aan alle eisen, eventueel kan er een extra operatie worden verricht met de gegevens in de kolommen. De clausules WHERE, GROUP BY, HAVING en ORDER BY zijn niet verplicht, HAVING kan alleen gebruikt worden in combinatie met GROUP BY.

Kolommen hebben de vorm kolomnaam of tabelnaam.kolomnaam, de laatste vorm kan gebruikt worden als er verschillende kolommen met dezelfde naam zijn. Op de kolommen kunnen berekenin- gen worden toegepast. Verschillende kolommen en tabellen kunnen van elkaar gescheiden worden met komma’s. Verschillende voorwaarden kunnen worden samengevoegd door middel van AND en OR.

Binnen de groepvoorwaarden kunnen de functies AVG, COUNT, MAX, MIN en SUM worden gebruikt. Als er gegroepeerd wordt, dan kunnen deze functies ook gebruikt worden als berekening op kolommen.

De volgorde kan ASC (van laag naar hoog) en DESC (van hoog naar laag) zijn. Ook kan de volgorde worden weggelaten, dan wordt ASC gebruikt.

C.2 Informatie opslaan via INSERT

1 INSERT INTO tabelnaam (kolom_1, kolom_2, ...) 2 VALUES (waarde_1, waarde_2, ...);

Maak een nieuwe rij aan. Niet vermelde kolomen in de kolommenlijst krijgen een standaardwaarde, als deze is ingesteld. Als er geen standaardwaarde is voor een niet-vermelde kolom, dan word de query niet uitgevoerd.

C.3 Informatie wijzigen via UPDATE

1 UPDATE tabelnaam 2 SET kolom_1=waarde_1, kolom_2=waarde_2, ... 3 WHERE voorwaarden;

Page 56: Webapplicaties in PHP en MySQLinformatica.haperen.com/files/PHP_Cursus_v3-2.pdf · kun je vinden in de ELO-BRONNEN-GEDEELDE DOCUMENTEN-INFORMATICA-HST 09 PHP & MYSQL. het gaat om

PHP Cursus Pagina 56

Verander alle rijen die voldoen aan de voorwaarden in de WHERE clausule. Verander daarbij alleen de aangegeven kolommen met de aangegeven nieuwe waarden.

C.4 Informatie verwijderen via DELETE

1 DELETE FROM tabelnaam 2 WHERE voorwaarden;

Verwijder alle rijen uit de aangegeven tabel die voldoen aan de voorwaarden in de WHERE clausule. Zonder WHERE clausule wordt alle informatie in de tabel verwijderd.

Page 57: Webapplicaties in PHP en MySQLinformatica.haperen.com/files/PHP_Cursus_v3-2.pdf · kun je vinden in de ELO-BRONNEN-GEDEELDE DOCUMENTEN-INFORMATICA-HST 09 PHP & MYSQL. het gaat om

PHP Cursus Pagina 57

Page 58: Webapplicaties in PHP en MySQLinformatica.haperen.com/files/PHP_Cursus_v3-2.pdf · kun je vinden in de ELO-BRONNEN-GEDEELDE DOCUMENTEN-INFORMATICA-HST 09 PHP & MYSQL. het gaat om

PHP Cursus Pagina 58

D Overzicht PHP en Visual Basic

Dit is een klein overzicht van de standaard taalconstructies in PHP, ze worden vergeleken met dezelfde constructies binnen Visual Basic. In de linker kolom staat steeds de constructie in Visual Basic, in de rechter kolom staat de constructie in PHP.

D.1 Commentaar

1 REM commentaar 2 3 ’ Commentaar

1 // Een-regel commentaar 2 /* 3 * Meer-regel commentaar 4 */

D.2 Variabelen

1 Dim i As Integer 2 Dim txt As String 3 4 txt = "12" 5 i = 1 + Val(txt) 6 txt = Str(i)

1 /* Noot: Variabellen hebben geen 2 * vast type binnen PHP. Getallen 3 * en teksten kunnen dus door 4 * elkaar gebruikt worden. 5 */ 6 $txt = "12"; 7 $i = 1 + $txt;

D.3 Selectie

1 If 1 < getal Then 2 opdrachten 3 Else 4 opdrachten 5 End If

1 if (1 < $getal) { 2 opdrachten; 3 } 4 else { 5 opdrachten; 6 }

D.4 Repetitie

1 While conditie 2 opdrachten 3 Wend

1 while (conditie) { 2 opdrachten; 3 }

Page 59: Webapplicaties in PHP en MySQLinformatica.haperen.com/files/PHP_Cursus_v3-2.pdf · kun je vinden in de ELO-BRONNEN-GEDEELDE DOCUMENTEN-INFORMATICA-HST 09 PHP & MYSQL. het gaat om

PHP Cursus Pagina 59

D.5 Repetitie via for

1 For i = 1 To 12 2 opdrachten 3 Next i

1 for ($i = 1; $i <= 12; $i++) { 2 opdrachten; 3 }

1 For i = 12 To 1 Step -1 2 opdrachten 3 Next i

1 for ($i = 12; $i >= 1; $i--) { 2 opdrachten; 3 }

D.6 Arrays

1 Dim getallen(10) As Integer 2 Dim i As Integer 3 4 getallen(3) = 1 5 i = getallen(3) 6 7 ’ In de taal zitten niet direct 8 ’ Associatieve arrays.

1 $getallen = array(); 2 3 $getallen[3] = 1; 4 $i = $getallen[3]; 5 6 $associatief = 7 array(’sleutel’ => ’waarde’); 8 $waarde = $associatief[’sleutel’];

Page 60: Webapplicaties in PHP en MySQLinformatica.haperen.com/files/PHP_Cursus_v3-2.pdf · kun je vinden in de ELO-BRONNEN-GEDEELDE DOCUMENTEN-INFORMATICA-HST 09 PHP & MYSQL. het gaat om

PHP Cursus Pagina 60

E Extra bronnen

Als je verder wilt gaan met het maken van webapplicaties, dan zal je al snel jezelf veel moeten aanleren. Hierbij geven we enkele handige aanknopingspunten voor je zoektochten naar meer informatie.

E.1 Overzicht bronnen

httpd.apache.org Hier is alle documentatie omtrent de webserversoftware Apache te vinden.

Zoek hier dan ook rond voor het configureren van je webserver.

www.php.net Hier is erg veel documentatie en informatie te vinden over PHP. Zo is er een overzicht van alle functies en kan je zoeken op functienaam of functiebeschrijving.

www.mysql.com Hier is erg veel documentatie en informatie te vinden over MySQL en over SQL

in het algemeen.

www.handleidinghtml.nl Een website met erg veel Nederlandstalige uitleg over het gebruik van HTML en CSS. Bevat tevens een uitgebreid naslagwerk voor HTML en CSS.

www.w3schools.com Een website met erg veel informatie over erg veel onderwerpen die ge-

relateerd zijn aan webapplicaties. Bevat onder andere een vrij uitgebreid naslagwerk voor Javascript.

E.2 Bekijk online informatie met een kritische blik

Online informatie zoals documentatie, voorbeelden en tutorials voor en over webapplicaties zijn overvloedig. Maar vaak wordt deze informatie geschreven door gewone gebruikers zoals jij en ik, en deze informatie bevat dan ook vaak genoeg fouten en gebreken. Gebruik online informatie dan ook altijd verstandig. Online informatie is goed bruikbaar als naslagwerk of inspiratie, maar houd altijd een kritische blik en ga nooit domweg alles kopiëren wat je ziet.