http://users.telenet.be/tidump/files/Cursus_feneX.pdf

Database (php en mySQL)

Wat is het verschil tussen front en backend van een website?

BackendTotal.mp4 from icaros on Vimeo.

Algemene informatie over PHP

PHP is een open-source, server-side scripttaal. Dit houdt in dat de code wordt uitgevoerd op de server. Op het moment dat een bezoeker een webpagina opvraagt, genereert PHP zogenaamde “output” die wordt teruggestuurd naar de gebruiker. Omdat PHP niet op de computer van de bezoeker wordt uitgevoerd (in tegenstelling tot bijvoorbeeld html, css of javascript) maar op de server, moet de server geschikt zijn voor PHP. Wanneer je een domeinnaam met hosting aanschaft, zit hier vaak (maar niet altijd!) PHP ondersteuning bij, je hoeft dan zelf niets te doen om de PHP te kunnen laten “draaien”. Mocht je willen experimenteren met PHP op je eigen computer, dan kun je er voor kiezen om een webserver te installeren. Wij hebben gekozen voor een portabel versie van uWamp. Je kan deze downloaden onder https://www.uwamp.com/en/. Doordat je via PHP databases kunt benaderen, kun je met PHP webapplicaties ontwikkelen. Een voorbeeld van een webapplicatie is bijvoorbeeld een gastenboek, een nieuwssysteem, een CMS (Content Management System, waarmee je een website kunt bijwerken) of een adresboek.

Voorbeeld van een html pagina opvragen

Voorbeeld van een PHP pagina opvragen

Om PHP applicaties te kunnen ‘draaien’ moet je rekening houden met de volgende factoren:
  • Webserver met PHP ondersteuning. Wanneer je normaalgesproken een HTML pagina schrijft, kun je deze lokaal, op je computer bekijken. Voor webpagina’s met daarin PHP is een webserver vereist die PHP kan “lezen” en op basis daarvan uitvoer genereert.
  • Pagina’s met PHP moeten eindigen op ‘.php’. Heb je een webpagina met daarin PHP code staan, dan dient de extensie van deze webpagina niet ‘.html’ maar ‘.php’ te zijn. Doe je dit niet, dan heeft de webserver niet door dat er PHP in je pagina zit en wordt deze PHP code dus niet uitgevoerd.
  • (MySQL) Database. Mocht je een gastenboek of iets dergelijks willen bouwen, dan heb je ook een database nodig waar je met behulp van PHP gegevens in kan opslaan.
  • Client side is alles wat gebeurt aan de kant van de bezoeker van je website. Javascript of HTML is een voorbeeld van een ‘client side’ taal.
  • Server side is alles wat gebeurt aan de kant van waar je website staat. PHP is serverside. Het genereert uitvoer wat weer kan worden getoond aan de ‘client-side’.

MySQL is de meest populaire database-systeem in combinatie met PHP.

Wat is MySQL?

  • MySQL is een database systeem dat wordt gebruikt op het web
  • MySQL is een database systeem dat draait op een server
  • MySQL is ideaal voor zowel kleine als grote applicaties
  • MySQL is zeer snel, betrouwbaar en gemakkelijk te gebruiken
  • MySQL maakt gebruik van standaard SQL
  • MySQL stelt een aantal platforms
  • MySQL is gratis te downloaden en te gebruiken
  • MySQL wordt ontwikkeld, gedistribueerd en ondersteund door Oracle Corporation
  • MySQL is vernoemd naar de dochter van medeoprichter Monty Widenius's: My
De gegevens in een MySQL-database worden opgeslagen in tabellen. Een tabel is een verzameling van gerelateerde gegevens, en bestaat uit kolommen en rijen. Databases zijn bruikbaar voor het opslaan van informatie categorisch. Een bedrijf kan een database met de volgende tabellen:
  • werknemers
  • producten
  • Klanten
  • bestellingen

Inleiding

