De database MySQL

Een scripttaal als PHP biedt op zich veel toepassingsmogelijkheden, maar soms is die nog niet krachtig genoeg. Voor de meeste webtoepassingen is het noodzakelijk gegevens permanent op te slaan, zodat u die later weer te voorschijn kunt toveren. Een goed voorbeeld is het forum van Robsdomein. Het is wel zo handig dat bijdragen van bezoekers op dit forum ook daadwerkelijk bewaard blijven, anders zou een forum niet zoveel zin hebben. Gegevensopslag is dus erg belangrijk voor het bouwen van websitetoepassingen.


Waarom een database?

Er zijn verschillende manieren om gegevens te bewaren. Het ligt voor de hand ze op te slaan in tekstbestanden, maar dat heeft grote nadelen. Hoe groter een tekstbestand, hoe lager de snelheid waarmee een toepassing er de juiste gegevens uit kan halen. Vooral als uw gegevens een complexe structuur hebben, is programmeren met tekstbestanden vaak lastig. Maar deze problemen zijn goed te vermijden als u een database gebruikt. Een databasesysteem is geoptimaliseerd om gegevens snel en efficient te bewaren en weer op te vragen. Ook zijn die gegevens gemakkelijk te structureren, wat het programmeerwerk vergemakkelijkt. Het ligt dus voor de hand dat u bij het bouwen van uw webtoepassing een database gebruikt om uw gegevens te bewaren.


Voorbereiding

Wanneer u met MySQL aan de slag wilt op uw computer, dient u eerst een MySQL-server te installeren. Deze is gratis te downloaden. Het is het handigst om MySQL te draaien als een constant op de achtergrond aanwezig proces, ook wel een service (Windows) of daemon (Linux) genoemd. De MySQL-website bevat uitgebreide instructies hoe MySQL is te installeren op de verschillende platformen. Zodra u de voor u relevantie installatieprocedure heeft doorlopen, draait de MySQL-server op uw systeem.
Om het werken met uw databases wat te vergemakkelijken, kunt u vervolgens de populaire toepassing phpMyAdmin installeren. De installatie van de toepassing is erg eenvoudig. U pakt phpMyAdmin uit en past enkele gegevens aan in een configuratiebestand. De details leest u in de documentatie op de phpMyAdmin website. Na installatie start u phpMyAdmin via uw browser. U ziet onder andere een overzicht van uw databases, nuttige informatie over uw MySQL-server en de mogelijkheid om zelf databases aan te maken.


Aan de slag

Tijd om het een en ander in de praktijk te zien. Voor testdoeleinden kunnen we via phpMyAdmin een database aanmaken. De naam van deze database mag u natuurlijk zelf kiezen. Voor het voorbeeld gebruiken we een adressenboek, dus ligt het voor de hand om de database dan simpelweg 'adressenboek' te noemen. In principe hebt u nu de eerder genoemde zogenaamde kast aangemaakt, waarin u alleen nog laden moet aanbrengen om er gegevens in te stoppen. Zodra u de database hebt aangemaakt, ziet u de naam van de database in het linkerframe van phpMyAdmin verschijnen en een aantal opties in het rechterframe. Eén van deze opties is SQL. Als u deze optie kiest, verschijnt een tekstveld en kunt u SQL-commando's invoeren om uw zojuist aangemaakte database te benaderen en manipuleren.


Tabellen aanmaken

Hieronder ziet u de SQL-code om een tabel aan te maken waarin u adressen kunt opslaan. Misschien herkent u al elementen in deze code. Laten we eens stukje voor stukje bekijken om te zien hoe de syntax in elkaar steekt.

CREATE TABLE adressen (
  adres_id INT AUTO_INCREMENT PRIMARY KEY,
  voornaam VARCHAR(255),
  achternaam VARCHAR(255),
  geboortedatum DATE,
  adres VARCHAR(255),
  postcode VARCHAR(6),
  woonplaats VARCHAR(255)
);


