terug naar    Techniek    Fundamentals

 

Het toevoegen van gegevens binnen een applicatie


Voor het toevoegen van gegevens binnen de applicatie Adressenlijst maken we gebruik van de drie vorige artikelen in de reeks fundamentals.
Tevens maken we gebruik van een PHP editor.

Dit artikel gaat ervan uit dat je de artikelen

gelezen hebt.


Het toevoegen van een adres.


 

Eerst weer het volledige script.

 

  Het volledige script  
<!--?php 
/*
 van Wijhe Consultancy
 oktober 2012
 nieuw.php
*/


//-----Het beschikbaar maken van de MySQL variabelen
 include ('config.php');

 
//-----Het beschikbaar maken van de functies
 include ('functies.php');

 
//-----Het netjes openen van een html file
 include('hoofd.php');

 
// formulier nog niet verstuurd
// laat het invul formulier hier zien
if ( $_SERVER['REQUEST_METHOD'] == "GET" )
{
 echo '<form action="'.$_SERVER['SCRIPT_NAME'].'" method="post">'."\n" ;
 
 echo ''."\n" ;
 echo ''."\n" ;
 echo ''."\n" ;
 echo ''."\n" ;
 echo ''."\n" ;
  echo ''."\n" ;
  echo ''."\n" ;
 echo ''."\n" ;
 echo ''."\n" ;
  echo ''."\n" ;
  echo ''."\n" ;
 echo ''."\n" ;
 echo ''."\n" ;
  echo ''."\n" ;
  echo ''."\n" ;
 echo ''."\n" ;
 echo ''."\n" ;
  echo ''."\n" ;
  echo ''."\n" ;
 echo ''."\n" ;
 echo ''."\n" ;
  echo ''."\n" ;
  echo ''."\n" ;
 echo ''."\n" ;
 echo ''."\n" ;
  echo ''."\n" ;
  echo ''."\n" ;
 echo ''."\n" ;
 echo ''."\n" ;
  echo ''."\n" ;
  echo ''."\n" ;
 echo ''."\n" ;
 echo ''."\n" ;
  echo ''."\n" ;
  echo ''."\n" ;
 echo ''."\n" ;
 echo ''."\n" ;
  echo ''."\n" ;
  echo ''."\n" ;
 echo ''."\n" ;
 echo ''."\n" ;
  echo ''."\n" ;
  echo ''."\n" ;
 echo ''."\n" ;
 echo ''."\n" ;
  echo ''."\n" ;
  echo ''."\n" ;
 echo ''."\n" ;
 echo ''."\n" ;
  echo ''."\n" ;
  echo ''."\n" ;
 echo ''."\n" ;
 echo ''."\n" ;

 echo ''."\n" ;
  echo ''."\n" ;
 echo ''."\n" ;

 echo '
* = verplicht
Dhr / Mw *<input size="50" maxlength="250" type="text" name="mv">
Voorletter(s) *<input size="50" maxlength="250" type="text" name="voorletters">
Voornaam *<input size="50" maxlength="250" type="text" name="voornaam">
Tussenvoegsel <input size="50" maxlength="250" type="text" name="tussenvoegsel">
Achternaam *<input size="50" maxlength="250" type="text" name="naam">
Adres / Huisnummer *<input size="35" maxlength="250" type="text" name="straat"> <input size="15" maxlength="250" type="text" name="nummer">
Postcode <input size="50" maxlength="250" type="text" name="pc">
Woonplaats *<input size="50" maxlength="250" type="text" name="woonplaats">
Telefoon<input size="50" maxlength="250" type="text" name="telefoon">
Geboorte datum ( dd-mm-yyyy )<input size="50" maxlength="250" type="text" name="geb_datum">
E-mail<input size="50" maxlength="250" type="text" name="e_mail">
Opmerkingen '."\n" ; echo '<textarea name="omschrijving" rows="4" cols="50"></textarea>'."\n" ; echo '
<input type="Submit" name="verstuurd" value="Voeg adres toe">'."\n" ; echo '<input type="Reset" value="Wis invoer">'."\n" ; echo '
'."\n" ; echo '</form>'."\n" ; //----- } else { //----- // maak foutenlijst array $foutenlijst = array(); $teller = 0; // valideer tekst velden if ( !strlen( $_POST['mv'] ) ) { $foutenlijst[$teller] = "Het volgende veld is niet ingevuld: Dhr Mw"; $teller++; } if ( !strlen($_POST['voorletters']) ) { $foutenlijst[$teller] = "Het volgende veld is niet ingevuld: Voorletter(s)"; $teller++; } if ( !strlen($_POST['voornaam']) ) { $foutenlijst[$teller] = "Het volgende veld is niet ingevuld: Voornaam"; $teller++; } if ( !strlen($_POST['naam']) ) { $foutenlijst[$teller] = "Het volgende veld is niet ingevuld: Achternaam"; $teller++; } if ( !strlen($_POST['straat']) ) { $foutenlijst[$teller] = "Het volgende veld is niet ingevuld: Adres"; $teller++; } if ( !strlen($_POST['nummer']) ) { $foutenlijst[$teller] = "Het volgende veld is niet ingevuld: Huisnummer"; $teller++; } if ( !strlen($_POST['woonplaats']) ) { $foutenlijst[$teller] = "Het volgende veld is niet ingevuld: Woonplaats"; $teller++; } if ( !strlen($_POST['geb_datum']) ) { $geb_datum = "1980-01-01" ; } else { $geb_datum = format_datum_1($_POST['geb_datum']) ; } // fouten controle. // en zo niet. if ( sizeof($foutenlijst) == '0' ) { try { // Verzorg connectie naar MySQL $db_n = new PDO('mysql:host=localhost;dbname='.$database, $gebruiker, $wachtwoord); $db_n->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); // Het opzetten en uitvoeren van de vraagstelling $st_n = $db_n->prepare("INSERT INTO ".$tabel." ( mv, voorletters, voornaam, tussenvoegsel, naam, straat, nummer, pc, woonplaats, telefoon, email, geb_datum, opm ) VALUES( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? ) ") ; $st_n->execute( array( $_POST['mv'], $_POST['voorletters'], $_POST['voornaam'], $_POST['tussenvoegsel'], $_POST['naam'], $_POST['straat'], $_POST['nummer'], $_POST['pc'], $_POST['woonplaats'], $_POST['telefoon'], $_POST['email'], $geb_datum, $_POST['opm'] ) ) ; //-----redirect dmv javascript echo '[removed] '."\n" ; echo '<!-- '."\n" ; echo ' [removed] = "index.php" '."\n" ; echo '//--> '."\n" ; echo '[removed] '."\n" ; //-----/redirect dmv javascript } catch(PDOException $e) { echo '
'."\n" ; 
   echo '
'; echo ''."\n" ; echo ''."\n" ; echo ''."\n" ; echo '
Regel: '.$e->getLine().'
Bestand: '.$e->getFile().'
Foutmelding: '.$e->getMessage().'
'."\n" ; 
   echo '
'."\n" ; } } else { // er zijn fouten gevonden. // laat deze als lijst zien. echo 'De volgende fouten traden op :'."\n" ; echo '
    '."\n" ; for ( $x = '0'; $x < sizeof>'.$foutenlijst[$x].''."\n" ; } echo '
