Form Generation & Validation

Door Jan Koehoorn, 20 jaar geleden, 6.471x bekeken

Met behulp van dit script kun je een formulier genereren en valideren. Er zit ook een antispam beveiliging op. Voorlopig kun je alleen velden type text genereren. Een uitbreiding voor selects en checkboxen en dergelijke is mogelijk in deze opzet, maar dan zou het script weer iets al te gevorderd worden ;-)

Er zijn ook kant en klare (OOP) oplossingen voor formuliergeneratie en -validatie, maar omdat we er natuurlijk allemaal naar streven om PHP te leren is het leuk om zelf iets als dit te maken/bestuderen.

Merk op, dat je een veld op 'required' kunt zetten en/of een regex mee kunt geven. Als een veld niet required is maar wel een regex heeft, wordt die regex pas toegepast als iemand iets invult in het bewuste veld.

Prettig uiteinde alvast en reacties zie ik natuurlijk graag tegemoet.


Wijzigingen n.a.v. tips:
1) span met extra info toegevoegd die op een :hover verschijnt (ook IE6)
2) paar if constructies wat netter gemaakt en de verkorte if/else notatie uitgelegd

Eigen wijzigingen:
1) dubbelpost controle ingebouwd
2) CSS van de extra info spans iets aangepast

Voorbeeld: http://www.jankoehoorn.nl/form_validation.php

Gesponsorde koppelingen

PHP script bestanden

  1. form-generation-en-validation

 

Er zijn 42 reacties op 'Form generation en validation'

PHP hulp
PHP hulp
0 seconden vanaf nu
 

Gesponsorde koppelingen
Joren de Wit
Joren de Wit
20 jaar geleden
 
0 +1 -0 -1
Netjes :-)

Ik zou alleen nog even naar je regex voor het telefoonnummer kijken. Het lijkt me niet dat '111foobar' een geldig telefoonnummer is...
Jan Koehoorn
Jan Koehoorn
20 jaar geleden
 
0 +1 -0 -1
Tnx Blanche.

Die regex zal ik ff aanpassen ;-)
Wouter Tinbergen
wouter Tinbergen
20 jaar geleden
 
0 +1 -0 -1
Mooi.
Wellicht handig om de postcode een standaard value mee te geven zodat je gelijk het goede format invult... nu is hij zonder spatie niet goed.
3535HB --> fout
3535 HB --> goed

Dank
Jan Koehoorn
Jan Koehoorn
20 jaar geleden
 
0 +1 -0 -1
Een goeie telefoonregex is moeilijk te vinden merk ik! Ik heb er ff iets anders in gezet, maar ideaal is het nog niet.

@wouter: zonder spatie werkt 3535HB bij mij prima?

Even los van de regexen; dat is niet de essentie van dit script. Die kun je zelf aanpassen naar eigen wens. Waar het mij om te doen was, is het automatisch genereren en valideren van een form adhv een multi-array. Uiteraard hou ik me aanbevolen voor goeie regexen ;-)
Wouter Tinbergen
wouter Tinbergen
20 jaar geleden
 
0 +1 -0 -1
@jan, ja je hebt gelijk. Te snel gekeken.
Dubbele spaties werken niet...
- SanThe -
- SanThe -
20 jaar geleden
 
0 +1 -0 -1
Zeer netjes Jan. Ik zou voor de beginneling wel overal { en } gebruiken bij de diverse if()'s.
Wouter K
Wouter K
20 jaar geleden
 
0 +1 -0 -1
Weer fantastisch

Maar niet hier in belgië

Sinds wanneer heeft een belg 1111 AB wij werken hier dus met 4 cijfers..4444 bv

Misschien zou je kunnen controleren ofwel de invoer 4 cijfers ofwel 4 cijfers en 2 letters
PHP Newbie
PHP Newbie
20 jaar geleden
 
0 +1 -0 -1
Misschien ook nog even een optie maken dat ik commentaar achter het vakje kan zetten. Bijvoorbeeld een voorbeeld over hoe men het vakje in moet vullen, of een kleine toelichting.

Verder netjes :-)
Jan Koehoorn
Jan Koehoorn
20 jaar geleden
 