Ten eerste ziet u daar het commando CREATE TABLE, gevolgd door de naam die de tabel moet krijgen, in ons geval 'adressen'. De definitie van de tabelstructuur volgt tussen het ronde haakje na de tabelnaam en het afsluitende ronde haakje op de laatste regel. Alles daartussen heeft betrekking op de tabel die we met CREATE TABLE maken. Dit hele blok definieert de velden die in de tabel moeten komen.
Afhankelijk van wat voor gegevens we willen opslaan, kennen we elk veld een type toe. We zien voor het veld 'adres_id' het type INT, de afkorting van integer (getal). Verder zien we nog een aantal velden met het type VARCHAR, dat gebruikt wordt voor velden waarin strings moeten komen. Bij een VARCHAR-veld is het noodzakelijk om de maximale lengte van de gegevens aan te duiden. Voorbeeld: in een veld met type VARCHAR(6) kunnen string worden opgeslagen met een maximale lengte van zes tekens. Verder is er nog een veld met het type DATE om de geboortedatum van een persoon op te slaan, zodat we bijvoorbeeld de leeftijd van een persoon kunnen berekenen. Wanneer u dit veld geen datumtype zou geven, zou u niet zo gemakkelijk een berekening kunnen uitvoeren op die datum. Dit is een van de redenen waarom veldtypes essentieel zijn. U ziet nog meer syntax bij het veld 'adres_id'. Waar die voor dient ziet u later in op deze pagina. In ieder geval heeft u nu al wat laden aangebracht in uw kast.


Gegevens toevoegen

Een database heeft weinig nut als daar geen gegevens in staan, zoals een kast weinig nut heeft als daar nooit wat in zit. Hieronder is te zien hoe u twee adressen in de eerder aangemaakte adressentabel zet.

INSERT INTO adressen
  (voornaam, achternaam, geboortedatum, adres, postcode, woonplaats)
VALUES
  ('jan', 'bakker', '1970-04-12', 'klompstraat 3', '8493AB', 'Bakkerdorp');
INSERT INTO adressen
  (voornaam, achternaam, geboortedatum, adres, postcode, woonplaats)
VALUES
  ('marije', 'odile', '1980-06-20', 'slagersstraat 14', '2930BP', 'Slagerstad');
);


In databaseterminologie wordt één adres in deze context een record genoemd. Een record is dus eigenlijk een groepje gegevens die bij elkaar horen.
Tijd om nog meer SQL-commando's te leren kennen. Om iets in een tabel te zetten gebruikt u INSERT INTO gevolgd door de naam van de tabel. Vervolgens laat u de database weten in welke velden u gegevens wilt plaatsen. Die velden specificeert u tussen haakjes en gescheiden door komma's. Na deze opsomming schrijft u VALUES, gevolgd door de bijbehorende gegevens. Om elke waarde worden aanhalingstekens geplaatst. Dit is noodzakelijk, tenzij het om getallen gaat - in dat geval laat u de aanhalingstekens gewoon weg. Let wel: de volgorde van de waarden moet precies overeenkomen met de volgorde van de velden in de veldenlijst. Na weer een afsluitend haakje volgt een puntkomma. Een puntkomma betekent het einde van een SQL-commando, ook wel een query genoemd. In databasejargon zeggen we dus: In bovenstaande listing worden twee records toegevoegd met twee queries. Het is u misschien opgevallen dat het veld 'adres_id' compleet buiten beschouwing is gelaten in deze twee queries. Dat heeft een reden. Het veld 'adres_id' was namelijk gedefinieerd als AUTO_INCREMENT. Hierdoor krijgt dit veld een oplopende waarde als u nieuwe records toevoegt. U zult later in deze tekst zien dat dat ook inderdaad is gebeurd. Ook hebben we dit veld de aanduiding PRIMARY KEY meegegeven. Hiermee vertelt u MySQL dat geen twee records uit de database dezelfde waarde voor dit veld mogen hebben. Met andere woorden: aan de hand van het veld 'adres_id' is elk record eenduidig te identificeren.


Gegevens selecteren

U bent inmiddels vast nieuwsgierig geworden hoe u de gegevens in de database weer kunt opvragen. Dit is vrij eenvoudig, zoals u kunt zien hieronder.

SELECT adres_id, voornaam, achternaam, geboortedatum, adres, postcode, woonplaats FROM adressen;

