Na checken met !empty antwoorden laten staan

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Senior, Medior and Junior SAP HANA Developer

Vacature details Vakgebied: Software/IT Opleiding: Medior Werklocatie: Veldhoven Vacature ID: 12696 Introductie Our client is the world's leading provider of lithography systems for the semiconductor industry, manufacturing complex machines that are critical to the production of integrated circuits or chips. Our purpose is “unlocking the potential of people and society by pushing technology to new limits”. We do this guided by the principles “Challenge”, “Collaborate” and “Care”. Wat verwachten we van jou? SAP Certified Application Associate - SAP HANA Cloud Modeling (training and/or certification) Bachelor degree or higher Excellent understanding of SAP HANA (2.0 / Cloud), Data Modelling and writing

Bekijk vacature »

Max Boer

Max Boer

10/12/2018 10:11:23
Quote Anchor link
Hallo allemaal,

Ik ben bezig met een site met meerdere invulvelden.
Nu gebruik ik !empty om te kijken of er lege posts zijn.
Dit ziet er zo uit:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
<?php
if(!empty($_POST['onderwerp'])){
  $sql = "INSERT INTO ptas(vak_afkorting,Periode,Klas,Schooljaar,Toets,Onderwerp,Duur,Weging_rapport,Weging_se,Toetsvorm,Tijdsverlenging,Herkansing,Gebruikte_methode,Inleverdatum,Toelichting,Methode_toevoegen)
  VALUES('$afkorting','$periode','$klas','$schooljaar','$toets','$onderwerp','$duur','$rapport','$schoolexamen','$vorm','$tijdsverlenging','$herkansing','$methode','$inleverdatum','$toelichting','$methode_toevoegen')"
;
  mysqli_query($mysql,$sql)
  or die("De insertquery op de database is mislukt!".mysqli_error($mysql)." $sql");
  echo"Het pta is ingevoerd!";
  }

  else{
    echo"1 of meerdere velden zijn niet ingevuld!";
  }

?>


Als het onderwerp niet ingevuld wordt, krijg je de melding "1 of meerdere velden zijn niet ingevuld!".
Maar als dit gebeurt, worden alle andere ingevulde velden weer leeggemaakt en moet je alles weer opnieuw invullen.

Weet iemand hoe ik ervoor kan zorgen dat de oude waardes blijven staan en dat ik alleen het onderwerp moet invullen?
Alvast bedankt
 
PHP hulp

PHP hulp

30/12/2024 19:49:25
 
- Ariën  -
Beheerder

- Ariën -

10/12/2018 10:55:20
Quote Anchor link
Zolang er enkel alleen nog maar geen POST-request heeft plaatsgevonden, kan je die $_POST-waardes nog steeds echo'en in de value-attributen van je velden. Controleer wel met isset() of ze bestaan.


Ik neem wel aan dat je alle waardes netjes escapes met mysqli_real_escape_string().
Gewijzigd op 10/12/2018 10:55:53 door - Ariën -
 
Max Boer

Max Boer

10/12/2018 11:27:06
Quote Anchor link
Dit is mijn complete code:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
<?php
session_start();
include "connect.php";
if(isset($_SESSION['user'])){
  if(!in_array($_SESSION['user']['rol'],array("Sectievoorzitter","Afdelingsleider","Examensecretariaat") ) ){
    exit();
  }
}
else{
  exit();
}

?>

<head>
  <link rel="stylesheet" type="text/css" href="menu.css">
  <link rel="stylesheet" type="text/css" href="select.css">
</head>

<div class="navbar">
  <a href="homepage.php">Home</a>
  <a href="logout.php">Uitloggen</a>
</div>

<html>
<title>Pta invoeren</title>
<h1>Hier kunt u een nieuw pta invoeren</h1>
</html>
<?php

