Connecties

Inleiding Introductie connecties 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

Om 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.
Opdrachten
  1. Voor de verbinding in Mysql spelen drie commando's een rol: mysql_select_db, mysql_close en mysql_connect. Zoek op internet hoe deze commando's stuk voor stuk werken en bekijk of je de volgorde van deze kunt bepalen als je deze commando's straks gaat toepassen.

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: database.php op.
  2. Voorbeeld 2 hieronder is een aanpassing van database.php aangevuld met twee documenten: index.php en algemeen.php. Omdat er veel documenten zullen zijn die een verbinding met de database moeten maken is het handig deze code maar 1 keer te programmeren en deze code in meerdere documenten 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: database.php
<?php
// opslaan als database.php
// toegangsgegevens mysql database service

$server = "localhost";
$user = "leerling";
$wachtwoord = "rloleerling";
$database ="garagebedrijf"; 
$melding = "";
// verbinding maken met mysql database service $db = new mysqli($server, $user, $wachtwoord,$database); if ($db->connect_errno) { $melding ="Helaas, mysql kan geen verbinding maken" . $db->connect_error; } else { $melding = "De verbinding is tot stand gebracht"; // sluit connectie met database service af $db->close(); } /* 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 definiƫren we twee global variabelen $db en $melding.
 Een globale variabele is een variabele die we overal in de code
 kunnen benaderen. Voordelen van een globale 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
 argumenten 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="";   // zal worden gebruikt voor foutmeldingen in database functies
$db=null;   // zet de connectie eerst op null

/**
 * maakVerbinding probeert een verbinding met de database manager op te zetten
 * param &$db: verwijzing naar de globale variabele die de connectie aangeeft
 * param &$melding: verwijzing naar variabele die de meldingen bijhoudt
 */
function maakVerbinding(&$db,&$melding)
{
  // toegangsgegevens mysql database service
 $server = "localhost";
 $user = "leerling";
 $wachtwoord = "rloleerling";
 $database ="garagebedrijf"; 

 // test of er al een verbinding is;
 if($db)
 {
  $melding = "Er is al een verbinding";
 }
 else
 {
  // verbinding maken met mysql database service
  $db = new mysqli($server, $user, $wachtwoord,$database);
  if ($db->connect_errno) 
  {
    $melding ="Helaas, mysql kan geen verbinding maken" . $db->connect_error;
    $db=null;
  }
  else
  {
    $db->set_charset('utf8'); // Zorgt dat speciale tekens ook uit de database worden gehaald
    $melding = "Connectie met databse gemaakt";
  }
 }
 return $db;
}
/**
 * verbreekVerbinding verbreekt de connectie met de mysql server en
 * zet de globale variabele $db weer op de startwaarde.
 */
function verbreekVerbinding()
{
 global $db; // Haal een verwijzing naar de huidige connectie in database.php
 if($db)
 {
  $db->close();
  $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
?>