Les 5: MySQL en PHP

Disclaimer: De focus van deze en andere lessen binnen de cursus PHP Basis ligt niet op beveiliging, maar op het verkennen van de mogelijkheden van PHP. Code die in les 5 en 6 wordt geschreven is niet geschikt voor professioneel gebruik. Gebruik op eigen risico!

Startbestanden voor les 5

Voor les 5 ontvang je een zip met startbestanden zodat we ons direct op het PHP gedeelte kunnen richten en niet eerst hoeven na te denken over de interface.

Mappenstructuur

De mappenstructuur ziet er als volgt uit:

  • /guestbook
    • /assets
      • /css
        • style.css
      • /gfx
      • /php
        • config.php
    • index.php
    • process.php

Zoals je ziet bestaat de “root” van onze gastenboekapplicatie uit een mapje “assets” en uit twee php bestanden genaamd “index.php” en “process.php”. Index.php zal de landingpagina van ons gastenboek zijn waarop de berichten kunnen worden bekeken en waar vanaf een nieuw gastenboekbericht kan worden toegevoegd. process.php verwerkt diverse taken: aanmaken nieuw gastenboekbericht, verwijderen gastenboekbericht, enzovoorts.

Het mapje “assets” bevat benodigde bestanden voor ons gastenboek. De benodigde bestanden worden onderverdeeld in de mapjes “css”, “gfx” (voor afbeeldingen die onderdeel van de interface zijn, bijvoorbeeld een logo) en “php”.

Configuratie-instellingen

De configuratie-instellingen plaatsen we in config.php en zien er als volgt uit:

define('DBSERVER',"localhost"); // de databaseserver
define('DBUSER',"XYZ"); // de gebruikersnaam waarmee we inloggen op de database
define('DBPASS',"123"); // het wachtwoord waarmee we inloggen op de database
define('DBASE',"phpcursus"); // de database waar onze tabellen in staan

De configuratie-instellingen slaan we op in zogenaamde “constanten”. Constanten zijn een soort variabelen die overal in de code kunnen worden aangeroepen (dus ook binnen functies). Technisch gesproken is de scope van constanten global. Hoe je een constante verderop in je code aanroept, komt verderop in deze les aan de orde. De syntax voor het definiëren van een constante is in ieder geval:

define('LABEL','value'); // the label should, by convention, be uppercase. value can be a string, integer or boolean.

Zoals je ziet gebruik je de php functie define() voor het aanmaken van constanten. Het label (zeg maar de variabelenaam) dien je in hoofdletters te schrijven. De waarde kan een string, integer of boolean zijn.

Vanuit PHP verbinding leggen met de database

In elk bestand waar je verbinding nodig hebt met de database, moet verbinding worden gelegd met de databaseserver en moet de database worden geselecteerd. In index.php doen we dat op de volgende manier. Helemaal aan het begin van index.php plaatsen we de volgende code:

// include configuration parameters
require_once('assets/php/config.php');
$connection = mysqli_connect(DBSERVER,DBUSER,DBPASS,DBASE);
if(!$connection){
	die('Verbinding met de database is mislukt.');
}

Omdat we de configuratieinstellingen van ons gastenboek hebben opgeslagen, moet deze worden ingeladen voordat we ze nodig hebben.

Met de mysqli_connect() functie leg je verbinding met de databaseserver, log je in en wordt er geprobeerd de database te selecteren waar onze gegevens in staan. Als dit mislukt op een of andere manier, geeft mysqli_connect() false terug. Daarom controleren we na de poging tot verbinden of $connection false is (of: niet true). Is dit het geval, dan leggen we de boel direct plat met de php functie die(). Zodra deze functie wordt gedetecteerd, wordt het uitvoeren van alle overige code gestopt. De string die je aan die() meegeeft wordt als foutmelding getoond.

Een query voorbereiden en naar de database sturen

In de vorige les heb je geoefend met het uitvoeren van SQL queries in PHPMyAdmin. Nu we een echte php applicatie aan het bouwen zijn, moet je de querie op een of andere manier naar de database toesturen (uiteraard nadat er succesvol verbinding is gelegd met de database). Bekijk de volgende code:

$query = "SELECT * FROM guestbook ORDER BY postdate DESC";

$result = mysqli_query($connection, $query);

Als eerste maken we een variabele $query aan die de daadwerkelijke SQL bevat die we op de server willen afvuren. De query bevat een vraag om alle gegevens van alle gastenboekberichtjes op te halen, aflopend gesorteerd op datum van toevoegen. Hiermee worden de berichtjes opgehaald van nieuw naar oud en zien mensen straks bovenaan de pagina de nieuwste berichtjes eerst.

Met mysqli_query() stuur je de $query vervolgens via de $connection (verbinding) naar de database. Het antwoord dat de database teruggeeft, wordt gevangen in $result. $result is nu een zogenaamd “mysqli result object” en bevat allerlei informatie. Deze kun je met diverse php functies uitlezen. Bovenaan de lijst met berichtjes willen we in een kop-2 tonen (h2) hoeveel berichten er in het gastenboek staan. Zodra je ergens in de kop <?php echo mysqli_num_rows($result); ?>  plaatst, worden op die positie het aantal rijen getoond (= het aantal opgehaalde berichten) die zich in $result bevinden. Voorbeeld: “Er staan 28 berichten in het gastenboek”.

11 thoughts on “Les 5: MySQL en PHP

    1. Beste Daan,

      In verband met de flexibele invulling van les 6 is het lastig een eenduidige inhoud te schreven. Ik ga er echter binnenkort tòch mee aan de slag!

  1. Beste heer van der Veen,

    Zou u me heel toevallig kunnen verklappen hoe je een afbeelding upload in een php pagina?

    Ik hoop op een spoedige reactie, en alvast hartelijk dank.

    Met vriendelijke groet,

    Sybren Brouwer

      1. Dank voor uw spoedige reactie. Dit script heb ik al in mijn site verwerkt, en werkt inderdaad prima. Het is alleen zo dat ik bezig ben met een kleine datingsite, en ik wil graag dat men een profielfoto kan instellen in hun pagina. Heeft u enig idee hoe ik dit kan realiseren?

        1. Beste Sybren,

          Uiteraard heb ik wel een idee hoe dit gerealiseerd kan worden, maar daarvoor is deze website niet bedoeld. Ik raad u aan te blijven experimenteren en opgedane kennis combineren. Succes!

  2. In PHP 7 verdwijnt MYSQL Ik heb ergens gelezen dat PDO een goede vervanger is, maar dat werkt dan net weer anders.
    Hoe kijken jullie daar tegen aan?

    1. Beste Frits,
      Als het om basisvaardigheden bij het werken met (msyql-)databaseverbindingen gaat, raad ik het gebruik van mysqli aan als vervanger voor mysql. Voor de duidelijkheid: MySQL verdwijnt niet, maar de “library” waarmee je verbinding maakt, genaamd mysql, verdwijnt wel. Een goede vervanger is dus de library mysqli. Hier vind je meer info over het gebruik van mysqli en kom je er achter dat het gebruik van mysqli ontzettend op het gebruik van mysql lijkt: http://php.net/manual/en/book.mysqli.php .

      Zoals je overigens in de lesstof hierboven kunt zien, wordt daar al gewerkt met de mysqli methode en niet meer met de mysql methode 🙂

Leave a Reply

Your email address will not be published.

This site uses Akismet to reduce spam. Learn how your comment data is processed.