MySQL is misschien wel de snelste, goedkoopste, eenvoudigste en meest betrouwbare database, die ook nog eens de meeste faciliteiten heeft en verkrijgbaar is voor zowel unix, windows, linux, enzovoorts. Wat is een database eigenlijk? Een database is een afzonderlijke toepassing die een verzameling gegevens opslaat. Elke database heeft één of meer verschillende mogelijkheden voor het maken, benaderen, beheren en doorzoeken van de gegevens die er in zitten. Andere vormen van gegevensopslag kunnen ook worden gebruikt, maar als het op opslag van (rich-)tekst aankomt, wordt het gebruik van een database sterk aangeraden. Databases en PHP vormen een onafscheidelijk duo. Een van de grote voordelen van PHP is dan ook de gemakkelijke databaseconnectiviteit die het biedt. In les 5 wordt aandacht besteed aan het werken met een database vanuit eigen ontwikkelde PHP code. In de les van vandaag wordt op een andere manier gewerkt met een database, namelijk met het pakket PHPMyAdmin.

Werken met PHPMyAdmin

PHPMyAdmin openen

Tijdens les 4 wordt er vanuit gegaan dat je werkt met de XAMPP webserver. Om PHPMyAdmin te benaderen, moet je er voor zorgen dat zowel Apache als MySQL is gestart: xampp-controlWanneer alles “groen” is, ga je met FireFox naar http://localhost/phpmyadmin. Mogelijk kom je het volgende scherm tegen. Vul daarin je gebruikersnaam en wachtwoord is (bij standaard XAMPP installaties is de gebruikersnaam ‘root’ en het wachtwoord leeg: PHPMyAdmin-loginWanneer je succesvol weet in te loggen, of als je bovenstaand scherm niet tegenkomt, kom je in het “overzichtsscherm” van PHPMyAdmin terecht: PHPMyAdmin-overviewAan de linkerkant van het scherm zie je het overzicht van databases dat op dit moment beschikbaar is.

Een database aanmaken en openen

Voor deze cursus is het de bedoeling dat je een nieuwe database aanmaakt waarin je gaat experimenteren met MySQL. De naam die je aan deze database geeft is “phpcursus”. Je maakt een database aan door op “databases” boven in het scherm te klikken en het volgende in te vullen en op “create” te klikken: PHPMyAdmin-create-databaseWanneer de database aangemaakt is, zie je hem links in het overzichtsscherm van PHPMyAdmin verschijnen. Je kunt de inhoud van de database bekijken door er op te klikken.

Een tabel aanmaken in een geopende database

Wanneer je een lege database opent krijg je direct de mogelijkheid om een tabel aan te maken in de database. Hierbij moet je een naam voor de tabel verzinnen en moet je aangeven wat het aantal kolommen van de tabel is. Voor deze cursus maak je een tabel aan met als naam “guestbook” en het aantal kolommen zal 6 bedragen. Hier over zo dadelijk meer. Als je er klaar voor bent klik je op “Go”: PHPMyAdmin-create-tableVan mensen die een bericht in ons gastenboek gaan plaatsen, willen we een aantal zaken weten. Deze worden hieronder besproken, maar eerst een screenshot van wat je moet invullen bij het aanmaken van de tabel “guestbook”:
  1. PHPMyAdmin-create-table-columnsDe id van het bericht: om berichten later te kunnen verwijderen of te kunnen wijzigen, is het belangrijk dat je het bericht kunt benaderen aan de hand van een uniek nummer. We nemen een kolom “id” op in de tabel waar we met behulp van “auto increment” (A_I) er voor zorgen dat elk nieuw aangemaakt bericht automatisch een identificatienummer toebedeeld krijgt. De kolom “id” zal dus een nummer bevatten. Dat geven we aan door bij “type” te kiezen voor “int”. “int” staat voor integer. Door een lengte van 5 aan te geven, zorgen we er voor dat er maximaal 99.999 berichten in het gastenboek kunnen worden geplaatst.
  2. De name van de afzender: we willen graag weten wie de afzender is van het bericht. Vandaar dat we een kolom “name” aanmaken. Aangezien een naam meestal uit tekst bestaat, kiezen we als type voor “varchar”.  Hiermee geef je aan dat de naam van de afzender zowel letters als cijfers mag bevatten. De maximum lengte van de naam beperken we tot 40 tekens.
  3. De email van de afzender: om de afzender te kunnen bereiken, is het handig dat de afzender een e-mailadres kan achterlaten.
  4. De eventuele website van de afzender.
  5. De postdate van het bericht is de datum+tijd waarop het bericht is ingevuld. Deze kolom zal een unix timestamp bevatten van wanneer het bericht is ingevuld door de afzender van het bericht. Omdat de unix timestamp een cijfer vertegenwoordigd, kiezen wel als type wederom voor INT.
  6. De message kolom bevat het daadwerkelijke bericht dat de afzender in het gastenboek wil plaatsen. Het bericht kan zowel cijfers als letters bevatten, maar we kiezen deze keer niet voor varchar als type. Dat heeft er mee maken dat een kolom die van het type varchar is, niet meer dan 256 karakters mag bevatten. Als je een kolom als type “text” meegeeft, kan er véél meer tekst in de kolom (tot 16.700.000 tekens).
