U bent hier

Applicatie zonder MySQL

Een enkelvoudige database-applicatie zonder MySQL.

Een database-applicatie zonder MySQL?
Ja, dat kan.
PHP heeft mogelijkheden waarbij files gebruikt kunnen worden als gegevens-opslag.
Het volgende artikel zal een uitleg hoe je

  • kunt lezen uit een file
  • een specifieke regel kunt uitlezen uit een file
  • een regel kunt verwijderen uit een file
  • een regel kunt aanpassen uit een file

Voor velen is een database-applicatie een ver van mijn bed show.
Er wordt veel kennis verondersteld omtrent het schrijven / aanpassen van de scripts en het beheer van de MySQL database.
Er zijn echter ook andere manieren (lees simpeler) om een site interaktief te maken en houden

File contra database

PHP is in staat om gegevens uit een file te lezen, er iets aan te voegen en er iets uit te verwijderen.
Dit komt als snel neer op een vorm van database verkeer.
En dat is het ook.
Binnen dit voorbeeld wordt hier gebruik van gemaakt.
Het enigste wat PHP moet kunnen, is lezen en schrijven naar zo'n file.
Hoe dit in zijn werk gaat, wordt verder in het artikel uitgelegd.

PHP en files

Er is veel te vertellen over het mechanisme welke PHP hanteert om files direct te benaderen.
Een klein stukje voorbeeld en uitleg.
Laten we met het toevoegen van gegevens beginnen.
De reden dat ik niet kies voor een logischer begin zoals het uitlezen van een file is dat ik nu met de officiële manier kan beginnen hoe PHP met files omgaat.
Waarom dat is, kan ik verwijzen naar de alinea Windows versus Linux, welke verderop beschreven staat.
We beginnen met het tonen van het script.

<?php

$bron                = "data";

$nieuwe_gegevens     = $naam ."|". $straat ."|". $pc ."|". $woonplaats ."|". $opmerking ;

$handle              = fopen ($bron, "a");

fwrite ($handle, $nieuwe_gegevens );

fclose ($handle);
    
?>

   [ Voorbeeld 1 => Het toevoegen van gegevens ]   

In dit geval is het de bedoeling dat er een nieuwe regel wordt toegevoegd.
Er is een formulier gemaakt welke de volgende velden heeft:

  • naam
  • straat
  • pc (postcode)
  • woonplaats
  • opmerking

Voor een voorbeeld van een formulier kijk naar Voorbeeld 9.
Je zou hier al een vorm van gastenboek in kunnen zien.

Er is een file beschikbaar waar de gegevens in dienen te komen.
Deze file heet data.
De naam van de file is niet belangrijk, ook de extensie niet.
Er zijn eigenlijk maar 2 voorwaarden.

  1. De file moet leesbaar en schrijfbaar voor PHP zijn
  2. De file moet in ASCI formaat geupload zijn
    Zie hiervoor de uitleg helemaal beneden en/of de uitleg in één van de vorige artikelen.

PHP zal in bovenstaande voorbeelde de volgende stappen doorlopen.

  1. Er wordt een file aangemerkt als de bron van informatie. ( $bron )
  2. Er zijn gegevens beschikbaar om iets mee te doen. ( $nieuwe_gegevens )
    Deze komen uit een formulier.
  3. PHP probeert of de bron van informatie te openen valt. ( fopen )
  4. Tevens opent PHP de bron van informatie zodanig dat er informatie toegevoegd kan worden. ( "a" )
  5. De inhoud van de bron van informatie wordt aan een variabele toegekend ( $handle )
  6. PHP schrijft de inhoud van de nieuwe gegevens weg achter de oude gegevens. ( fwrite )
  7. Als laatste wordt de file weer gesloten. ( fclose )


Bij het toevoegen van een nieuwe regel ( record ) maak je gebruik van 2 files.
Één is het formulier om de gegevens te verzamelen en te versturen.
Het andere script is het daadwerkelijk toevoegen van de gegevens in de file.
Hoe dat werkt is hierboven al uitgelegd.