0 +1 -0 -1
@ SanThe: okee zal ik morgen even naar kijken. Ik vind het overigens niet echt een beginnersscript, maar het staat inderdaad wat duidelijker.

@ wouter: zie mijn eerdere opmerkingen. Het gaat niet om de regexen, maar om de manier waarop het aanmaken en valideren van een form geautomatiseerd wordt. Zo'n regex kun je simpel zelf aanpassen.

@ PHP Newbie: heb ik inderdaad overwogen. Daarvoor moet ik ff die multi-array uitbreiden. Ga ik morgen even naar kijken.

@ allemaal: maak er wat van, dit jaar ;-)
PHP Newbie
PHP Newbie
20 jaar geleden
 
0 +1 -0 -1
En misschien kun je dit:

'naam' => array ('type' => 'text', 'required' => true, 'regex' => false),

ook gewoon vervangen door dit:

'naam' => array ('text', true, false),

En dan bovenaan gewoon even tussen commentaartekens de array opbouw zetten (dus gewoon //array(type, verplichtveld?, regex?) )
Jelmer -
Jelmer -
20 jaar geleden
 
0 +1 -0 -1
Dan is de volgorde van belang, en het is minder leesbaar. En ook met het oog op de toekomst is het niet handig. Stel dat je een extra optie toevoegt, en nog eentje, beiden optioneel. Hoe ga je die dan invullen?

Je kan dit heel leuk doen met klassen en objecten. Maar zoals Jan al zei is het dan misschien lastiger om te begrijpen voor de instap-programmeur. Maar de mogelijkheden zijn eindeloos.
Jan Koehoorn
Jan Koehoorn
20 jaar geleden
 
0 +1 -0 -1
Ik heb hem nog iets uitgebreid met een span 'extrainfo' die op een :hover tevoorschijn komt bij velden die er eentje hebben.

Ik heb er ook een uitleg bij gedaan over de verkorte if-else notatie voor de beginners.
T H
T H
20 jaar geleden
 
0 +1 -0 -1
Dit ziet er erg netjes uit, ik denk dat ik deze binnenkort maar eens ga uitproberen.

Ga zo door zou ik zeggen.

Gr, Tim
Robert -
Robert -
20 jaar geleden
 
0 +1 -0 -1
Ziet er mooi uit.
Als opmerking nog dat ik bij postcode gewoon 8700AAA in kan vullen als geldig
Thijs X
Thijs X
20 jaar geleden
 
0 +1 -0 -1
Die hele regex werkt niet echt, je kan ook 1111AAAAAAA invullen.

Edit:

Verander je regex van postcode eens naar:

'/^[1-9]{1}[0-9]{3}[ ]?[A-Za-z]{2}$/'

PHP Newbie
PHP Newbie
20 jaar geleden
 
0 +1 -0 -1
Een goede postcode regex voor de mensen:
^[0-9]{4}[[:space:]]*[A-Za-z]{2}$
Jan Koehoorn
Jan Koehoorn
20 jaar geleden
 
0 +1 -0 -1
Ik heb de postcode regex veranderd in:
/^[1-9]{1}[0-9]{3}\s?[A-Za-z]{2}$/

@ PHP Newbie: die * achter[[:space:]] betekent: 0 of meer spaties. Volgens mij gaat hij dan ook dingen als 1234(hier veel spaties)AB goedkeuren.
PHP Newbie
PHP Newbie
20 jaar geleden
 
0 +1 -0 -1
^[0-9]{4}[[:space:]]?[A-Za-z]{2}$ dan ;-)
Jan Koehoorn
Jan Koehoorn
20 jaar geleden
 
0 +1 -0 -1
@ PHP Newbie: die is al beter, maar volgens mij mogen postcodes ook niet met een 0 beginnen. Vandaar die [1-9]{1}[0-9]{3} in mijn regex.
Jason de Ridder
Jason de Ridder
20 jaar geleden
 
0 +1 -0 -1
Jan,

Bekijk (jat) even de regexxen van FormHandler ;)
PHP Newbie
PHP Newbie
20 jaar geleden
 
0 +1 -0 -1
Aahaa, oke.
Jan Koehoorn
Jan Koehoorn
20 jaar geleden
 
0 +1 -0 -1
@ Jason: dat kan ook nog.