if(isset($_POST["verzend"])){

  $afkorting = mysqli_real_escape_string($mysql,$_POST['afkorting']);
  $periode = mysqli_real_escape_string($mysql,$_POST['periode']);
  $klas = mysqli_real_escape_string($mysql,$_POST['klas']);
  $schooljaar = mysqli_real_escape_string($mysql,$_POST['schooljaar']);
  $toets = mysqli_real_escape_string($mysql,$_POST['toets']);
  $vorm = mysqli_real_escape_string($mysql,$_POST['vorm']);
  $herkansing = mysqli_real_escape_string($mysql,$_POST['herkansing']);
  $onderwerp = mysqli_real_escape_string($mysql,$_POST['onderwerp']);
  $duur = mysqli_real_escape_string($mysql,$_POST['duur']);
  $rapport = mysqli_real_escape_string($mysql,$_POST['rapport']);
  $schoolexamen = mysqli_real_escape_string($mysql,$_POST['schoolexamen']);
  $tijdsverlenging = mysqli_real_escape_string($mysql,$_POST['tijdsverlenging']);
  $methode = mysqli_real_escape_string($mysql,$_POST['methode']);
  $inleverdatum = mysqli_real_escape_string($mysql,$_POST['inleverdatum']);
  $toelichting = mysqli_real_escape_string($mysql,$_POST['toelichting']);
  $methode_toevoegen = mysqli_real_escape_string($mysql,$_POST['methode_toevoegen']);

  if(!empty($_POST['onderwerp'])){
  $sql = "INSERT INTO ptas(vak_afkorting,Periode,Klas,Schooljaar,Toets,Onderwerp,Duur,Weging_rapport,Weging_se,Toetsvorm,Tijdsverlenging,Herkansing,Gebruikte_methode,Inleverdatum,Toelichting,Methode_toevoegen)
  VALUES('$afkorting','$periode','$klas','$schooljaar','$toets','$onderwerp','$duur','$rapport','$schoolexamen','$vorm','$tijdsverlenging','$herkansing','$methode','$inleverdatum','$toelichting','$methode_toevoegen')"
;
  mysqli_query($mysql,$sql)
  or die("De insertquery op de database is mislukt!".mysqli_error($mysql)." $sql");
  echo"Het pta is ingevoerd!";
  }

  else{
    echo"1 of meerdere velden zijn niet ingevuld!";
  }
}


?>


<html>
  <form method="post">
  <div class="invoeren">
  <?php
  
  if($_SESSION['user']['rol'] == "Sectievoorzitter"){
    $id=$_SESSION['user']['id'];
    ?>

    Vak:<select name="afkorting">
    <?php
    $resultaat
= mysqli_query($mysql,"SELECT vak FROM gebruikers WHERE id='$id'") or die("De query op de database is mislukt!");
    while ($rij = mysqli_fetch_assoc($resultaat)){
        echo "<option value=\"{$rij['vak']}\">{$rij['vak']}</option>";
    }

      ?>

    </select><br>
    <?php
  }
  else{
    ?>


    Vak:<select name="afkorting">
    <?php
    $resultaat
= mysqli_query($mysql,"SELECT * FROM vakken") or die("De query op de database is mislukt!");
    while ($rij = mysqli_fetch_assoc($resultaat)){
        echo "<option value=\"{$rij['afkorting']}\">{$rij['naam']}</option>";
    }

    ?>

    </select><br>
    <?php
  }
    ?>

    
    Periode/toetsweek:<select name="periode"   id="styledSelect" class="select">
    <?php
    $resultaat1
= mysqli_query($mysql,"SELECT * FROM periode") or die("De query op de database is mislukt!");
    while ($rij = mysqli_fetch_assoc($resultaat1)){
      echo "<option value=\"{$rij['Naam']}\">{$rij['Naam']}</option>";
    }

    ?>

    </select><br>

    Klas:
    <select name="klas">
    <?php
    $resultaat2
= mysqli_query($mysql,"SELECT * FROM klassen") or die("De query op de database is mislukt!");
    while ($rij = mysqli_fetch_assoc($resultaat2)){
      echo "<option value=\"{$rij['Klas']}\">{$rij['Klas']}</option>";
    }

    ?>

    </select><br>

    Schooljaar:
    <select name="schooljaar">
    <?php
    $resultaat3