Het gedeelte met de ."|". nog niet.
Als je regel
$naam ."|". $straat ."|". $pc ."|". $woonplaats ."|". $opmerking
leest en probeert te je voor te stellen wat er eigenlijk staat, zul je tot conlusie komen dat er een lange zin ( = lees string ) gevormd wordt.

Een voorbeeld.
Het formulier "nieuw" heeft de volgende gegevens opgeleverd.

  • naam -> Klaas
  • adres -> Vaart 4
  • pc -> 9876 KK
  • woonplaats -> Klazienaveen
  • opmerking ->Leuk dit artikel

De string $nieuwe_gegevens zal er dan als volgt uitzien.
"Klaas|Vaart4|9876 KK|Klazienaveen|Leuk dit artikel"
Alle losse gegevens binnen een regel zijn gescheiden door het | teken.

PHP kan door midel van de explode en implode functies, deze gegevens scheiden danwel weer aan elkaar plakken.
Je hebt zo een prima veldscheiding gerealiseerd.
Ja maar, zul je nu zeggen.
Wat gebeurd er als je het teken | als informatie in een formulier invoerd?
Dan crasht de applicatie.
Er zijn geen standaard controles hiervoor ingebouwd.

Een aantal raadgevingen zijn hier op zijn plaats.

  • Maak gebruik van meerdere tekens als veldscheidingsteken bv. #~#
  • Schrijf een functie welke het teken ( of meerdere tekens ) welke je gebruikt als veldscheidingsteken omzet naar een onschuldig teken, bij het invoeren van nieuwe gegevens of het aanpassen van gegevens


Het enige waar je wel op dient te letten, is op welke wijze PHP een file benadert.
Hier een overzicht:

 Mode   Actie van PHP
"r" Openen voor alleen lezen; plaats de bestandspointer aan het begin van het bestand.
"r+" Openen voor lezen en schrijven; plaats de bestandspointer aan het begin van het bestand.
"w" Openen voor alleen schrijven; plaats de bestandspointer aan het begin van het bestand en leegt het bestand.
Als het bestand niet bestaat, probeer het deze aan te maken.
"w+" Openen voor lezen en schrijven; plaats de bestandspointer aan het begin van het bestand en leegt het bestand.
Als het bestand niet bestaat, probeer het deze aan te maken.
"a" Openen voor alleen schrijven; plaats de bestandspointer aan het einde van het bestand.
Als het bestand niet bestaat, probeer het deze aan te maken
"a+" Openen voor lezen en schrijven; plaats het bestandspointer aan het einden van de file.
Als het bestand niet bestaat, probeer het deze aan te maken

Windows versus Linux.

Om op een Windows machine hier mee te werken, kun je de officiele wijze welke op nl.php.net staat niet gebruiken.
Bij het uitlezen wordt op een Windows machine standaard één regel extra gelezen.
De regeleinden zijn namenlijk onder Windows anders.
Op een Linux systeem zal dit niet voorkomen.
Er is wel een manier welke op beide systemen werkt.

Het gegevensbestand data.

Voor deze applicatie kun je gebruik maken van de volgende file data met de volgende inhoud.

Abel|Weg 1|1234 AA|Assen|Dit zijn de opmerkingen van Abel
Bert|Straat 2|2345 BB|Breda|Dit zijn de opmerkingen van Bert
Chris|Laan 3|3456 CC|Coevorden|Dit zijn de opmerkingen van Chris
Dirk|Pad 4|4567 DD|Deventer|Opmerkingen van Dirk
Evert|Water 5|5678 EE|Emmen|Dit zijn de opmerkingen van Evert
Frans|Pad 6|6789 FF|Den Bosch|And now something completly different. The lob.

   [ Voorbeeld 2 => De gegegens ]   

Kopieer de inhoud van bovenstaande in een file en noem deze data
Zorg ervoor dat eventuele scripts welke met de file werken, in de zelfde directorie staan.

Het uitlezen van een file.

Allereerst het script zelf.

<?php

$gegevens         = file("data");

$aantal_regels    = count( $gegevens );

