 
    original in en Georges Tarbouriech
en to nl Guus Snijders
Georges een lange-tijd Unix gebruiker. Hij houdt van produkten die meedragen aan het verspreiden van vrije software oplossingen in het professionele gebied.
MySQL en Perl bestaan reeds langere tijd. Ze worden nog steeds veel gebruikt,
    ondanks dat de "mode" veranderlijk is. Dit artikel gaat over samenwerking tussen
    deze 2 produkten, of het nu op het Internet is of op je lokale netwerk. Het gegeven
    voorbeeld is voor Unix systemen, vrij of niet, ook al kan het aangepast worden aan
    andere wijdverspreide "systemen".
    Wat dit artikel is: een klein voorbeeld van wat je kunt doen met dit paar, het laten
    zien van eenvoudig gebruik, snelheid, betrouwbaarheid, veiligheid...
    Wat dit artikel niet is: geen MySQL tutorial of Perl tutorial;
    geen MySQL of Perl review.
    Aansluitend, we zullen MySQL aan het werk zien in combinatie met Perl, zonder te
    vergeten dat "er meer dan een manier is om dingen gedaan te krijgen".
 
    
    MySQL is een Relational DataBase Management System (RDBMS) en is beschikbaar
    op http://www.mysql.com. Het wordt verspreid onder
    de GNU GPL, vrij, afhankelijk van waarvoor het gebruikt wordt. Bekijk de licentie
    politiek op MySQL's website. Het werkt als server of client op vele platformen.
    Enkele andere RDBMS'en bestaan als vrije software en we zullen geen verglijkingen
    maken, daar de keuze van MySQL voor dit artikel een voorwaarde was. Ook zullen we
    niet kijken naar de grote "commerciële" jongens zoals Informix, Oracle, Sybase...
    Het volstaat te vermelden dat MySQL waarschijnlijk het meest gebruikte RDBM op het
    Internet is. Voor dit artikel zullen we gebruik maken van 3.23.36 (weer, voorwaardelijk).
    Op moment van schrijven is de huidige stabiele versie 3.23.46 en
    de experimentele is de lang verwachte versie 4.0. Deze kunnen gedownload worden
    als broncode om te compileren of als pakketten. 
    
    Om MySQL in combinatie met Perl te gebruiken, heb je nog iets meer nodig: de Perl
    DBI modules. Op z'n minst kun je downloaden DBI, Msql-Mysql-modules, Data-Dumper
    en Data-ShowTable.
    
    De installatie ervan komt hier verder niet ter sprake, daar deze niet moeilijk is en 
    pakketten voorzien je van alles wat je moet weten.
    
    Perl staat voor Practical Extraction and Report Language. In het begin was
    het bedoelt voor het manipuleren van documenten (parsen, uitpakken...) maar al snel
    werd het meer dan dit. Je kunt bijna alles doen met Perl. Van administratieve zaken
    tot cgi scripts via echte applicaties en natuurlijk, database interfaces.
    Perl is onderdeel van vele (zo niet alle) Unix distributies of ze nu vrij zijn of
    niet. De huidige stabiele versie is 5.6.1 en de experimentele is 5.7.2 op moment van
    schrijven. Voor het artikel zullen we een goede oude gebruiken, 5.005_03. Voor het 
    geval dat je Perl niet geïnstalleerd hebt (hoe is dit mogelijk?) kun je het krijgen
    op http://www.perl.com. Perl voorziet je van tonnen
    modules voor bijna alles. Je kunt ze vinden op het CPAN gedeelte van deze website:
    een ware goudmijn!
    
    Ten slotte, om met beide tools te werken, verassing: je hebt een webserver nodig!
    Apache lijkt de juiste keus, daar het onderdeel is van veel Unix distributies, vrij
    of niet, zoals gebruikelijk. Voor het geval je hem niet hebt (waar heb je die distro
    gevonden?), hij is beschikbaar op http://www.apache.org.
    
    Je hebt waarschijnlijk al gemerkt dat LinuxFocus een meertalige magazine is. 
    Dat betekend dat, als je een redacteur bent, je de status van veel artikelen moet
    managen, zoals de vertaling ervan. In andere woorden, wie doet wat, wanneer... Op het
    moment zijn er zo'n 200 artikelen beschikbaar, gemiddeld in zo'n 5 talen. Dat 
    maakt samen zo'n 1000 artikelen (hoe slim ben ik?) en de teller loopt nog steeds!
    Dit spul moet worden opgeslagen, geformatteerd, samengevat... Hoe denk je dat dit
    management word gedaan? Met Perl, natuurlijk.
    
    Onze hoofdredateur, Guido Socher heeft veel Perl programma's geschreven om het werk
    eenvoudiger te maken. Hij schreef ook een driedelige Perl turtorial en een Perl boek
    bespreking. Zie de referentie sectie aan het eind van het artikel. 
    
    Javi, de Spaanse redacteur, schreef een programma om de status van de vertalingen te
    managen... in Perl.
    
    Atif, een van onze ster auteurs, komt uit Perl land, dat is waarom zijn Perl zijn
    moedertaal is. Ook heeft hij bijgedragen aan MySQL, met het verbeteren van een web
    administratie tool. Wederom, zie de referenties sectie.
    
    Al dit om te zeggen dat als je op zoek bent naar een Perl paradijs... kom bij
    Linuxfocus.
    
    Daar ik een van de Franse Linuxfocus redacteuren ben... en nogal lui, creëerde ik 
    mijn eigen LinuxFocus database, met behulp van, raad eens: MySQL en Perl!
    
    Dit gaat ervan uit dat MySQL correct geïnstalleerd is, users aangemaakt en
    beschermt met passwords. De installatie valt buiten het bereik van dit artikel
    en de geweldige documentatie die met MySQL wordt bijgeleverd zou je alles moeten
    vertellen.
    
    Start de MySQL server met het mysql.server script, daar deze de 
    safe_mysqld daemon aanroept en je zo opties kunt doorgeven aan deze daemon.
    
    Maak contact met de server met
  