= mysqli_query($mysql,"SELECT * FROM schooljaar") or die("De query op de database is mislukt!");
    while ($rij = mysqli_fetch_assoc($resultaat3)){
      echo "<option value=\"{$rij['Jaar']}\">{$rij['Jaar']}</option>";
    }

    ?>
    
    </select><br>
    
    Toets:
    <select name="toets">
    <?php
    $resultaat4
= mysqli_query($mysql,"SELECT * FROM toets") or die("De query op de database is mislukt!");
    while ($rij = mysqli_fetch_assoc($resultaat4)){
      echo "<option value=\"{$rij['Toets']}\">{$rij['Toets']}</option>";
    }

    ?>
    
    </select><br>

   Onderwerp:
    <input type="text" name="onderwerp">
<br>

    Duur:
    <input type="text" name="duur">
    
<br>

    Weging rapport:
    <input type="text" name="rapport">
    <br>
    
    Weging SE:
    <input type="text" name="schoolexamen">
    <br>

    Vorm:
    <select name="vorm">
    <?php
    $resultaat5
= mysqli_query($mysql,"SELECT * FROM vorm ORDER BY Vorm DESC") or die("De query op de database is mislukt!");
    while ($rij = mysqli_fetch_assoc($resultaat5)){
      echo "<option value=\"{$rij['Vorm']}\">{$rij['Vorm']}</option>";
    }

    ?>
    
    </select><br>    

    
    Tijdsverlenging:
    <input type="text" name="tijdsverlenging">  
    <br>  

    Herkansing:
    <select name="herkansing">
    <?php
    $resultaat6
= mysqli_query($mysql,"SELECT * FROM herkansing") or die("De query op de database is mislukt!");
    while ($rij = mysqli_fetch_assoc($resultaat6)){
      echo "<option value=\"{$rij['Herkansing']}\">{$rij['Herkansing']}</option>";
    }

    ?>
    
    </select><br>

    Gebruikte methode:
    <input type="text" name="methode">
    <br>
    
    Inleverdatum:
    <input type="date" name="inleverdatum">
    <br>

    Toelichting:
    <input type="text" name="toelichting">
    <br>
    
    Methode toevoegen:
    <input type="text" name="methode_toevoegen">
    <br>
    </div>
    
    <input type="submit" value="Invoeren" name="verzend" />
  </form>
</html>


Wordt het dan steeds
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
<input type="text" name="methode" value="$methode">
 
Ben van Velzen

Ben van Velzen

10/12/2018 12:15:06
Quote Anchor link
Nee. Waarden die escaped zijn voor databasegebruik zijn alleen voor de database bruikbaar. Die kunnen niet in het formulier gezet worden. Hiervoor is andere escaping nodig met htmlspecialchars. Htmlspecialchars is weer niet geschikt voor gebruik in de database, dus je zult beide apart moeten toepassen. Zie daar waarom het zo snel zo pijnlijk wordt om zinloos variabelen te maken.
Gewijzigd op 10/12/2018 12:16:05 door Ben van Velzen
 
Jan te Pas

Jan te Pas

10/12/2018 12:34:35
Quote Anchor link
Het kan wel, maar dan moet je de processen even van elkaar scheiden.

Je zou het volgende kunnen overwegen.
Test eerst of de ingevoerde inhoud correct is
1 Niet correct? Terug naar formulier, informatie is dat nog voorhanden
2 Wel correct? Nu pas gaan escapen en wegschrijven naar de database.
 
Thomas van den Heuvel

Thomas van den Heuvel

10/12/2018 13:57:57
Quote Anchor link
Ay caramba.

Okay waar te beginnen. Er worden hier zoveel zaken met voeten getreden...

Om allereerst antwoord te geven op je vraag: het is inderdaad mogelijk om de POST-waarden terug te plaatsen in het formulier, maar dat is alleen mogelijk als je het weergeven van het formulier combineert met het verwerken van het formulier, en dat is uit oogpunt van nette en overzichtelijke code schrijven niet zo fantastisch. Idealiter scheid je deze twee stappen, want het zijn echt twee verschillende acties: het een houdt zich bezig met het weergeven van een formulier in een HTML-document, en het ander betreft het verwerken van gePOSTe data.

Dan over dit HTML-document. Dit moet een kloppend HTML-document zijn. De <html>-tags staan wel op hele vreemde plaatsen en de <body>-tags ontbreken in het geheel. Indien een HTML-document niet kloppend is is er vervolgens geen enkele garantie dat de rest van je HTML werkt zoals je zou verwachten. Zorg dus dat je HTML op orde is/komt.

Een veelgebruikte -en nette- manier voor formulier-verwerking is het POST/redirect/GET patroon. Concreet wijst de POST-action naar een aparte URL die het formulier verwerkt en daarna doorstuurt (indien de validatie en verwerking succesvol was) of terugstuurt (indien de validatie niet slaagde). Hierbij twee aandachtspunten:
1. hier zul je dus over meerdere pagina's informatie moeten onthouden zodat je deze weer terug kunt plaatsen in het formulier indien er fouten waren;
2. er wordt gesproken over validatie: het is dus zaak om EERST al je DATA te inspecteren alvorens je deze probeert weg te schrijven naar je database; indien de DATA klopt kan deze de database in, indien de DATA niet klopt zou je teruggestuurd moeten worden naar het formulier met een toelichting wat hier niet aan klopt zodat deze informatie gecorrigeerd kan worden

En hoe zorg je er dan voor dat informatie wordt onthouden over meerdere pagina's? Stop het in $_SESSION, bij voorkeur in een sub-array voor formulierdata, bijvoorbeeld: $_SESSION['forms']['pta'] ofzo. Hierbinnen zou je ook nog onderscheid kunnen maken tussen de feitelijk ingevoerde data en bijbehorende foutmeldingen (respectievelijk subarrays 'data' en 'errors' ofzo). Vervolgens flag je de URL waarin het formulier wordt weergegeven, bijvoorbeeld met ?errors=1, wat vervolgens een trigger is om een mededeling te doen dat er iets foutging en dat er data in je sessie zit waarmee je het formulier initialiseert met eerder ingevoerde data.

Tot slot: het is altijd zaak om output te escapen. Hoe je dit doet, hangt van de context af.
In HTML gebruik je htmlspecialchars(), en in SQL gebruik je real_escape_string() in combinatie met quotes, want het een is niet veilig zonder het ander.

En als je zoiets hebt van "poeh dat is wel erg veel moeite voor iets relatief simpels" dan heb je misschien gelijk, maar het voegt ook een heleboel toe:
- gebruikersgemak en gebruiksvriendelijke interfaces
- geen troep in je database
en dat betaalt zich binnen een mum van tijd weer terug.

Idealiter voer je dit truukje niet elke keer opnieuw uit als je een formulier moet bakken maar schrijf je eenmalig de bouwstenen voor het creëren van pagina's en het bouwen van formulieren zodat je niet elke keer het wiel opnieuw hoeft uit te vinden. En als je daar geen zin in hebt, laat je dan een Content Management Systeem (CMS) aanmeten die dit al voor een groot deel voor jou heeft geregeld.
 
Ozzie PHP

Ozzie PHP

10/12/2018 15:35:02
Quote Anchor link
@Thomas:

>> Vervolgens flag je de URL waarin het formulier wordt weergegeven, bijvoorbeeld met ?errors=1

Waarom dan niet in je sessie kijken of er een foutmelding is? Waarom een flag? (Het kan wel, maar ik vraag me af waarom je daarvoor kiest als je toch al een sessie gebruikt.)
 
Thomas van den Heuvel

Thomas van den Heuvel

10/12/2018 15:44:02
Quote Anchor link
Omdat je op die manier expliciet in de "fout toestand modus" schiet. En het is in eerste instantie bedoeld als hulpmiddel om (buiten je formulier) iets visueels te tonen, bijvoorbeeld:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
<?php
if (isset($_GET['errors'])) {
    ?>
<div class="error">Er is iets misgegaan. Controleer je invoer en probeer het nogmaals.</div><?php
}
// ... hier dan je formulier
?>

De initialisatie van je formulier-data, als je dit meer in classes gaat gieten, heeft verschillende bronnen:
1. bij het initieel laden van de formulier pagina kan dit een array zijn met defaults;
2. bij het verwerken van het formulier is dit doorgaans $_POST;
3. en bij het falen van validatie en terugkeren in het formulier is dit $_SESSION.