for ($i = 0; $i < $aantal_regels ; $i++)  {
    
    list (
$naam, $adres, $pc, $woonplaats, $opmerking ) = explode ('|', $gegevens[$i] ) ;
    
        echo
$naam ." ". $adres ." ". $pc ." ". $woonplaats ;
        echo
"<br>";
}

?>

   [ Voorbeeld 3 => Het uitlezen van een file ]   

  • PHP zal de inhoud van de bron van informatie toekennen aan de variabele $gegevens
  • Door gebruik te maken van het uitlezen door de functie file wordt van de de variabele $gegevens een array gemaakt.
  • PHP telt hoeveel regels de bron van informatie kent count
  • Deze informatie wordt bewaard. ( $aantal_regels )
  • De volgende regel maakt een lus voor precies het aantal keren dat er regels aanwezig zijn. ( for ( ) )
  • De array $gegevens wordt nu per regel uitgelezen. ($gegevens[$i] )
  • Daarna wordt er gekeken waar de '|'staan, welke gaan dienen als veldscheidingstekens.
    De array wordt als het ware in hapklare brokken gehakt.  explode ('|', $gegevens[$i] )
  • De functie list ( ) zorgt ervoor dat de ontstane veelden toegewezen worden aan zinvole variabelen .
    $naam, $adres, $pc, $woonplaats, $opmerking
  • De laatste stap is het iets doen met de variabelen.
    In dit geval het tonen op het scherm.   ( echo )

Het uitlezen van een bepaalde regel - Deel 1

Hier worden nu 2 files gebruikt.
Één om de linken weer te geven en de tweede om de inhoud weer te geven.

(NB.) Het gebruik van het vraagteken <a href=\"laat_opm_zien.php?i=".$i."\"> is al uitgelegd in het volgende artikel.

<?php

$gegevens         = file("data");

$aantal_regels     = count($gegevens);

for ($i = 0; $i < $aantal_regels ; $i++)  {
    list (
$naam, $adres, $pc, $woonplaats, $opmerking ) = explode ('|', $gegevens[$i] ) ;
        echo
trim($naam) . " " . trim($adres) . " " . trim($pc) . " " . trim($woonplaats) ;
        echo
"<a href=\"?op=wijzig&i=".$i."\">Wijzig</a> <br>" ;
}
    
?>

   [ Voorbeeld 4 => Het uitlezen van een bepaalde regel ]   

De uitleg is voor een groot deel hierboven al gegeven.
Het eerste wat er gebeurd is dat er informatie wordt weer gegeven welke een link bevat voor nadere informatie.
Het verschil is dat de teller $i wordt gebruikt om een bepaalde regel te gaan zoeken.

Het uitlezen van een bepaalde regel - Deel 2

Nu het gedeelte welke de regel ook daadwerkelijk laat zien.
Het script.

<?php

$gegevens = file("data") ;

list ( $naam, $adres, $pc, $woonplaats, $opmerking ) = explode ('|', $gegevens[$i] ) ;

echo $naam . " - ". $opmerking ;

?>

   [ Voorbeeld 5 => Het uitlezen van een bepaalde regel ]   

Ook hier betrekkelijk weinig nieuws onder de zon.
De basis is het uitlezen van een file.
Nu echter hoef je geen lus in te gaan om alle regels weer te geven, maar weet je de regel al. ( $i )
Je hoeft dus alleen die ene regel uitlezen.
En dat is precies wat het script doet.

Het verwijderen van een regel - Deel 1

Dit is hetzelfde als tegen MySQL zeggen dat deze een record dient te verwijderen.
Allereerst het script.

<?php

$gegevens         = file("data");

$aantal_regels    = count( $gegevens );

for ($i = 0; $i < $aantal_regels ; $i++)  {
    
    list (
$naam, $adres, $pc, $woonplaats, $opmerking ) = explode ('|', $gegevens[$i] ) ;
    
        echo
$naam ." <a href=\"verwijder_regel_definitief.php?i=".$i."\">Verwijder regel</a> <br>" ;

}

?>

   [ Voorbeeld 6 => Het verwijderen van een bepaalde regel - Deel 1 ]   

De basis is weer het uitlees script met nu een link naar een script welke het daadwerkelijk verwijderen verzorgd.