SQL-code lijkt soms verdacht veel op menselijke taal. Als we de Engelse commando's naar het Nederlands vertalen zegt deze query niets anders dan: selecteer adres_id, voornaam, achternaam, geboortedatum, adres, postcode, woonplaats van adressen. Deze query volstaat om alle adressen die u eerder in de database heeft gezet ogenblikkelijk weer te voorschijn te toveren. Nu is ook te zien dat het veld 'adres_id' een oplopende waarde heeft gekregen. In dit geval is dat 1 en 2. De records worden dus volledig automatisch genummerd. Maar wat als u alleen het tweede adres in de database wilt hebben? Dat is te zien in onderstaande listing.

SELECT adres_id, voornaam, achternaam FROM adressen WHERE adres_id = 2;

Achter het woord WHERE kunt u een voorwaarde opgeven waaran de gewenste record moet voldoen. In dit geval moet het veld 'adres_id' de waarde 2 bevatten. Omdat 2 een nummer is, hoeft u er geen aanhalingstekens omheen te zetten.
Wanneer u alleen de records wilt zien waarbij de achternaam 'bakker' is, schrijft u WHERE achternaam='bakker'. De mogelijkheid van SELECT-queries zijn behoorlijk uitgebreid. Stel dat u alle records wilt zien, maar dan alfabetisch gesorteerd op achternaam. Hieronder wordt een voorbeeld getoond van zo'n situatie.

SELECT adres_id, voornaam, achternaam FROM adressen ORDER BY achternaam ASC;

Zoals u ziet wordt 'ORDER BY achternaam ASC' toegevoegd aan de normale selectie. 'ORDER BY achternaam' betekent simpelweg dat we willen sorteren op achternaam. De afkorting ASC (ascending) zorgt ervoor dat de records oplopend gesorteerd worden. Zou u het liever andersom willen hebben, dan kunt u in plaats van ASC de afkorting DESC gebruiken (descending).


De link met PHP

Allemaal mooi en aardig, maar hoe krijgt u die databasegegevens met PHP naar boven? U hebt op de pagina 'De scripttaal PHP' al behoorlijk wat PHP kunnen leren. Misschien dat u met die kennnis al ongeveer begrijpt wat er gebeurt in de listing hieronder.

<?php
mysql_connect('localhost', 'gebruikersnaam', 'wachtwoord');
mysql_select_db('adressenboek');

$resultaat = mysql_query("SELECT voornaam, achternaam FROM adressen WHERE adres_id = 2");

$record = mysql_fetch_assoc($resultaat);
echo("{$record['voornaam']} {$record['achternaam']}");
?>


U maakt eerst een verbinding met de MySQL-server met behulp van mysql_connect(). Aan deze functie geeft u drie argumenten mee: hostnaam, gebruikersnaam en wachtwoord. In de meeste gevallen zal de hostnaam 'localhost' zijn, omdat de webserver met PHP en MySQL op dezelfde server draaien. Met de opgegeven gebruikersnaam en wachtwoord logt u in op uw MySQL-server. Vervolgens geeft u met de functie mysql_select_db() de database 'adressenboek'. U heeft dan verbinding met de databases totdat het script eindigt.
Nu kunt u queries uitvoeren op de database. Dit kan met mysql_query(). Deze functie onvangt als argument een query zoals u die eerder in de voorbeelden heeft gezien. We kennen het resultaat van deze querie toe aan de variabele 'resultaat'. De variabele 'resultaat' wordt wel een 'resource id' genoemd. Deze resource id verwijst naar de gegevens die u wilt hebben. Wanneer we de functie mysql_fetch_assoc() gebruiken met als argument deze resource id, kunnen we de databasegegevens opvangen in een associatieve array. Zoals u zich misschien nog herinnert van 'De scripttaal PHP' is een associatieve array eigenlijk een array waarbij de sleutels woorden zijn, in plaats van nummers. Deze associatieve array wordt hier 'record' genoemd. De sleutels in de array zullen bestaan uit de veldnamen die u hebt geselecteerd. U kunt zien dat met echo() simpelweg wordt gerefereerd aan die veldnamen in de array. Het script zal dus ook keurig de voornaam en achternaam van het record met adres_id 2 op het scherm zetten. Zo gemakkelijk werkt PHP met MySQL.


Websites

MySQL
phpMyAdmin
PHP / MySQL referentie
W3Schools SQL Tutorial
Devshed MySQL Forums


Met dank aan computertotaal!