Connecties

Inleiding Een verbinding Praktijkvoorbeeld

Inleiding

In de vorige hoofdstukken is de database programmeertaal SQL geïtroduceerd. Deze taal is nodig om gegevens op te vragen of te muteren via een database management programma. Het doel van deze module is een eigen webapplicatie in php te maken die gebruikmaakt van een MySQL database voor de opslag van gegevens. De koppeling van php met de database vindt plaats door vannuit php een verbinding te maken met een database management service. Is de koppeling tot stand gebracht dan kan men vanuit php doormiddel van SQL opdrachten met deze service communiceren. In dit hoofdstuk concentreren we ons alleen op het maken van de verbinding van het php programma met de database management service.

Tot slot zal er bij elk hoofdstuk waarin php en sql wordt beschreven een praktijkvoorbeeld staan. Als je de voorbeelden zelf uitvoert, zal je aan het einde een klein programma hebben waarin je gegevens kunt manipuleren met behulp van php/mysql.

Aan het einde van dit hoofdstuk weet je :

  • wat een verbinding is;
  • waar een verbinding uit bestaat;
  • hoe een verbinding werkt;
  • hoe je zelf een verbinding kunt opzetten;

Een verbinding

1Om php en mysql met elkaar te laten samenwerken, zal je in php-code een opdracht tot het maken van een verbinding met de database management service aanwezig moeten zijn. Als de code wordt uitgevoerd wordt er den een verbinding gemaakt tussen de webserver die de php code uitvoert en de mysql database service die op een, mogelijkerwijs andere computer, draait. Als deze verbinding gemaakt kan worden is er daarna de mogelijkheid om gegegevens te kunnen uitwisselen tussen php en de database met behulp van de sql-opdrachten. Door gebruik te maken van formulieren (zie de cursussen javascript en php) kun je vervolgens een gebruikers interface ontwikkelen waar een gebruiker op een beheersbare manier met de gegevens in contact kan komen.

Een verbinding maak je door in php de volgende gegevens op te nemen:

server
De server is het ip adres van de computer met een actieve database management service. Op school staan de webserver en de database manager op dezelfde computer (websrv201) en kun je "localhost" voor de server invullen.
database
Als je de database server een andere computer in een netwerk is, dan zal je een ip-adres (nummer) moeten invullen. De database is de naam van de database die de gevens bevat.
gebruikersnaam en wachtwoord
En een gebruikersnaam en wachtwoord heb je nodig om toegang te krijgen tot de database service. Op school maken we standaard gebruik van de gebruikersnaam: leerling en wachtwoord: rloleerling.

Een verbinding maken bestaat uit de volgende stappen:

  • Zorg dat de bovenstaande gegevens over de server, database, gebruikersnaam en wachtwoord bekend zijn.
  • Deze gegevens worden in php functies gebruikt om een connectie tot stand te brengen.
  • Zorg voor fout afhandeling of voer het gewenste dataverkeer uit.

Praktijkvoorbeeld

Opdrachten
  1. In voorbeeld 1 hieronder is een uitwerking te zien hoe je een verbinding maakt met mysql via php. Bestudeer de code goed en sla deze code in een bestand genoemd test.php op en bekijk het resultaat.
  2. Voorbeeld 2 hieronder is een aanpassing van tets.php naar database.php aangevuld met twee documenten: index.php en algemeen.php. Omdat er straks veel taken zullen zijn die een verbinding met de database moeten maken is het handig deze code maar één keer te programmeren en deze code in meerdere functies aan te roepen. Het document algemeen.php wordt het document waarin we functies gaan plaatsen die op meerdere plaatsen in nog te ontwikkelen code worden gebruikt.
    In index.php wordt met de opdrachten require_once("database.php"); en require_once("algemeen.php"); de code voor het maken van de database verbinding en de algemene code ingelezen. De regel
    $db=maakVerbinding();
    
    roept de functie aanwezig in database.php aan.