'."\n" ; } } //-----/ //-----Weergeven van de onderste balk - einde_begin include("einde_begin.php"); //-----/

De uitleg



Het beschikbaar maken van de omgeving


De eerste regel zorgt ervoor dat er een connectie komt met de database.
De derde regel zorgt ervoor dat de begin lay-out van het formulier geopend wordt.

Al de deze drie files taan in de root van de applicatie.
Zie helemaal onderaan dit artikel voor de download link.

  Beschikbaar maken  
//-----Het beschikbaar maken van de MySQL variabelen
    include ('config.php');
 
     
//-----Het beschikbaar maken van de functies
    include ('functies.php');
 
     
//-----Het netjes openen van een html file
    include('hoofd.php');

Het formulier


Het formulier is voor zich sprekend.

Het begin is via de request_method.
Standaard staat deze op "GET".
Pas als het formulier verstuurd wordt, krijgt deze de "POST" waarde.

 

  Naam onderdeel  
// formulier nog niet verstuurd
// laat het invul formulier hier zien
if ( $_SERVER['REQUEST_METHOD'] == "GET" )
{
 // Actie bij GET
}
else
{
 // Actie bij POST
}

 


Het begin van de fouten afhandelings routine


 

  foutenlijst begin  
 //----- maak foutenlijst array
 $foutenlijst  = array();
 $teller   = 0;

 
 // valideer tekst velden
 if ( !strlen( $_POST['mv'] ) ) 
 { 
  $foutenlijst[$teller] = "Het volgende veld is niet ingevuld: Dhr Mw"; 
  $teller++; 
 }

 

