Het toevoegen van gegevens

Het toevoegen van gegevens.

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.




logo

Dit artikel gaat ervan uit dat je de artikelen

gelezen hebt.

Het toevoegen van een adres.


Eerst weer het volledige script.



  Het gehele script   <?php
/*
    Aangepast door van Wijhe Consultancy
    augustus 2008
*/

// 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" )
    {
?>
<table cellspacing="5" cellpadding="5" border=0>
<form action="<?php echo $_SERVER["SCRIPT_NAME"]; ?>" method="POST">
<tr>
<td colspan=2><b><font color=red>*</font><font size="-1"> = verplicht</font></b></td>
</tr>
<tr>
    <td valign="top">Dhr / Mw <font color=red>*</font></font></b></td>
    <td><input size="50" maxlength="250" type="text" name="mv"></td>
</tr>
<tr>
    <td valign="top">Voorletter(s) <font color=red>*</font></b></td>
    <td><input size="50" maxlength="250" type="text" name="voorletters"></td>
</tr>
<tr>
    <td valign="top">Voornaam <font color=red>*</font></td>
    <td><input size="50" maxlength="250" type="text" name="voornaam"></td>
</tr>
<tr>
    <td valign="top">Tussenvoegsel </td>
    <td><input size="50" maxlength="250" type="text" name="tussenvoegsel"></td>
</tr>
<tr>
    <td valign="top">Achternaam <font color=red>*</font></td>
    <td><input size="50" maxlength="250" type="text" name="naam"></td>
</tr>
<tr>
    <td valign="top">Adres  / Huisnummer<font color=red>*</font></td>
    <td><input size="35" maxlength="250" type="text" name="straat"> <input size="15" maxlength="250" type="text" name="nummer"></td>
</tr>
<tr>
    <td valign="top">Postcode </td>
    <td><input size="50" maxlength="250" type="text" name="pc"></td>
</tr>
<tr>
    <td valign="top">Woonplaats <font color=red>*</font></td>
    <td><input size="50" maxlength="250" type="text" name="woonplaats"></td>
</tr>
<tr>
    <td valign="top">Telefoon</td>
    <td><input size="50" maxlength="250" type="text" name="telefoon"></td>
</tr>
<tr>
    <td valign="top">Geboorte datum ( yyyy-mm-dd )</td>
    <td><input size="50" maxlength="250" type="text" name="geb_datum"></td>
</tr>
<tr>
    <td valign="top">E-mail</td>
    <td><input size="50" maxlength="250" type="text" name="e_mail"></td>
</tr>
<tr>
    <td colspan=2><input type="Submit" name="verstuurd" value="Voeg adres toe">
         &nbsp;&nbsp;&nbsp; <input type="Reset" value="Wis invoer">
        </td>
</tr>
</form>
</table>
<?php

}
else
{
    
    
// maak foutenlijst array
    
$foutenlijst = array();
    
$teller 0;

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

    if ( !
strlen($_POST["voorletters"]) ) 
    { 
        
$foutenlijst[$teller] = "Het volgende veld is niet ingevuld: <b>Voorletter(s)</b>"
        
$teller++; 
    }

    if ( !
strlen($_POST["voornaam"]) ) 
    { 
        
$foutenlijst[$teller] = "Het volgende veld is niet ingevuld: <b>Voornaam</b>"
        
$teller++; 
    }
        
    if ( !
strlen($_POST["naam"]) ) 
    { 
        
$foutenlijst[$teller] = "Het volgende veld is niet ingevuld: <b>Achternaam</b>"
        
$teller++; 
    }
        
    if ( !
strlen($_POST["straat"]) ) 
    { 
        
$foutenlijst[$teller] = "Het volgende veld is niet ingevuld: <b>Adres</b>"
        
$teller++; 
    }

    if ( !
strlen($_POST["nummer"]) ) 
    { 
        
$foutenlijst[$teller] = "Het volgende veld is niet ingevuld: <b>Nhuisnummer</b>"
        
$teller++; 
    }

    if ( !
strlen($_POST["woonplaats"]) )    
    { 
        
$foutenlijst[$teller] = "Het volgende veld is niet ingevuld: <b>Woonplaats</b>"
        
$teller++; 
    }

    if ( !
strlen($_POST["geb_datum"]) )    
    { 
        
$geb_datum "0000-00-00" ;
    }
    else
    {
        
$geb_datum $_POST["geb_datum"] ;
    }    
    
    
// fouten controle.
    // en zoniet.
    
if (sizeof($foutenlijst) == 0)
    {
        try
        {  
            
// maakt MySQL variabelen beschikbaar.
            
include("config.php");

            
// Verzorg connectie naar MySQL
            // en initialiseert beginwaarden PDO errors
            //
            
$db_n = new PDO('mysql:host=localhost;dbname='.$database$gebruiker$wachtwoord);
            
$db_n->setAttribute(PDO::ATTR_ERRMODEPDO::ERRMODE_EXCEPTION);

            
// Het opzetten 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(:mv, :vl, :tv, :vn, :naam, :straat, :nr, :pc, :plaats, :telf, :email, :gd, 'test')  "
) ;

            
// Het toekennen en beveiligen van de variabelen via bindParam                              
            //
            
$st_n->bindParam(":mv",         $_POST["mv"]);
            
$st_n->bindParam(":vl",         $_POST["voorletters"]);
            
$st_n->bindParam(":tv",         $_POST["tussenvoegsel"]);            
            
$st_n->bindParam(":vn",         $_POST["voornaam"]);            
            
$st_n->bindParam(":naam",         $_POST["naam"]);            
            
$st_n->bindParam(":straat",     $_POST["straat"]);            
            
$st_n->bindParam(":nr",         $_POST["nummer"]);            
            
$st_n->bindParam(":pc",         $_POST["pc"]);
            
$st_n->bindParam(":plaats",     $_POST["woonplaats"]);            
            
$st_n->bindParam(":telf",         $_POST["telefoon"]);            
            
$st_n->bindParam(":email",         $_POST["e_mail"]);            
            
$st_n->bindParam(":gd",         $geb_datum);            

            
// Het uitvoeren van de vraagstelling            
            //
            
$st_n->execute() ;     

            
// laat resultaat zien en verdere mogelijkheden.
            //
            
echo '<div align="center">'."\n";
            echo 
'<br />'."\n";
            echo 
'Het toevoegen was succesvol.';
            echo 
'<br />'."\n";
            echo 
'<br />'."\n";            
            echo 
'<a href=index.php>Klik hier om terug naar het hoofd menu te gaan.</a>'."\n";
            echo 
'<br />'."\n";
            echo 
'</div>'."\n";
            
//-----/
        
}
        catch (
PDOException $e)
        {
            
//-----
            
echo '<pre>'."\n";
            echo 
'<table>'."\n";
            echo 
'<tr><td> &nbsp; File: &nbsp; </td><td> &nbsp; '.$e->getMessage().' </td></tr>'."\n";
            echo 
'</table>'."\n";
            echo 
'</pre>'."\n";
            
//-----/
        

    }
    else
    {        
        
// er zijn fouten gevonden.
        // laat deze als lijst zien.
        
echo '<font size=-1>De volgende fouten traden op : <br />'."\n";
        echo 
'<ul>'."\n";
        for (
$x=0$x<sizeof($foutenlijst); $x++)
        {
            echo 
'<li>'.$foutenlijst[$x].'</li>'."\n";
        }
        echo 
'</ul>'."\n";
        echo 
'</font>'."\n";
        
//-----/
    
}
}