Het verwijderen van een regel - Deel 2

We beginnen weer met het script.
Hiervoor heb ik gebruik gemaakt van een script welke ik bij www.php4u.net vond.
Het script is vertaald in het Nederlands om werking ervan te verduidelijken.

<?php

function wijzig_regel($regel, $verander_in)
    {
        
$aantal_regels = file("data");
        if(empty(
$verander_in))
            {
            unset(
$aantal_regels[$regel]);
            } else {
            
$aantal_regels[$regel] = $verander_in;
            }

        $aantal_regels_nieuw = implode("", $aantal_regels);
        
$gegevens = fopen("data", "w");
        
fputs($gegevens, $aantal_regels_nieuw);
        
fclose($gegevens);
    }

    wijzig_regel ( $i, $verander_in ) ;

?>

   [ Voorbeeld 7 => Het verwijderen van een bepaalde regel - Deel 2 ]   

Okee, daar gaan we.

De onderste regel voert de actie uit.
Het is tenslotte een functie.
Deze functie vervangt een regel met een andere regel.
He, zul je nu zeggen.
Het ging toch om verwijderen?
Dat klopt.
Echter is iets vervangen door niets niet hetzelfde als verwijderen?
En ja, deze functie gebruiken we ook om de inhoud van een regel te wijzigen.

De globale werking berust op het volgende.
De functie   wijzig_regel ( )   zal de variabele   $i   gebruiken om de regel die hoort bij de variabele   $i   te zoeken en daar de inhoud van de variabele   $verander_in   in terug te plaatsen.

Dan nu de function wijzig_regel( ).
Deze is complex.
Het script maakt van de gegevensbron een array met behulp van de file functie. ( file( ) )
De functie kijkt dan of er iets dient te veranderen. ( if(empty($verander_in)) )
Als deze leeg ( lees = afwezig is ) is, wordt de regel verwijdert. ( unset( ) )
Je zou anders elke keer een regel hoger verwijderen.
Als deze niet niet leeg ( if(empty($verander_in)) ) is, wordt de inhoud ervan in de betreffende regel geplaatst.
( $aantal_regels[$regel] = $verander_in )

Alle gegevens worden weer netjes in een variabele gezet. ( $aantal_regels_nieuw = implode("", $aantal_regels) )
De file data wordt nu geopend om beschreven te worden en wordt tevens leeggemaakt. ( fopen("data", "w") )
Zo kan PHP alle nieuwe gegevens in één keer weer terugschrijven. ( fputs( ) )
En tot slot wordt de file weer gesloten. ( fclose )

Wijzigen van gegevens - Deel 1

Allereerst weer het script zelf.
Eerst zullen we een link moeten creeren met het regelnummer erin.

<?php

$gegevens         = file("data");

$aantal_regels     = count($gegevens);

for ($i = 0; $i < $aantal_regels ; $i++)  {
    list (
$naam, $adres, $pc, $woonplaats, $opmerking ) = explode ('|', $gegevens[$i] ) ;
        echo
trim($naam) . " " . trim($adres) . " " . trim($pc) . " " . trim($woonplaats) ;
        echo
"<a href=\"?op=wijzig&i=".$i."\">Wijzig</a> <br>" ;
}
    
?>

   [ Voorbeeld 8 => Het wijzigen van een bepaalde regel - Deel 1 ]   

De variabele $i wordt hiervoor gebruikt.

Wijzigen van gegevens - Deel 2

Het script.

<?php

$gegevens         = file("data");

list ( $naam, $straat, $pc, $woonplaats, $opmerking ) = explode ('|', $gegevens[$i] ) ;