voorbeeld 1: test.php
<?php
// opslaan als test.php
// toegangsgegevens mysql database service
$server = "localhost";
$user = "leerling";
$wachtwoord = "rloleerling";
$database ="garagebedrijf"; 
$melding = "";  
/* 
   We maken hier gebruik van PDO als code om via php met de databasemabager te verbinden.
   PDO heeft fout afhandeling via PHP exception handling.
*/
try 
{
  // Uitleg connecties maken https://www.w3schools.com/php/php_mysql_connect.asp
  $db = new PDO("mysql:host=$server;dbname=$database", $user, $wachtwoord);
  // set the PDO error mode to exception
  $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
  $melding = "De verbinding is tot stand gebracht";
  // verbreek verbinding
  $db = null;
} 
catch(PDOException $e) // Doe wat wanneer er een fout is opgetreden
{
  $melding ="Helaas, mysql kan geen verbinding maken:
" . $e->getMessage(); }/* Met onderstaand echo commando kun je een stuk text tussen END en END; naar de client computer sturen */ echo <<<END <!DOCTYPE HTML> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <title>Page title</title> </head> <body> $melding<br/> </body> </html> END; ?>
voorbeeld 2: database.php

Bestand 1

<?php
//  sla op als database.php
/*  eerst definieren we twee global variabelen $db en $melding.
    Een global variabele is een variabele die we overal in de code
    kunnen benaderen. Voordelen van een global variabele zijn
    dat een dergelijke variabele overal vanuit de code benaderbaar is
    en dat er communicatie mogelijk is vanuit verschillende 
    functies met behulp van deze variabelen zonder dat de functie
    argumnenten nodig heeft.
    Een groot nadeel is dat het naarmate projecten groter worden
    lastig is om globale variabelen goed in het oog te houden.
*/
global $melding; // zal worden gebruikt voor foutmeldingen in database functies
global $db;      // zal worden gebruikt om een database connectie in op te slaan
$melding = "";    // zet de melding eerst op leeg
$db=null;        // zet de connectie eerst op null

/*
 maakVerbinding maak een verbinding met de database.
 */
function maakVerbinding()
{
   global $melding; // zorg dat je de globale variabele $melding gaat gebruiken
   global $db;        // zorg dat je de globale variabele $db gaat gebruiken
   $server = "localhost";
   $user = "leerling";
   $wachtwoord = "rloleerling";
   $database ="garagebedrijf"; 
   if($db !== null)
   {
      $melding = "Er is al een verbinding";
   }
   else
   {
      try {
        $db = new PDO("mysql:host=$server;dbname=$database", $user, $wachtwoord);
        // set the PDO error mode to exception
        $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        $melding = "Connectie met database gemaakt";
        
      } catch(PDOException $e) {
        $melding = "Helaas, mysql kan geen verbinding maken: " . $e->getMessage();
        $db = null;
      }
   }
   return $db;
}
/*
 verbreekVerbinding verbreekt de connectie met de mysql server en
 zet de globale variabele $db weer op de startwaarde.
 */
function verbreekVerbinding()
{
 global $db;
 if($db)
 {
   $db=null;
 }
}

?>

Bestand 2

<?php
// sla op als algemeen.php

/*
 toonVerbindingStatus() is een fucntie die de database connectie test.
 Het resultaat is een tekst die het succes of niet van het maken van de connectie
 met de database manager weergeeft
 */
function toonVerbindingStatus()
{ 
 $uitvoer=""; // initialisatie van variabele om uitvoer in te plaatsen
 $melding=""; // initialisatie van variabele om connectie foutmelding in te plaatsen
 global $db; // Haal een verwijzing naar de huidige connectie in database.php
 // maak verbinding
 maakVerbinding($db,$melding);
 if(!$db) // test verbinding
 {
  // mislukt
  $uitvoer=$melding;
 }
 else
 {
  $uitvoer=$melding; 
  // Volgende is niet nodig maar alleen om functionaliteit maakVerbinding te laten zien
  // verbind nog een keer 
  maakVerbinding($db,$melding);
  $uitvoer.="<br/>".$melding;  
  //sluit database
  verbreekVerbinding();
  // verbind nog een keer;
  maakVerbinding($db,$melding);
  $uitvoer.="<br/>".$melding;  
  verbreekVerbinding();
 }
 return $uitvoer;
}
//einde van het PhP blok
?>

Bestand 3

<?php
// sla op als index.php
// ophalen externe code
require_once("database.php");
require_once("algemeen.php");

/*    declareren van variabelen die we in de rest van de code in 
   dit document nodig hebben
*/   
$actie="toonVerbindingStatus";
$uitvoer = "";

// afhandelen actie ofwel uitvoer maken
// Vertel hier wat een switch ook weer doet.
switch($actie)
{
 case "toonVerbindingStatus": $uitvoer = toonVerbindingStatus(); break;
 default: $uitvoer = "Er is niets te doen"; break;
}

// html uitvoer
echo <<<END
<!DOCTYPE HTML>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />    
<title>Page title</title>
</head>
<body>
$uitvoer<br/>
</body>
</html>
END;
//einde van het PhP blok
?>