Voor deze cursus wordt er geen aandacht besteed aan de “storage engine” die wordt gebruikt voor het opslaan van gegevens in de tabel. Als deze op “InnoDB” of “MyISAM” staat is dat prima. Als je klaar bent met het definieren van de kolommen, klik je op “save”. Als alles goed gaat, krijg je kort de melding “table ‘guestbook’ has been created”. De pagina wordt ververst, en je ziet de tabel verschijnen in het overzicht van tabellen voor de database “phpcursus”.

PHPMyAdmin-database-overviewEen rij (of record) toevoegen in een tabel

Aangezien we nog niet zelf een gastenboek hebben gebouwd waarmee we berichten kunnen toevoegen en verwijderen, moeten we ons op dit moment redden met PHPMyAdmin. In het overzicht van tabellen vind je achter elke tabel een aantal knopjes: PHPMyAdmin-table-toolsMet behulp van de knop “insert” is het mogelijk om data in de tabel op te slaan. Wanneer je hier op klikt krijg je het volgende scherm met mogelijkheden te zien: PHPMyAdmin-table-insertIn de kolom “value” kun je voor elke tabelkolom een betreffende waarde invullen. In de kolom “function” kun je voor de betreffende tabelkolom een functie laten uitvoeren. Hier doen we tijdens de basiscursus niets mee. Aangezien we bij het aanmaken van de tabel hebben aangegeven dat het id automatisch moet worden ingevuld, laten we de “value” hiervoor leeg. De andere “values” vul je met je naam, e-mailadres, website, postdate (doe voor de lol 1234567890) en een bericht. Als je klaar bent klik je op “Go”. Als alles goed gaat zie je kort de melding “1 row inserted” verschijnen.

De inhoud (= rijen of records) van een tabel bekijken

Aangezien je nu een of meer berichten hebt toegevoegd met de hiervoor beschreven methode, kun je nu op de knop “browse” achter je gastenboek klikken om de inhoud van de tabel te bekijken: PHPMyAdmin-table-browseHet mooie van PHPMyAdmin is dat je, nadat je een betreffende knop hebt aangeklikt, vaak ziet welke vraag of instructie (officieel heet dit query) hiermee naar de database wordt gestuurd. Blijkbaar wordt met de query “SELECT * FROM guestbook LIMIT 0,30” de instructie gestuurd om de eerste 30 berichten uit het gastenboek te tonen. Over queries volgt dadelijk meer uitleg. Zoals je ziet krijg je een overzicht van berichten te zien en kan je berichten wijzigen, kopiëren of verwijderen met behulp van PHPMyAdmin.

Structured Query Language in MySQL

Om met een MySQL database te kunnen communiceren, gebruik je SQL. SQL is een min of meer universele taal waarmee je “vragen aan databases” kunt stellen. Wanneer je via SQL met MySQL databases kunt werken, kun je meestal ook al snel uit de voeten met SQL in Microsoft of Oracle databases. Er zijn een aantal taken (statements) die je na deze cursus met behulp van SQL in een database moet kunnen uitvoeren: SELECT, INSERT, UPDATE en DELETE. Deze worden hieronder een voor een uitgelegd. Vooral bij UPDATE en DELETE moet je oppassen. Als je bij deze statements niet goed specificeert (met behulp van WHERE) voor welke records in de tabel de query moet worden uitgevoerd, heb je kans dat àlle data in je tabel wordt beïnvloed of zelfs verwijderd.

In de vorige les heb je geleerd hoe je artikels uit een MySQL-databank kan weergeven in een webpagina. De PHP-code op de server zet de rijen uit de tabel om in stukjes HTML-code. In deze les leg ik uit hoe je gegevens kan filteren uit de tabel. D.w.z. je wil net alles tonen, maar slechts bepaalde artikels die voldoen aan jouw zoekopdracht.