@ Iedereen: wat mij betreft is het onderdeel regexen van dit script nu voldoende besproken. Verdere reacties graag over de rest van het script.
Kwastie
Kwastie
20 jaar geleden
 
0 +1 -0 -1
moet PHP_EOL (end of Line) niet worden 'gedefined' en <title>Jan Koehoorn | php echo $title;> </title> word => Jan Koehoorn |Jan Koehoorn | Form Generation and Validation

Verder mooi script!
Edit: die verkorte if/else notering had ik niet geweten, word ook best weinig gebruikt.. in iedergeval weet ik nu wat het betekend mocht ik het ooit een keer tegenkomen
Kalle P
Kalle P
20 jaar geleden
 
0 +1 -0 -1
Best weinig? Verkorte notering wordt niet alleen in php gebruikt, maar ook in andere programmeertalen.
Joren de Wit
Joren de Wit
20 jaar geleden
 
0 +1 -0 -1
Kwastie:
moet PHP_EOL (end of Line) niet worden 'gedefined'
Nope, dat is een vaste constante die binnen PHP beschikbaar is...
Jan Koehoorn
Jan Koehoorn
20 jaar geleden
 
0 +1 -0 -1
Ik ken die verkorte if/else eigenlijk al heel lang, vanuit C. Ik denk dat PHP hem daarvandaan heeft.

PHP_EOL is geloof ik PHP5, maar dat weet ik niet zeker. Anders kun je dit doen:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
    if (!defined ('PHP_EOL')) define ('PHP_EOL', "\r\n");
?>
Jens V
Jens V
20 jaar geleden
 
0 +1 -0 -1
Werkt lekker Jan!
Maar ik heb een opmerking over de layout. Als je een form gaat editen, dus als je iets verkeerd hebt ingezonden, gebeurt er dit:
Afbeelding

Mvg,
Jens
Jan Koehoorn
Jan Koehoorn
20 jaar geleden
 
0 +1 -0 -1
Ik zie het al. Bekend IE probleem.
Cor van Doorn
Cor van Doorn
19 jaar geleden
 
0 +1 -0 -1
Ik krijg de volgende fout melding:
Notice: Undefined index: form_validationdbd70.jpg in /........./public_html/form_validation.php on line 65

en dit is dus die bewuste line 65:
if ($check != $antispam['form_validation' . $_SESSION['check'] . '.jpg']) {

Ik had hier de juiste waarde ingevuld toch kreeg ik de melding dat niet de juiste waarde was ingevuld.

wat gaat hier fout??

btw het plaatje wordt na het submitten ook niet meer getoond.
Jan Koehoorn
Jan Koehoorn
19 jaar geleden
 
0 +1 -0 -1
@ Cor: op de één of andere manier is de waarde $_SESSION['check'] bij jou gevuld met iets anders dan 1, 2, 3 of 4. Dat is vreemd, want eerder in het script (op regel 28 om precies te zijn) staat:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
<?php
        if (!$posted) {
        $_SESSION['check'] = mt_rand (1, 4);
    }

?>

Als je mijn script goed hebt overgenomen kan er onmogelijk iets anders in $_SESSION['check'] staan dan 1, 2, 3 of 4.
Cor van Doorn
Cor van Doorn
19 jaar geleden
 
0 +1 -0 -1
klop jan dit staat er inderdaad maar wanneer ik hond, slang of welk dier er ook getoond wordt invul komt hij met deze foutmelding form_validationhond.jpg en vraagd me het juiste dier in te vullen.

ik zal het script nogmaals overnemen en uitproberen. ik laat je weten wat het resultaat is
Cor van Doorn
Cor van Doorn
19 jaar geleden
 
0 +1 -0 -1
Jan het resultaat is het volgende:

Notice: Undefined index: form_validationslang.jpg in /............./public_html/form_validation.php on line 65

Met andere woorden geen verschil

Op de een of andere manier neemt de check over wat ik intype.

Enig idee hoe dat kan?
Jan Koehoorn
Jan Koehoorn
19 jaar geleden
 
0 +1 -0 -1
Zet eens onderaan je code:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
<?php
    if ($_SERVER['REQUEST_METHOD'] == 'POST') {
        echo '<pre>' . print_r ($_SESSION, true) . '</pre>';
    }

?>

wat komt er dan op je scherm te staan na verzenden van het formulier?
Cor van Doorn
Cor van Doorn
19 jaar geleden
 
0 +1 -0 -1
de foutmelding en hetvolgende:

Array
(
[check] => hond
)
Jan Koehoorn
Jan Koehoorn
19 jaar geleden
 
0 +1 -0 -1
Waarschijnlijk komt de waarde van het veld waarin je de naam van het dier moet invullen in je sessie terecht.

Ik krijg:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
<?php
Array
(
    [
check] => 3
)
?>
Cor van Doorn
Cor van Doorn
19 jaar geleden
 
0 +1 -0 -1
is er een manier om dit op te lossen?

Was van plan dit script te gebruiken, maar met dit probleem wordt het wat lastig. Het gekke is ook dat na de eerste keer er gesubmit wordt en de fout melding krijg het plaatje ook niet meer getoond wordt.

heb nog iets ontdekt. inmiddels weet ik welk nummer bij welk plaatje hoort zo ik dacht laat ik het nummer eens ingeven inplaats van de naam van het dier. Het resultaat geen foutmelding de juiste output in de array, maar nog wel de melding dat ik het goede dier in moet geven.

Misschien kun je iets met deze info.

Heb trouwens je andere script (oop.form) gezien maar kan die nog niet gebruiken. De server waar ik op host heeft er nog geen php5 op staan.
Cor van Doorn
Cor van Doorn
19 jaar geleden
 
0 +1 -0 -1
Jan ik ben er inmiddels achter waarom de waarde in de sessie terecht komt. ik heb de dit gedeelte aangepast:

// kleine check inbouwen
if ($posted) {
$check = strtolower (trim ($_POST['check']));
if ($check != $antispam['form_validation' . $_SESSION['check'] . '.jpg']) {
$form_ok = false;
$check_error = '<span class="error">Vul het goede dier in</span>';
}
}

in:

// kleine check inbouwen
if ($posted) {
$check2 = strtolower (trim ($_POST['check']));
if ($check2 != $antispam['form_validation' . $_SESSION['check'] . '.jpg']) {
$form_ok = false;
$check_error = '<span class="error">Vul het goede dier in</span>';
}
}

en nu werkt het wel. :-)
Jan Koehoorn
Jan Koehoorn
19 jaar geleden
 
0 +1 -0 -1
Het zat hem dus in de variabelenaam. Bij mij gaf/geeft het geen probleem, maar mooi dat hij bij jou nu is opgelost.

Tip: schakel over op een host met PHP5. Het is er al een hele tijd en PHP6 zit er al aan te komen.
Niek Weevers
Niek Weevers
19 jaar geleden
 
0 +1 -0 -1
Hardstikke cool.
Maar ik wil het formulier ook versturen. Als ik het goed heb moet je regels 92, 93 en 94 hiervoor wijzigen in een code die het verstuurt. Klopt dit?
En wat moet die code zijn? Ik ben niet zo'n php'er namelijk.
Jan Koehoorn
Jan Koehoorn
19 jaar geleden
 
0 +1 -0 -1
@ Niek: nee, het versturen gebeurt al, als iemand op de submit button klikt. In regel 92 en verder kun je de waarden, die door het formulier zijn verzonden, opvangen. Ze zitten allemaal in de array $_POST, op de volgende manier:

$_POST['name_van_het_formulierveld']
Niek Weevers
Niek Weevers
19 jaar geleden
 
0 +1 -0 -1
Ik bedoel, hoe kan ik het versturen naar een bepaald email adres?
Door
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
<?php
$msg
= $_POST['name_van_het_formulierveld'];
$msg .= $_POST['name_van_het_formulierveld2'];
$msg .= mail("[email protected]", "onderwerp", $msg);
?>

of zie ik het nu totaal verkeerd?
PHP hulp
PHP hulp
0 seconden vanaf nu
 

Gesponsorde koppelingen
Niek Weevers
Niek Weevers
19 jaar geleden
 
0 +1 -0 -1
Lukt dit of niet?

Om te reageren heb je een account nodig en je moet ingelogd zijn.

Inhoudsopgave

  1. form-generation-en-validation

Labels

  • Geen tags toegevoegd.

Navigatie

 
 

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.