mysql -h host -u user -p
Als de server op je locale computer draait, hoef je -h host niet te gebruiken.CREATE DATABASE lf;
Dit is ons voorbeeld (lf staat voor LinuxFocus) en vanzelfsprekend kun je hier iedere naam opgeven die je wilt. Vervolgens is het tijd om de toegestane users permissies toe te kennen, hier wordt aangenomen dat je het recht hebt om dat te doen (oftewel, dat je administratie rechten hebt als de verbonden user). Als je een user in staat wilt stellen de database te managen, kun je hem de permissies geven metGRANT ALL ON lf.* TO username;
Selecteer de database die je zojuist hebt aangemaakt metUSE lf
Maak een tabel aan die voldoet aan jouw eisen. In ons voorbeeld maken we een tabel aan genaamd trissue:CREATE TABLE trissue (num INTEGER UNSIGNED, category VARCHAR(25), title VARCHAR(40), author VARCHAR(20), en VARCHAR(20), es VARCHAR(20), fr VARCHAR(20),de VARCHAR(20), nl VARCHAR(20), ru VARCHAR(20), tk VARCHAR(20), issue VARCHAR(20));
controleer of hij is aangemaakt zoals verwacht met:
    USE lf
    SHOW TABLES; 
    DESCRIBE trissue;
LOAD DATA LOCAL INFILE "maindb.txt" INTO TABLE trissue;
Als je text bestand correct is, is de tabel nu gevuld. Je kunt het controleren met:SELECT * FROM trissue;
Dit zou een lange lijst moeten laten zien. Nu ben je in staat om ieder type data op te halen met behulp van queries.
    Perl zal ons helpen om de queries te automatiseren, de resultaten in een web browser
    weer te geven, enz. Wederom, dit gaat ervan uit dat de Perl modules juist geïnstalleerd
    zijn om MySQL te gebruiken in combinatie met Perl.
    
    We zullen nu Perl scripts schrijven om te gebruiken als cgi scripts. Deze stellen ons
    in staat om Perl en HTML te mixen om de database te ondervragen en de output te
    op te maken (te formatteren).
    
    We zullen een eenvoudig voorbeeld script gebruiken, welke ons toestaat alle artikelen
    te zoeken die geschreven zijn door dezelfde auteur. We zullen de artikel nummers 
    weergeven, de category, de titel, de namen van de vertalers voor de verschillende talen
    (alleen volledig werkende projecten) en de uitgave van wanneer de artikelen 
    gepubliceerd zijn.
    
    Je kunt dit script gebruiken als een model voor eigen gebruik, maar pas op dat dit een
    niet erg veilig programma is. Een versie voorzien van meer commentaar kun je 
    =>hier<= downloaden.
    
     
    #!/usr/bin/perl -Tw 
    # Eerst zeggen we dat dit een "Tainted" Perl script is.
    #
    # Dit is commentaar
    # db consult
    #
    # We zullen de Perl DBI module gebruiken
    use DBI;
    
    # Als cgi :
    use CGI qw(param());
    
   print <<END_of_start; 
   
   Content-type: text/html
   
    <html> 
   <title>LFAuthors main db</title> 
    <center><TABLE> 
    <TR VALIGN=TOP> 
    <TD><form action="/cgi-bin/lf.cgi" method="get"> 
    
    # Hier komt de titel van de knop van de startpagina
    <input type="submit" value="        LFAuth       "> 
    </form> 
    </TD> 
    </TR> 
    </TABLE> 
   