Er wordt eerst een lege array gemaakt genaamd $foutenlijst.
Deze kan dan als dat nodig is, gevuld worden met individuele fouten.

Er wordt daarna een variabele $teller op de begin waarde 0 gezet.

 

Het valideren kan dan beginnen.
In dit geval wordt er alleen gekeken of er een waarde is ingevuld.
Zo niet wordt de array $foutenlijst met een getal en een waarde gevuld.
Zo kun je voor elk veld zijn eigen validatie regel opstellen.
Een tekst veld heeft immers andere regels dan een e-mail veld of een datum veld.
Uiteraard kun je dit ook via javascript regelen.

Ik zou dit laatste zeker doen.
Alleen niet alleen.
De grootste fout die iemand kan maken, is dat de invoer die vanuit het Internet komt, vertrouwd wordt.

Kijk je naar het totale script, zul je zien dat er geen opschoning van ingevoerde data plaats vindt.
Voor dit artikel heb ik gekozen dat hier niet te doen.
Het zou de uitleg onnodig complex maken.
In een toekomstig artikel kom ik hier nog op terug.

 


Een voorbeeld van een functie.


 

Als voorbeeld laat ik hier het afhandelen van een datum zien.
de datum komen namenlijk altijd in een ander formaat in de database dan ze op een website leesbaar zijn.
De database verwacht 2012-12-07
En de website verwacht 07-12-2012
We zullen dus van leesbaar naar niet leesbaar moeten gaan.

 

  Een voorbeeld van een functie  
 if ( !strlen($_POST['geb_datum']) ) 
 { 
  $geb_datum = "1980-01-01" ;
 }
 else
 {
  $geb_datum = format_datum_1($_POST['geb_datum']) ;
 }


 

eerst wordt er gekeken of er een invoer is, zo nee dan is de datum 000-00-00
Is er wel een invoer, dient deze omgezet te worden.
Hier is de functie

 format_datum_1()  

voor.
De functie staat in de file

 functies.php 

welke in het begin van het script aangeroepen werd met de

 include() 

functie.
.

 


Het afhandelen van de fouten routine


 

Hiervoor dient het volgende stuk script.

 

  foutenlijst afhandeling  
    // fouten controle.
    // en zo niet.
    if (sizeof($foutenlijst) == 0)
    {

        //     de daadwerkelijk toevoeg routine

    }
    else
    {        
        // er zijn fouten gevonden.
        // laat deze als lijst zien.
        echo 'De volgende fouten traden op :'."\n";
        
  echo '
    '."\n"; for ($x=0; $x'.$foutenlijst[$x].' '."\n"; } echo '
'."\n";
        
  echo ''."\n";
    } 

 

Als er fout optreedt, weet je dat de array $foutenlijst gevuld is.
Dus als de array aanwezig is, ( lees niet leeg is ), zijn er fouten.
De eerste regel kijkt hier naar.
Deze bepaalt naar welke lus er door gestuurd wordt.
Het daadwerkelijk toevoegen of het laten zien van fouten.

