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:


<?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
Het is een PHP-variabele, dus moet je die binnen php-tags uitvoeren.
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:
<?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.

<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 :-)
Controleer met isset() of $duur bestaat, en dán pas echo'en.
Bedankt Ariën

Het werkt nu inderdaad


<input type="text" name="duur" value="<?php if(isset($_POST["verzend"])){ echo $duur;}?>">


Bedankt voor al jullie hulp.
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

<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:
<?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:
<?php
function escape($in) {
    return htmlspecialchars($in, ENT_QUOTES, 'UTF-8');
}
?>

Het veilige formulierveld wordt dan, inclusief initialisatie:
<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.

Reageren