<center><H2>Search by author</H2></center>
<form action=\"/cgi-bin/lf.cgi\" method=\"get\">Author name : <input
type=\"text\" size=\"30\" name=\"author\"><input type=\"submit\" 
value=\"Search...\"></form></center>
END_of_start
if (param("author") ne '') {
	$author = param("author");
	
	$autsrch.='"';
	$autsrch.=$author;
	$autsrch.='"';
# We melden ons bij de database genaamd lf aan als gebruiker doe
	$dbh = DBI->connect("DBI:mysql:lf","doe",'');
	$sth = $dbh->prepare("
		select *
		from trissue
		where
		author = $autsrch
		");
		
	$sth->execute;
print <<END_suite;
	
<center>
<TABLE BORDER=>
<tr bgcolor=#A1C4EE>
<th width=60 align=CENTER><font color=#000000> Num </font></th>
<th width=110 align=CENTER><font color=#000000> Category </font></th>
<th width=110 align=CENTER><font color=#000000> Title </font></th>
<th width=110 align=CENTER><font color=#000000> Author </font></th>
<th width=110 align=CENTER><font color=#000000> En </font></th>
<th width=110 align=CENTER><font color=#000000> Es </font></th>
<th width=110 align=CENTER><font color=#000000> Fr </font></th>
<th width=110 align=CENTER><font color=#000000> De </font></th>
<th width=110 align=CENTER><font color=#000000> Nl </font></th>
<th width=110 align=CENTER><font color=#000000> Ru </font></th>
<th width=110 align=CENTER><font color=#000000> Tk </font></th>
<th width=110 align=CENTER><font color=#000000> Issue </font></th>
  		</tr>
END_suite
	
while( ($num,$category,$title,$author,$en,$es,$fr,$de,$nl,$ru,$tk,$issue) =$sth->fetchrow() ) {
print "<tr>";
print "<td width=60 bgcolor=#FFFFE8 align=center> $num</td>";
print "<td width=110 bgcolor=#FFFFE8 align=left> $category</td>";
print "<td width=110 bgcolor=#FFFFE8 align=left> $title</td>";
print "<td width=110 bgcolor=#FFFFE8 align=left> $author</td>";
print "<td width=110 bgcolor=#FFFFE8 align=left> $en</td>";
print "<td width=110 bgcolor=#FFFFE8 align=left> $es</td>";
print "<td width=110 bgcolor=#FFFFE8 align=left> $fr</td>";
print "<td width=110 bgcolor=#FFFFE8 align=left> $de</td>";
print "<td width=110 bgcolor=#FFFFE8 align=left> $nl</td>";
print "<td width=110 bgcolor=#FFFFE8 align=left> $ru</td>";
print "<td width=110 bgcolor=#FFFFE8 align=left> $tk</td>";
print "<td width=110 bgcolor=#FFFFE8 align=left> $issue</td>";
print "</tr>";
	
	}
	print "</TABLE>";
	print "<BR>";
	print "<BR>";
	print "<br>";
	
	
} else {
# DB Connect
	$dbh = DBI->connect("DBI:mysql:lf","doe",'');
# Zoek
	$sth = $dbh->prepare("
		select *
		from trissue
		");
		
	$sth->execute;
# Display result
print <<SUITE;
<center>
<TABLE BORDER=>
<tr bgcolor=#A1C4EE>
<th width=60 align=CENTER><font color=#000000> Num </font></th>
<th width=110 align=CENTER><font color=#000000> Category </font></th>
<th width=110 align=CENTER><font color=#000000> Title </font></th>
<th width=110 align=CENTER><font color=#000000> Author </font></th>
<th width=110 align=CENTER><font color=#000000> En </font></th>
<th width=110 align=CENTER><font color=#000000> Es </font></th>
<th width=110 align=CENTER><font color=#000000> Fr </font></th>
<th width=110 align=CENTER><font color=#000000> De </font></th>
<th width=110 align=CENTER><font color=#000000> Nl </font></th>
<th width=110 align=CENTER><font color=#000000> Ru </font></th>
<th width=110 align=CENTER><font color=#000000> Tk </font></th>
<th width=110 align=CENTER><font color=#000000> Issue </font></th>
  		</tr>
SUITE
	
while( ($num,$category,$title,$author,$en,$es,$fr,$de,$nl,$ru,$tk,$issue) =$sth->fetchrow() ) {
print "<tr>";
print "<td width=60 bgcolor=#FFFFE8 align=center> $num</td>";
print "<td width=110 bgcolor=#FFFFE8 align=left> $category</td>";
print "<td width=110 bgcolor=#FFFFE8 align=left> $title</td>";
print "<td width=110 bgcolor=#FFFFE8 align=left> $author</td>";
print "<td width=110 bgcolor=#FFFFE8 align=left> $en</td>";
print "<td width=110 bgcolor=#FFFFE8 align=left> $es</td>";
print "<td width=110 bgcolor=#FFFFE8 align=left> $fr</td>";
print "<td width=110 bgcolor=#FFFFE8 align=left> $de</td>";
print "<td width=110 bgcolor=#FFFFE8 align=left> $nl</td>";
print "<td width=110 bgcolor=#FFFFE8 align=left> $ru</td>";
print "<td width=110 bgcolor=#FFFFE8 align=left> $tk</td>";
print "<td width=110 bgcolor=#FFFFE8 align=left> $issue</td>";
print "</tr>";
	
	}
	print "</TABLE>";
	print "<BR>";
	
}
print end_html;
$sth->finish;
# Verbreek de verbinding
$dbh->disconnect;
exit;

Vanzelfsprekend, als je een database service op je website wilt aanbieden, moet
je het geheel beveiligen. Uiteraard gaan we geen stap-voor-stap manier geven om
een website of database server te beveiligen. Echter, het is belangrijk om in te 
gaan op de basis.
In het kort, als je services gaat aanbieden op het web, is het eerste dat je moet
beveiligen, je web server. Dit gaat ver voorbij dit artikel. als je meer wilt leren
over het onderwerp, is er zat documentatie beschikbaar. 
Een goede plaats om te beginnen is het
A nice place to start is het Linux Documentatie Project.
    
    De volgende stap is de database server. als je een tool als MySQL installeert,
    vergeet niet om het beveilings deel van de manual te lezen. Weer, de basis
    gaat over user passwords: laat nooit een account achter zonder password, in het
    byzonder de root account van de database (welke niet dezelfde zou moeten zijn
    de machine's root account). Een ander belangrijk punt is permissies: geef niet
    iedereen volledige rechten. Het lijkt logisch... en dat is waarom veel mensen
    het vergeten!
    
    Om een stap verder te gaan, waarom de database niet chroot draaien? zie
    Mark's artikel "Alle diensten in Linux onder
    Chroot draaien " in deze uitgave. Hij spreekt over een andere database, maar 
    wat hij zegt kan ook wordentoegepast op MySQL.
    
    Een andere beveiligings maatregel gaat over de data circulatie. Het is geen
    slecht idee om de data te zenden en ontvangen door een tunnel. Je kunt het
    artikel Through the tunnel lezen 
    voor meer informatie
    
    Last but not least, veilig programmeren is een van de sleutels. Perl is een
    prachtige taal, maar het is vrij makkelijk om programmeer fouten ermee te
    maken. Een ander LinuxFocus artikel zal je leren wat te doen, vooral met Perl.
    Werp een blik hier. 
    Het is het laatste artikel van en Secure Programming serie en behelst in het
    byzonder cgi scripts. Een "must read"!
    
    Let wel, dit gaat er vanuit dat je reeds een gehard systeem hebt zonder 
    bekende beveilingsgaten, met de nieuwste patches, en vele verplichte beveiligings
    tools met een NIDS (Network Intrusion Detection System) zoals snort (van
    http://www.snort.org), firewall, poort en
    beveiligings scanners (nmap, nessus), enz.
    
    Als je het je kunt veroorloven kun je ook een aparte server voor iedere geleverde
    server inzetten: een web server, een database server... en de mirrors voor hoge
    beschikbaarheid. En zo verder! Er komt nooit een eind aan, daar veiligheid nooit
    volledig bereikt is. Je probeert alleen de risico's te reduceren... en ze worden
    iedere dag erger. Je bent gewaarschuwd.
    
 Daar er meer dan een manier is, kun je je eigen weg kiezen. Er zijn vele RDMBS en
 vele talen om ermee te communiceren. Het idee achter het schrijfen van dit artikel
 was om te laten zien hoe MySQL en Perl goed kunnen samenwerken.
 
 Uiteraard was de keuze nogal subjectief: Ik hou van MySQL omdat het nogal klein in
 grootte is, werkt met vele besturingssystemen, het is snel, betrouwbaar... Ook heb
 ik veel waardering voor het werk gedaan door het MySQL team, zonder de vele deelnemers
 te vergeten. En wat ik het mooiste vind: die mensen probeerden niet het wiel opnieuw
 uit te vinden. Ze hielden de dingen eenvoudig.
 
 Wat betreft Perl, alles is er reeds over gezegd: wat zou ik nog kunnen toevoegen?
 Ikzelf ben van mening dat je niet zonder kunt, of je nu een netwerkbeheerder bent of
 een ontwikkelaar, of wat dan ook. De Perl gemeenschap is een van de grootste bronnen
 van kennisdeling daar buiten. Er is ook een tijdschrift beschikbaar, genaamd
 Perl Journal, deze is nu opgenomen in SysAdmin magazine en verschijnt iedere 2 uitgaven.
 Als je je wilt inschrijven, ga naar http://www.samag.com.
 
Nu we het hebben over goed werk, hier komt het gebruikelijke off-topic gedeelte.
Onze LinuxFocus lezers hebben waarschijnlijk niet het kleine aantal personen
opgemerkt die betrokken zijn bij LinuxFocus. Desalniettemin kun je het lezen in
veel verschillende talen. Heb je ooit opgemerkt dat sommige teams werken met 
slechts een of twee personen die al het werk doen? Zij zijn webmasters, vertalers,
enz. Zie het Russische team, het Turkse Team: Je zult zien dat de meeste artikelen
zijn vertaald door Kirill of Erdal. Zie de projecten in ontwikkeling zoals Portugees
of Arabisch: zelfde resultaat! Hierbij wil ik ze alle feliciteren voor het goede
werk dat ze doen. Allen bedankt: de vrije software gemeenschap heeft veel aan jullie
te danken.
Sorry voor de afleiding, maar ik geloof dat gezegd moest worden.
Terug naar het onderwerp, laten we afsluiten met een paar woorden over vrije software.
De mensen van MySQL of Perl verdienen veel bedankjes. Ze voorzien ons van fantastische
tools, en meestal voor niks. Deze tools zijn echter even goed als echte commerciële 
produkten (zo niet beter), worden vaak geüpdate, zeer goed gedocumenteerd en je kunt
ze gebruiken op vrijwel alle Unix systemen. Kun je een verglijkbaar produkt ergens anders
vinden? Ik ben bang van niet!
Dit artikel zal je waarschijnlijk niet veel leren, echter als het je stimuleert te
kijken naar die producten, is het niet voor niks.
Leven we niet in een prachtige tijd?
Perl.org 
cpan.org, het perl archief
Guido's Perl tutorial:
Perl I
Perl II
Perl III
Professional Perl Programming boek bespreking:
Perl Programming
  Atif's bijdrage aan MySQL.
Een LinuxFocus MySQL bespreking: een oud artikel, nog altijd up-to-date:
MySQL 
Een oude LinuxFocus tweedelige SQL tutorial:
SQL Part I 
SQL Part II