Zo'n URL-variabele kan je helpen met het nemen van de beslissing waar deze data vandaan moet komen en is ook nodig om onderscheid te kunnen maken tussen geval #1 en #3.
Gewijzigd op 10/12/2018 15:44:50 door Thomas van den Heuvel
 
Rob Doemaarwat

Rob Doemaarwat

10/12/2018 19:34:13
Quote Anchor link
Je zou je validatie ook (deels) naar de client kunnen brengen (javascript), dat geeft vaak een betere "user experience" voor de gebruiker (een rood veld als je iets vergeet, of in ieder geval een alert voor verzenden). De velden blijven dan gewoon zoals ze waren, en de gebruiker kan de input corrigeren.

Op de server hoef je de controle dan alleen nog "voor de zekerheid" over te doen (iemand heeft javascript disabled, of zit gewoon te hacken). De afhandeling hoeft in die gevallen dan "minder mooi" te zijn.

Nog even een duit in het zakje mbt de discussie hierboven: Ik gooi alle meldingen in een array in de session (meldingstekst + type = algemeen, waarschuwing, fout, enz). Zodra er dan een pagina getoond wordt (dat kan dus pas de GET na een POST+redir zijn) wordt deze lijst met meldingen aan de HTML toegevoegd (en daarna dus geleegd).
 
Ozzie PHP

Ozzie PHP

10/12/2018 21:38:34
Quote Anchor link
@Thomas

Ik zeg niet dat het niet kan wat jij aangeeft. Ik vraag me alleen dus af waarom op die manier. In jouw voorbeeld zou ik de URL kunnen aanroepen met error flag terwijl er helemaal geen error is (wat bij slechte coding zou kunnen leiden tot een error). Session is betrouwbaarder dan een externe parameter dus vandaar dat ik me afvroeg of je daar een specifieke reden voor had.
 
Max Boer

Max Boer

10/12/2018 22:01:40
Quote Anchor link
Bedankt voor jullie reacties allemaal!

@Thomas van den Heuvel , zou je een klein voorbeeldje kunnen geven?
Ik kan me nu niet echt er iets bij voorstellen :-)

Trouwens, waarom werkt dit eigenlijk niet?
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
<input type="text" name="methode" value="$methode">


Ik dacht dat Ariën zoiets zei
Gewijzigd op 10/12/2018 22:10:35 door Max Boer
 
Adoptive Solution

Adoptive Solution

10/12/2018 22:07:38
Quote Anchor link
Dit werkt beter :

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
<?php echo $methode; ?>
 
- Ariën  -
Beheerder

- Ariën -

10/12/2018 22:43:27
Quote Anchor link
Het is een PHP-variabele, dus moet je die binnen php-tags uitvoeren.
 
Thomas van den Heuvel

Thomas van den Heuvel

11/12/2018 12:32:34
Quote Anchor link
Ozzie PHP op 10/12/2018 21:38:34:
Ik vraag me alleen dus af waarom op die manier.

Omdat je mogelijk deze "toestand" buiten de formulier-functionaliteit nodig hebt, bijvoobeeld in een (main)template. Mogelijk moet je op grond van deze state ergens op een andere plek binnen de layout een of andere beslissing nemen (highlighting, andere stylesheet, weergeven van een blok tekst, noem het maar op). Het gebruik van een querystringparameter heeft een minimale impact met maximaal effect - dit is transparant en heeft minimale hard coding. Stel dat je op een specifieke manier zou controleren dat de verwerking van een formulier de mist in ging, dan kun je dit (op een andere plek) niet op een generieke manier controleren / hergebruiken, je zult dan allerlei afzonderlijke hard coded checks moeten doen.
tl;dr dit is een herbruikbare oplossing; als je veel met formulieren werkt is het standaardiseren van naamgevingen en dit soort generieke aanpakken handiger.

Ozzie PHP op 10/12/2018 21:38:34:
In jouw voorbeeld zou ik de URL kunnen aanroepen met error flag terwijl er helemaal geen error is (wat bij slechte coding zou kunnen leiden tot een error).