echo "<FORM METHOD=\"post\" ACTION=\"?op=wijzig_def\">\n";
echo
"<I>Vul hier je naam in:</I>\n";
echo
"<INPUT TYPE=\"text\" NAME=\"naam\" SIZE=\"50\" MAXLENGTH=\"50\" VALUE=\"".$naam."\"><BR>\n";
echo
"<I>Vul hier je straat in:</I>\n";
echo
"<INPUT TYPE=\"text\" NAME=\"straat\" SIZE=\"50\" MAXLENGTH=\"50\" VALUE=\"".$straat."\"><BR>\n";
echo
"<I>Vul hier je postcode in:</I>\n";
echo
"<INPUT TYPE=\"text\" NAME=\"pc\" SIZE=\"50\" MAXLENGTH=\"50\" VALUE=\"".$pc."\"><BR>\n";
echo
"<I>Vul hier je woonplaats in:</I>\n";
echo
"<INPUT TYPE=\"text\" NAME=\"woonplaats\" SIZE=\"50\" MAXLENGTH=\"50\" VALUE=\"".$woonplaats."\"><BR>\n";
echo
"<I>Vul hier je opmerking in:</I>\n";
echo
"<INPUT TYPE=\"text\" NAME=\"opmerking\" SIZE=\"50\" MAXLENGTH=\"50\" VALUE=\"".$opmerking."\"><BR>\n";
echo
"<BR>\n";
echo
"<INPUT TYPE=\"hidden\" NAME=\"i\" VALUE=\"".$i."\">\n";
echo
"<INPUT TYPE=\"submit\" VALUE=\"Verzenden\">\n";
echo
"<INPUT TYPE=\"reset\" VALUE=\"Beginwaarden\">\n";
echo
"</FORM>\n";
    
?>

   [ Voorbeeld 9 => Het wijzigen van een bepaalde regel - Deel 2 ]   

De rij van de variabele $i wordt ingelezen.
Vervolgens in deel variabelen omgezet. explode ('|', $gegevens[$i] )
De deel variabelen $naam, $straat, $pc, $woonplaats, $opmerking worden dan in het formulier ter wijziging verwerkt.
Vervolgens wordt dit formulier dan weer verstuurd.

Wijzigen van gegevens - Deel 3

Het script.

<?php

$verander_in = $naam."|".$straat."|".$pc."|".$woonplaats."|".trim($opmerking)."\n";

wijzig_regel ( $i, $verander_in ) ;

?>

   [ Voorbeeld 10 => Het wijzigen van een bepaalde regel - Deel 3 ]   

De variabele $verander_in is nu gevuld met de waarden welke uit een wijziginsformulier komen.
Tevens wordt deze nu afgesloten met een regeleinde. ( "\n" )
De trim fumctie wordt gebruikt om geen onnodige spaties mee te nemen. trim($opmerking)

Voor verdere uitleg kan ik verwijzen naar het gedeelte van verwijder een regel, daar ik van dezelfde functie gebruik maak.

Het enige verschil is dat er nu wel wat in $verander_in staat.

Uploaden

Niet alleen maar uploaden?
Helaas niet.

Gebruik een FTP client om de files naar je webserver te brengen.
Voor de meeste files zal dit zonder meer gaan.
Er is een uitzondering.
De file data dient perse in ASCI formaat geupload te worden.
PHP kan anders niets met deze files doen.

Veranderen van rechten

Nog meer?
Helaas wel wel, maar deze stap is al eens in Sidestep 1 uitgelegd.
De file data dient de volgende rechten te hebben.
666 ( CHMOD ).
PHP mag anders niet schrijven naar deze files.

Standaard hebben ze alle files aleen lees rechten ( 644 ).
PHP heeft meestal niet meer nodig.
Het uitvoeren van de scripts wordt immers door de PHP-engine verzorgd.
Zet de rechten op de volgende wijze ( CHMOD 666 ) :

Owner Group World
X Read X Read X Read
X Write X Write X Write
  Execute   Execute   Execute


Alles zou nu moeten draaien

Op beide bersturings-systemen werken deze voorbeelden.
Het verschil zit er in dat je op een Windows machine geen rechten van de files hoeft aan te passen.

Uitbreidbaar

Het geheel is verre van compleet.
Een goede navigatie dien je hier zelf omheen te bouwen.
Ook al weet je niet precies hoe PHP met files omgaat, hiermee kun je een CMS bouwen.

Leef je uit zou ik zeggen.

Tot zover dit artikel.

Veel programmeer plezier ermee.

Tot ziens,

Ubel Jan van Wijhe
van Wijhe Consultancy

Tags: