Learnit Training

SQL-database exporteren naar CSV

Met PHP kun je eenvoudig informatie uit je database aanbieden aan je bezoekers in een CSV bestand. CSV (Comma Separated Values) is een simpel formaat waarbij alle waarden gescheiden worden door een komma. Het is o.a. te openen met Excel, waarna je er data-analyses op los kunt laten of er grafieken van kunt maken.

We gaan hier een PHP script schrijven dat resultaten uit onze database haalt en deze in een CSV bestand zet. In ons geval de uitslagen van cursus examens.

De eerste stap is het ophalen van de gegevens uit de database. Daarbij maken we gebruik van PDO (5 redenen om PDO te gebruiken met SQL databases).

$db_user = 'learnit';
$db_pass = 'geheim';
$db_name = 'uitslagen';
$db_host = 'localhost';

try {
    $db = new PDO("mysql:host=$db_host;dbname=$db_name;charset=utf8", 
                  $db_user, 
                  $db_pass, 
                  // Als een error optreed moet PDO een exception gooien
                  array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION));
	$query = "SELECT id, naam, email, resultaat FROM Uitslagen";
	$pds = $db->query($query); 
} catch(PDOException $ex) {
    echo "An Error occured: " . $ex->getMessage(); 
	exit();
}	

We maken hier gebruik van een try-catch om exceptions die bij een verbindingprobleem kunnen optreden af te vangen. Het resultaat van de query is een PDOStatement Object. Hier kunnen we de records uit halen, maar eerst moeten we nog voorbereidingen treffen:

header('Content-Type: text/csv' );
header('Content-Disposition: attachment; filename="resultaten.csv');

Met behulp van de header functie passen we de HTTP header aan. We willen dat de bezoeker het bestand direct kan downloaden. Dat doen we door in de header aan te geven dat het om een CSV bestand gaat en dat het "resultaten.csv" heet.

Nu het openen van de standard output kunnen we het CSV bestand zelf gaan schrijven:

$fp = fopen('php://output', 'w');
fputs($fp, chr(0xEF) . chr(0xBB) . chr(0xBF));

In het CSV bestand willen we gebruik maken van de UTF-8 encoding. Om er voor te zorgen dat Excel herkent dat het hier om een UTF-8 encoding gaat moeten het CSV betand beginnen met 0xEF,0xBB,0xBF.

Nu kunnen we de eerste regel aan het CSV bestand toevoegen. Deze bevat de kopjes van de gegevens:

fputs($fp, "id, naam, email, resultaat\r\n");

De \r\n aan het einde van de string geeft een regeleinde aan. Als we deze niet zouden toevoegen zouden volgende gegevens achter worden geplakt ipv op een nieuwe regel. Let op: dit werkt alleen in strings met dubbele quotes.

De volgende lus herhalen we zolang er records gefetched kunnen worden. Deze zet de gegevens in het CSV bestand.


while($uitslag = $pds->fetch(PDO::FETCH_ASSOC)) {
	fputcsv ($fp, $uitslag, ','); 
}

Bij het schrijven naar het bestand worden we geholpen door de fputcsv() functie. Deze schrijft het array naar het CSV bestand. Het derde argument van deze functie is het scheidingsteken. In plaats van de komma (,) zouden we ook een ander scheidings teken kunnen gebruiken, bijvoorbeeld de puntkomma (;). Om het geheel af te maken sluiten we netjes de file:

fclose($fp);

Het gehele script:

<?php
$db_user = 'learnit';
$db_pass = 'geheim';
$db_name = 'uitslagen';
$db_host = 'localhost';
			
try {
    $db = new PDO("mysql:host=$db_host;dbname=$db_name;charset=utf8", 
                  $db_user, 
                  $db_pass, 
                  array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION)
                  );
	$query = "SELECT id, naam, email, resultaat FROM Uitslagen";
	$pds = $db->query($query); 
} catch(PDOException $ex) {
   	echo "An Error occured: " . $ex->getMessage(); 
	exit();
}	

header('Content-Type: text/csv' );
header('Content-Disposition: attachment; filename="uitslagen.csv"');

$fp = fopen('php://output', 'w');	
fputs($fp, chr(0xEF) . chr(0xBB) . chr(0xBF) );
fputs($fp, "id, naam, email, resultaat\r\n");
while($uitslag = $pds->fetch(PDO::FETCH_ASSOC)) {
	fputcsv ($fp, $uitslag, ','); 
}
fclose($fp);
?>