Uiteraard controleer je dan of de deelarrays die zouden moeten bestaan ook daadwerkelijk bestaan en anders val je terug op de defaults. Aan de andere kant, als iemand loopt te prutsen in de URL dan zou je op een gegeven moment de boel gewoon stuk kunnen laten gaan. Als iemand bewust van het gebaande pad is afgegaan dan moet je niet verbaasd zijn dat je op een gegeven moment poep aan de schoenen hebt :).

Ozzie PHP op 10/12/2018 21:38:34:
Session is betrouwbaarder dan een externe parameter dus vandaar dat ik me afvroeg of je daar een specifieke reden voor had.

Zoals hierboven aangegeven doe je beide. Het is inderdaad wel belangrijk dat je te allen tijde de regie houdt omdat je met user data te maken hebt, maar dat is niet zo ingewikkeld als je zoiets doet:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<?php
$formData
= $defaultFormValues; // fallback
$formErrors = array(); // init
$formName = 'myForm'; // (unieke) naam van huidig formulier
// de case waarin je terugkeert vanuit verwerking na mislukte validatie

if (isset($_GET['errors'])) {
    // init fields
    if (isset($_SESSION['form'][$formName]['fields'])) {
        // op het moment dat deze key bestaat kun je er vanuit gaan dat deze
        // passende (maar dus op een of andere manier niet kloppende of on-
        // volledige) formulierdata bevat

        $formData = $_SESSION['form'][$formName]['fields'];
    }

    // init errors
    if (isset($_SESSION['form'][$formName]['errors'])) {
        // kopieer foutmeldingen terug zodat je nu niet opnieuw hoeft te valideren
        $formErrors = $_SESSION['form'][$formName]['errors'];
    }
}

?>

De administratie in $_SESSION['form'][$formName] moet uiteraard wel altijd kloppen, zo zou je deze in het geheel moeten unsetten op het moment dat de verwerking succesvol was zodat je bij een nieuwe aanroep van een formulier ook echt weer een leeg formulier hebt. Maar dat is in principe ook de default toestand, dus ook dan zou je $_SESSION['form'][$formName] nogmaals, misschien ten overvloede, kunnen verwijderen.

Max Boer op 10/12/2018 22:01:40:
@Thomas van den Heuvel , zou je een klein voorbeeldje kunnen geven?
Ik kan me nu niet echt er iets bij voorstellen :-)

Maar wat ben je precies aan het maken? Betreft het in zijn totaliteit slechts één formulier, of wordt dit (uiteindelijk) een uitgebreid administratief systeem? Dit bepaalt (mede) je aanpak, en hoe je dingen zou moeten insteken.

Ook weet ik niet echt hoeveel zin een (werkend) voorbeeld heeft, want vervolgens ga je hiermee aan de slag en dan? Op het moment dat je bezig bent met de dingen die jij nu aan het doen bent: ik zie al wat rechtenbeheer enzo, dan wordt het tijd dat je (zelf) eens goed na moet gaan denken over de opbouw van de webpagina's waaruit jouw applicatie bestaat, en als je hierbij (veel) formulieren gebruikt dan is het ook zaak dat je het voor jezelf makkelijk maakt door dit proces te automatiseren waarbij je bouwstenen hebt waarmee je snel formulieren kunt bouwen en automatisch kunt valideren.

Als je met deze materie bezig bent dan komen er een heleboel verschillende disciplines bij elkaar. Elke discipline heeft zijn eigen specifieke regels die allemaal belangrijk zijn voor een correcte en veilige werking. Dit kan ik helaas niet in een simpel voorbeeld vangen.