SELECT statement: vraag gegevens op

Database Queries

Een query is een vraag of een verzoek. We kunnen een database voor specifieke informatie opvragen en hebben een record set geretourneerd. Kijk naar de volgende vraag (met behulp van standaard SQL):
SELECT LastName FROM Employees
De bovenstaande zoekopdracht selecteert alle gegevens in de kolom "achternaam" in de "werknemers" table.

Oefening 1

Surf naar https://www.sqlteaching.com/#!select_columns en maak de oefeningen om de juiste data uit te filteren.

Oefening 2

Importeer volgende database 'dofactory-sample-database en maak volgende filter opdrachten na: https://www.dofactory.com/sql/select.

We starten met de code van de vorige les.

Het is heel normaal dat de PHP-code alle artikels omzet in HTML. We vragen immers om alle artikels uit de tabel "articles" op te halen:
select * from articles
* betekent letterlijk "alles".

SQL om databankrecords te filteren

We willen nu echter gaan filteren op de resultaten. Stel dat ik enkel de artikels wil waarbij het woord "sint" in de titel voorkomt:
select * from articles where title like '%sint%'
We schrijven dus niet "title like sint", maar title like '%sint%'. De beide weglatingstekens maken duidelijk dat het hier gaat om een "woord", iets wat we in de programmeerwereld bestempelen als een "string" (nee, niet in die andere betekenis) of "tekenreeks". Stel dat het veld title getallen zou bevatten (INT, integer of geheel getal) dan zou je die weglatingstekens niet schrijven.Het woord sint staat niet enkel tussen twee weglatingstekens, maar ook tussen twee %-tekens. Die duiden aan dat er voor en achter het woord sint al andere tekens mogen staan. Indien je artikels zou willen zoeken waarvan de titels beginnen met "sint", dan zou je het volgende doen:
select * from articles where title like 'sint%'
Als je titels zou willen zoeken die perfect overeenkomen met het woord sint, dan zou je het volgende schrijven:
select * from articles where title = 'sint'
De query of zoekopdracht rechtstreeks in de SQL schrijven, is enkel zinvol als je in je pagina enkel bepaalde records wil weergeven. Je zou bijvoorbeeld in de databank een kolom kunnen aanmaken met de veldnaam "rubriek". Als je dan zou zoeken op een bepaalde rubriek, dan zou je enkel die artikels krijgen waarvan de veldnaam "rubriek" gelijk is aan een bepaalde naam.
select * from articles where rubriek = 'sport'
Het is ook mogelijk om te filteren op meerdere kolommen.
select * from articles where title like '%sint%' or content like '%sint%'
Tot slot (maar daarmee is lang nog niet alles gezegd over SQL) kan je in meerdere velden zoeken op meerdere variabelen:
select * from adressen where postcode=3300 and naam like '%janssens%'
Het gebruik van een databank en PHP voor het automatiseren van webinhouden, wordt pas echt zinvol als je op een gebruiksvriendelijke manier inhouden kan toevoegen aan de databank. Uiteraard kan je dit via PHPMyAdmin, de databankbeheersoftware (geschreven in PHP) die op de meeste hostingpakketten standaard al aanwezig is. Maar in PHPMyAdmin laat je de eindgebruiker best geen inhouden toevoegen. In deze les maken we een HTML-formulier waarin de eindgebruiker de benodigde informatie kan invoeren. Het formulier bevat een "verzend"knop. Wanneer de gebruiker daarop klikt, stuurt hij/zij de inhoud van het formulier naar een PHP-bestand op de server. Dat bestand zal de verzonden informatie uitlezen en invoegen in de juiste kolommen in de tabel (articles) in de databank.

Ingrediënten

1. Een HTML-formulier 2. Een PHP-bestand dat de verzonden informatie bewaart.

Een invoerformulier in HTML

Een vrij volledige handleiding voor het bouwen van formulieren vind je via deze link:  https://www.w3schools.com/html/html_forms.asp We zorgen ervoor dat het HTML-formulier de structuur van de databanktabel volgt. Zo ziet onze tabel eruit in PHPMyAdmin: We starten vanuit het HTML-sjabloon dat je via een link in de menubalk vindt. Daaraan voegen we een FORMULIER toe.

Namen geven aan invoervelden