// Weergeven van de onderste balk
//
include("einde.2.php");

?>



De uitleg

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.



  request_method   <?php


// formulier nog niet verstuurd
// laat het invul formulier hier zien
if ($_SERVER["REQUEST_METHOD"] == "GET" )
    {
    
    
?>    



Het begin van de fouten afhandelings routine



  foutenlijst begin   <?php


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

    
// valideer tekst velden
    
if ( !strlen$_POST["mv"] ) ) 
    { 
        
$foutenlijst[$teller] = "Het volgende veld is niet ingevuld: <b>Dhr Mw</b>"
        
$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 begint.
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 het er zeker bij 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.


Het afhandelen van de fouten routine


Hiervoor dient het volgende stuk script.


  foutenlijst afhandeling   <?php

    
// fouten controle.
    // en zoniet.
    
if (sizeof($foutenlijst) == 0)
    {
        
/*
                de daadwerkelijk toevoeg routine
        */

    
}
    else
    {        
        
// er zijn fouten gevonden.
        // laat deze als lijst zien.
        
echo '<font size=-1>De volgende fouten traden op : <br />'."\n";
        echo 
'<ul>'."\n";
        for (
$x=0$x<sizeof($foutenlijst); $x++)
        {
            echo 
'<li>'.$foutenlijst[$x].'</li>'."\n";
        }
        echo 
'</ul>'."\n";
        echo 
'</font>'."\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  
<?php

        
try
        {  
            
// maakt MySQL variabelen beschikbaar.
            
include("config.php");

            
// Verzorg connectie naar MySQL
            // en initialiseert beginwaarden PDO errors
            //
            
$db_n = new PDO('mysql:host=localhost;dbname='.$database$gebruiker$wachtwoord);
            
$db_n->setAttribute(PDO::ATTR_ERRMODEPDO::ERRMODE_EXCEPTION);

            
// Het opzetten 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(:mv, :vl, :tv, :vn, :naam, :straat, :nr, :pc, :plaats, :telf, :email, :gd, 'test')  "
) ;

            
// Het toekennen en beveiligen van de variabelen via bindParam                              
            //
            
$st_n->bindParam(":mv",         $_POST["mv"]);
            
$st_n->bindParam(":vl",         $_POST["voorletters"]);
            
$st_n->bindParam(":tv",         $_POST["tussenvoegsel"]);            
            
$st_n->bindParam(":vn",         $_POST["voornaam"]);            
            
$st_n->bindParam(":naam",         $_POST["naam"]);            
            
$st_n->bindParam(":straat",     $_POST["straat"]);            
            
$st_n->bindParam(":nr",         $_POST["nummer"]);            
            
$st_n->bindParam(":pc",         $_POST["pc"]);
            
$st_n->bindParam(":plaats",     $_POST["woonplaats"]);            
            
$st_n->bindParam(":telf",         $_POST["telefoon"]);            
            
$st_n->bindParam(":email",         $_POST["e_mail"]);            
            
$st_n->bindParam(":gd",         $geb_datum);            

            
// Het uitvoeren van de vraagstelling            
            //
            
$st_n->execute() ;     

            
// laat resultaat zien en verdere mogelijkheden.
            //
            
echo '<div align="center">'."\n";
            echo 
'<br />'."\n";
            echo 
'Het toevoegen was succesvol.';
            echo 
'<br />'."\n";
            echo 
'<br />'."\n";            
            echo 
'<a href=index.php>Klik hier om terug naar het hoofd menu te gaan.</a>'."\n";
            echo 
'<br />'."\n";
            echo 
'</div>'."\n";
            
//-----/
        
}
        catch (
PDOException $e)
        {
            
//-----
            
echo '<pre>'."\n";
            echo 
'<table>'."\n";
            echo 
'<tr><td> &nbsp; File: &nbsp; </td><td> &nbsp; '.$e->getMessage().' </td></tr>'."\n";
            echo 
'</table>'."\n";
            echo 
'</pre>'."\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 beveilgd 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.

Bron: http://wiki.phpfreakz.nl/PreparedStatements


Elke variable wordt dus gebonden via het volgfende statement.

$st_n->bindParam(":mv", $_POST["mv"]);

De variabele $_POST["mv"] wordt als volledige variabele aan ":mv" doorgegeven.
En zo voor alle variabelen van het formulier

Hierna wordt het script uitgevoerd door:
$st_n->execute()


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, sub-map MySQL, te vinden onder de naam naw_voegtoe.zip op
naw_voegtoe.zip

Veel programmeer plezier ermee.


Tot ziens,

Ubel Jan van Wijhe
van Wijhe Consultancy