Is er een fout, wordt de gehele array $foutenlijst uitgelezen.
Aangezien er alleen maar fouten in kunnen staan, mag alles getoond worden.

Het is trouwens wel zo vriendelijk om hier een link in te bouwen om terug te keren in het script.
Je geeft iemand zowel de gelegenheid een formulier te verbeteren.

 


Try Catch


Het werkende gedeelte.

  try - catch  
try
  {
   // Verzorg connectie naar MySQL
   $db_n = new PDO('mysql:host=localhost;dbname='.$database, $gebruiker, $wachtwoord);
   
   $db_n->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

   
   // Het opzetten en uitvoeren van de vraagstelling        
   $st_n = $db_n->prepare("INSERT INTO ".$tabel."
            ( mv,
          voorletters,
          voornaam,
          tussenvoegsel,
          naam,
          straat,
          nummer,
          pc,
          woonplaats,
          telefoon,
          email,
          geb_datum,
          opm )
         VALUES( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? ) 
         ") ;
          
   $st_n->execute( array( $_POST['mv'], 
         $_POST['voorletters'], 
         $_POST['voornaam'], 
         $_POST['tussenvoegsel'], 
         $_POST['naam'], 
         $_POST['straat'], 
         $_POST['nummer'], 
         $_POST['pc'], 
         $_POST['woonplaats'], 
         $_POST['telefoon'], 
         $_POST['email'],           
         $geb_datum, 
         $_POST['opm'] )  
        ) ;
     
     
   //-----redirect dmv javascript
   echo '                           '."\n" ;
   //-----/redirect dmv javascript 
  }
  catch(PDOException $e)
  {
   echo '
'."\n" ; 
   echo '
'; echo ''."\n" ; echo ''."\n" ; echo ''."\n" ; echo '
Regel: '.$e->getLine().'
Bestand: '.$e->getFile().'
Foutmelding: '.$e->getMessage().'
'."\n" ; 
   echo '
'."\n" ; }

Voor een groot gedeelte is dit in het vorige artikel al uitgelegd.
(Het begin van een applicatie)

 

Het enige wat hier bij komt, is het vormen van de query.

Deze is goed leesbaar.

 

De prepared statements bieden je de mogelijkheid tot het creeren van queries die veiliger zijn, waarvan de performance beter is en die relatief eenvoudig te noteren zijn.
Dit veiliger slaat op het feit dat er PHP via de bindParam methode automatisch variabelen beveiligd worden.

MySQL exploits kunnen zo niet gebeuren.
Omdat het queryplan wordt opgesteld voordat er data wordt doorgegeven, is de query ook niet meer gevoelig voor "SQL injection".
De structuur van de query wordt vastgelegd tijdens het prepareren van het statement en kan daarna niet meer veranderen.
De data waarmee het statement later wordt aangeroepen kan dus de structuur van de query niet meer veranderen, het wordt simpelweg als data behandeld en niet als SQL statements.

Er kan enige verwarring optreden bij deze zin

$st_n = $db_n->prepare("INSERT INTO ".$tabel."

Er komt ineens de variabele

 $st_n 

om de hoek kijken.
De basis is echter de array

 $db_n 

Deze is nodig om een connectie met MySQL te maken en te onderhouden.
De array

 $st_n  

gebruik je om de queries verder af te handelen

 


De volgende artikelen


De volgende artikelen zullen gaan over :

  • Het veranderen van gegevens
  • Het zoeken van gegevens
  • En het verwijderen van gegevens

Hierbij wordt gebruik gemaakt van bovenstaande files.

Deze zijn trouwens in de DOWNLOAD sectie te vinden
onder de naam adressen_pdo.zip.

Veel programmeer plezier ermee.


Tot ziens,

Ubel Jan van Wijhe
van Wijhe Consultancy

 

Ook van VanWijhe.Web

Responsiveframework.nl