Met een -element maken we een invoerveld in onze webpagina. Elke "input" krijgt ook een "name"-attribuut. We nemen hiervoor telkens de "kolomnaam" van de tabel in de databank. In de tabel "articles" in onze databank vinden we bijvoorbeeld de kolommen "title", "articledate" en "cover"... We gebruiken exact dezelfde benamingen voor de invoervelden van ons formulier.

Types geven aan invoervelden

Je kan aan een -element ook een type-attribuut geven. Standaard is het type "text" als je tenminste tekst als invoer verwacht. Het type "date" tovert een datumselectorvenster tevoorschijn als je in het datumveld klikt (in de browser).

Veel tekst = textarea

De kolom "content" in onze databanktabel verwacht veel tekst. Een klein invoerveld maakt invoer van tekst moeilijk. Daarom kiezen we in dit geval voor een

Stap 2: Gegevens ophalen via een link $_GET["id"

Stap 3: Gegevens van je kolom weergeven binnen je HTML structuren

Stap 4: Sluit de database op het einde!

Uiteraard is een SQL-query pas echt zinvol als de eindgebruiker specifieke zoekopdrachten naar de server kan versturen.

Website-informatie opvragen met GET

Als een websitebezoeker (een "client") via zijn browser (de clientbrowser of useragent) een pagina opvraagt, dan vraagt hij/zij de server in feite om een HTML-pagina op te sturen die bepaalde informatie bevat. De server stuurt vervolgens de webpagina terug (niet via de postbode). We spreken in dit geval van een GET-request. De gebruiker of client wil INFORMATIE "KRIJGEN" (to get). Het adres dat je in de adresbalk van je browser invoert is dan de GET-REQUEST.
Je kan echter via de adresbalk nog extra informatie of zoekopdrachten mee verzenden. Dit doe je op de volgende manier: ADRES VAN DE WEBPAGINA ?   ZOEKNAAM = ZOEKOPDRACHT
Bijvoorbeeldwww.schoolvoorbeeld.be/websites/studenten/student/zoek.php?q=sint
Om ervoor te zorgen dat onze PHP-pagina die verzonden waarde ook kan ontvangen, moeten we de PHP-code van zoek.php enigszins aanpassen:
$q = $_GET["q"];
$sql = "select * from articles where title like '%$q%'"; 
Wat merk je in bovenstaande regels code? 1. We versturen een zoekterm met de benaming "q" naar de server. 2. We sturen eveneens een waarde mee voor die zoekterm: q=sint 3. In de PHP-pagina op de server kunnen we die verzonden waarde opvragen met $_GET["q"] 4. Die "ontvangen waarde" stoppen we in een PHP-variabele (een soort tijdelijk doosje) met de naam $q. 5. Samengevat zien stap 3 en 4 er zo uit: $q = $_GET["q"]; 6. Vervolgens passen we onze SQL-opdracht aan, zoals je hier boven kan zien.

Een "Google"versie voor dummies

Uiteraard kan je aan de bezoekers van je website moeilijk zeggen:
"Als je achter het adres in de adresbalk een ? tikt met daarachter "q=" en daar achter je zoekterm, dan kan je zoeken op deze site."
De gebruiker kan de zoekterm invoeren in een "zoekveld". Hij/zij klikt op een knop met het opschrift "zoek" en krijgt meteen het resultaat terug in HTML-code.

Een formulier met zoekveld bouwen

Voeg onder de volgende code toe:
<form>
       <input type="text" name="q"/>
       <button>ZOEK</button> 
</form>
Dat is (dat besef ik) een heel rudimentair formulier, maar het doet perfect wat het moet doen.Eén punt is heel erg belangrijk. Het invoerveld moet een attribuut "name" krijgen. De waarde van dat attribuut moet dezelfde zijn als de te ontvangen waarde op de server. Klinkt dit als Chinees? Wel, op de server ontvang je een variabele met de naam "q" ($_GET["q"]). We moeten zorgen dat het formulierveld hier dus ook name="q" krijgt. Als je een zoekterm invoert en op "zoek" klikt, krijg je meteen ook het gewenste resultaat. Je zal de verzonden query ook zien verschijnen in de adresbalk:
Deze lessen zijn voor SEM 2 http://www.schoolvoorbeeld.be/78/Beveiliging%20en%20login