Tevens, als je het principe begrijpt, dan kun je dit op tig manieren implementeren. Het enige wat ik in mijn vorige reacties heb voorgesteld is dat je de verschillende acties (het weergeven van een formulier, het verwerken van een formulier) opsplitst in op zichzelf staande stukken code (waarbij één groot if-statement dus waarschijnlijk niet zo'n strak plan is omdat je daarmee de acties niet echt scheidt en de code nogal onleesbaar wordt op den duur), deze zouden dus op een of andere manier gecompartimenteerd moeten worden. Hoe je dit doet mag je zelf weten. Dit zou je bijvoorbeeld kunnen bereiken door er simpelweg verschillende PHP-bestanden van te maken.

Dit introduceert vervolgens de noodzaak om DATA op een of andere manier over te hevelen van "actie A" naar "actie B" en een sessie ($_SESSION) is daar een prima medium voor.

En dan het belang van het controleren van de ingevoerde gegevens voordat je het de database inkiepert. Maar dit is gewoon een kwestie van de velden stuk voor stuk doorlopen en controleren in de verwerkstap. Hier zou je tevens een tijdelijk "data array" kunnen opbouwen die je later ofwel gebruikt om informatie weg te schrijven, ofwel om terug te sturen naar het formulier indien er fouten waren.

Klopt alles? kan het de database in.
Fouten? stop het eerdergenoemde data array terug in $_SESSION met wat extra kanttekeningen bij de invulvelden en stuur de gebruiker terug naar het formulier.

Hoe je dit implementeert hangt af van de schaal van je applicatie.
Gewijzigd op 11/12/2018 12:37:28 door Thomas van den Heuvel
 
Max Boer

Max Boer

11/12/2018 15:53:30
Quote Anchor link
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
<input type="text" name="methode" value="<?php echo $methode; ?>">


Bedankt voor je hulp Adoptive Solution!
Dit werkt inderdaad.
Alleen heb ik een probleempje. In het begin kent hij de variable $methode nog niet.
Hij geeft dan de volgende foutmelding:
<br /><b>Notice</b>: Undefined variable: duur in <b>C:\Users\Max de Boer\Documents\JEL\Informatica\USBWebserver\root\invoeren.php</b> on line <b>139</b><br />

Hoe zou ik dit kunnen oplossen?

Ik waardeer je hulp Thomas, maar ik ben nog maar een beginneling. Ik zit op dit moment in 6 VWO en deze opdracht is voor school. Ik heb eigenlijk nog nauwelijks verstand van arrays en sessies :-)
 
- Ariën  -
Beheerder

- Ariën -

11/12/2018 15:55:28
Quote Anchor link
Controleer met isset() of $duur bestaat, en dán pas echo'en.
 
Max Boer

Max Boer

11/12/2018 16:00:11
Quote Anchor link
Bedankt Ariën

Het werkt nu inderdaad

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
<input type="text" name="duur" value="<?php if(isset($_POST["verzend"])){ echo $duur;}?>">


Bedankt voor al jullie hulp.
 
Thomas van den Heuvel

Thomas van den Heuvel

11/12/2018 16:23:29
Quote Anchor link
Max Boer op 11/12/2018 15:53:30:
Ik heb eigenlijk nog nauwelijks verstand van arrays en sessies :-)

Maar dit gebruik je wel in een eerder codefragment?

Max Boer op 11/12/2018 16:00:11:
Het werkt nu inderdaad
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
<input type="text" name="duur" value="<?php if(isset($_POST["verzend"])){ echo $duur;}?>">

Maar daar controleer je of de submit-knop is ingesteld? En vervolgens echo je $duur?
Waarom gebruik je niet een eenvoudige functie? Zoiets:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
<?php
function postData($key, $default='') {
    $return = $default;
    if (isset($_POST[$key])) {
        $return = $_POST[$key];
    }

    return $return;
}

?>

En ook in HTML zou je DATA moeten escapen zodat deze HTML-safe is, bijvoorbeeld met de volgende shorthand:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
<?php
function escape($in) {
    return htmlspecialchars($in, ENT_QUOTES, 'UTF-8');
}

?>

Het veilige formulierveld wordt dan, inclusief initialisatie:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
<input type="text" name="duur" value="<?php echo escape(postData('duur')); ?>">

Op het moment dat je een bewerking meer dan eens uitvoert moet je jezelf afvragen of het handig kan zijn om een functie te introduceren. Elke keer zo'n inline if-statement leest ook niet echt prettig.
Gewijzigd op 11/12/2018 16:27:04 door Thomas van den Heuvel
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.