Idee: Formulier controle
Ik ben bezig met een nieuwe manier van formulieren controleren, waarbij je in de name van het veld beperkingen kan stellen. Het is de bedoeling dat je niets meer aan de controle hoeft aan te passen, maar dat je door het maken van de form op de manier zoals nodig voor de controle al je formulier kan laten controleren.
Ik heb het al een beetje werkend, maar ben er net aan begonnen. Mijn vraag aan jullie: Zien jullie hier wat in, kunnen jullie er wat mee en misschien wel het belangrijkst, is het op deze manier mogelijk?
Hetgeen wat er nu in de code slechts gebeurt is voor de genoemde velden (allemaal type text) controleren op de lengte, of ze wel ingevuld zijn (bij een opgegeven minimale lengte betekend dit voor de textvelden ook dat ze ingevuld MOETEN worden)
Bij het textveld waarbij geen lengte is ingevuld hoeft er ook niets ingevuld te worden.
Vast bedankt voor het meedenken.
Robert
Ik heb het al een beetje werkend, maar ben er net aan begonnen. Mijn vraag aan jullie: Zien jullie hier wat in, kunnen jullie er wat mee en misschien wel het belangrijkst, is het op deze manier mogelijk?
Code (php)
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
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
<?php
ini_set('display_errors', 1);
error_reporting(E_ALL);
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
<meta http-equiv="content-language" content="nl-en" />
<meta name="title" content="" />
<title>Input Form</title>
</head>
<body>
<form action="" method="post">
<input type="text" name="text[naam][2]" />
<input type="text" name="text[straat][5]" />
<input type="text" name="text[personal]" />
<input type="submit" name="submit" />
</form>
<?php
if($_SERVER['REQUEST_METHOD'] == 'POST'){
$errors = array();
foreach($_POST['text'] as $input_naam => $value){
if(is_array($value)){
foreach($_POST['text'][$input_naam] as $length => $input){
if(empty($input)){
$errors[$input_naam][] = 'empty';
}
elseif(strlen($input) < $length){
$errors[$input_naam][] = 'short';
$errors[$input_naam][] = $length;
}
}
}
}
}
if(!empty($errors)){
foreach($errors as $key => $value){
if($errors[$key][0] == 'short'){
echo $key.' moet uit minimaal '.$errors[$key][1].' tekens bestaan.<br />';
}
elseif($errors[$key][0] == 'empty'){
echo 'U heeft geen waarde ingevuld bij '.$key;
}
}
}
?>
</body>
</html>
ini_set('display_errors', 1);
error_reporting(E_ALL);
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
<meta http-equiv="content-language" content="nl-en" />
<meta name="title" content="" />
<title>Input Form</title>
</head>
<body>
<form action="" method="post">
<input type="text" name="text[naam][2]" />
<input type="text" name="text[straat][5]" />
<input type="text" name="text[personal]" />
<input type="submit" name="submit" />
</form>
<?php
if($_SERVER['REQUEST_METHOD'] == 'POST'){
$errors = array();
foreach($_POST['text'] as $input_naam => $value){
if(is_array($value)){
foreach($_POST['text'][$input_naam] as $length => $input){
if(empty($input)){
$errors[$input_naam][] = 'empty';
}
elseif(strlen($input) < $length){
$errors[$input_naam][] = 'short';
$errors[$input_naam][] = $length;
}
}
}
}
}
if(!empty($errors)){
foreach($errors as $key => $value){
if($errors[$key][0] == 'short'){
echo $key.' moet uit minimaal '.$errors[$key][1].' tekens bestaan.<br />';
}
elseif($errors[$key][0] == 'empty'){
echo 'U heeft geen waarde ingevuld bij '.$key;
}
}
}
?>
</body>
</html>
Hetgeen wat er nu in de code slechts gebeurt is voor de genoemde velden (allemaal type text) controleren op de lengte, of ze wel ingevuld zijn (bij een opgegeven minimale lengte betekend dit voor de textvelden ook dat ze ingevuld MOETEN worden)
Bij het textveld waarbij geen lengte is ingevuld hoeft er ook niets ingevuld te worden.
Vast bedankt voor het meedenken.
Robert
Ik zie eigenlijk niets in deze manier, aangezien een bezoeker dus alleen maar de veldnaam hoeft aan te passen om de gegevens anders te laten valideren.
Ik kan die 2 gewoon naar een 5 veranderen en vise versa, dan is volgens php de controle goed, maar toch staan er niet de waarden in zoals bedoeld.
Ik kan die 2 gewoon naar een 5 veranderen en vise versa, dan is volgens php de controle goed, maar toch staan er niet de waarden in zoals bedoeld.
Lijkt me ook niet echt veilig ha?
Oké, ik wist niet dat ze ook zomaar de veldnamen konden aanpassen.. (voor een gemiddelde bezoeker is dat al niets natuurlijk) Dan is dit niet handig om te doen.
Lijkt mij inderdaad niet veilig.
Juist omdat ik het formulier op mijn computer kan zetten met een action naar jouw pagina.
Wat je eventueel wel kunt doen is een array maken met daarin de eisen waaraan een bepaald veld moet voldoen.
Nu ik het zo bekijk is dit zo geack nog niet (vind ik) :)
Ik ga er eens goed naar kijken :p
Ik kijk in de bron-code, aha, lengte in de naam van het veld.
Ik kopieer je hele form en plaats deze in een nieuwe html bestand die ik gewoon op mijn computer zet. Vervolgens zet ik in plaats van 5 daar gewoon 20 neer, zet de action goed, zodat hij wel naar jouw site gaat. En ik kan invullen :)
Zo kun je ook 'vaak' een ander geslacht invullen. Vaak kun je bij profielen site's alleen man of vrouw selecteren. Als je nou een html bestand aan maakt met een form erin en je maakt daar gewoon een input text-field van met dezelfde naam (sex of geslacht of weet ik veel wat) kun je alles invullen.
Daarom altijd server-side checken of het wel echt m of v is of 0 of 1 of wat dan ook.
Juist omdat ik het formulier op mijn computer kan zetten met een action naar jouw pagina.
Wat je eventueel wel kunt doen is een array maken met daarin de eisen waaraan een bepaald veld moet voldoen.
Code (php)
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
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
<?php
$aPosts = Array(
'name' => Array(
'type' => 'string',
'minLength' => 4,
'maxLength' => 12),
'email' => Array(
'type' => 'email'),
'age' => Array(
'type' => 'int',
'minNumber' => 10,
'maxNumber' => 100)
);
ForEach($_POST AS $sKey => $sValue)
{
if(Array_Key_Exists($sKey, $aPosts))
{
Switch($aPosts[$sKey]['type'])
{
case 'string':
// Check op de lengtes etc. etc.
break;
case 'int':
// Nummer controleren
break;
case 'email':
// Email check
break;
}
}
}
?>
$aPosts = Array(
'name' => Array(
'type' => 'string',
'minLength' => 4,
'maxLength' => 12),
'email' => Array(
'type' => 'email'),
'age' => Array(
'type' => 'int',
'minNumber' => 10,
'maxNumber' => 100)
);
ForEach($_POST AS $sKey => $sValue)
{
if(Array_Key_Exists($sKey, $aPosts))
{
Switch($aPosts[$sKey]['type'])
{
case 'string':
// Check op de lengtes etc. etc.
break;
case 'int':
// Nummer controleren
break;
case 'email':
// Email check
break;
}
}
}
?>
Nu ik het zo bekijk is dit zo geack nog niet (vind ik) :)
Ik ga er eens goed naar kijken :p
'Robert_Deiman:
Ik ga naar jouw site. Ik vul het formulier in en krijg een foutmelding, huh :S Waarom te lang?Oké, ik wist niet dat ze ook zomaar de veldnamen konden aanpassen.. (voor een gemiddelde bezoeker is dat al niets natuurlijk) Dan is dit niet handig om te doen.
Ik kijk in de bron-code, aha, lengte in de naam van het veld.
Ik kopieer je hele form en plaats deze in een nieuwe html bestand die ik gewoon op mijn computer zet. Vervolgens zet ik in plaats van 5 daar gewoon 20 neer, zet de action goed, zodat hij wel naar jouw site gaat. En ik kan invullen :)
Zo kun je ook 'vaak' een ander geslacht invullen. Vaak kun je bij profielen site's alleen man of vrouw selecteren. Als je nou een html bestand aan maakt met een form erin en je maakt daar gewoon een input text-field van met dezelfde naam (sex of geslacht of weet ik veel wat) kun je alles invullen.
Daarom altijd server-side checken of het wel echt m of v is of 0 of 1 of wat dan ook.
Gewijzigd op 01/01/1970 01:00:00 door Dennis Mertens
Je kunt natuurlijk wel een array van eigenschappen maken. Aan de hand van die array genereer je het formulier en aan de hand van diezelfde array valideer je je formulier. Voorbeeldje:
Heb het niet getest, maar het geeft wel een indruk van wat ik bedoel.
Code (php)
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
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
<?php
$formulier = array(
'action' = '#',
'method' = 'post',
'elementen' = array
(
array('naam', 'text', 20),
array('email', 'text', null)
)
);
if($_SERVER['REQUEST_METHOD'] == 'POST')
{
foreach($_POST as $key => $value)
{
if(strlen($value) > $formulier['elementen'][$key][2])
{
$errors[$key] = 'De string is te lang';
}
}
}
echo '<form method="'.$formuliee['method'].'" action="'.$formulier['action'].'">';
foreach($formulier['elementen'] as $elementen)
{
if($element[0] == 'text' || $element[0] == 'password')
{
echo '<input type="'.$element[0].'" name="'.$element[1].'"'.(($element[2] != null) ? ' maxlength="'.$element[2].'"' : '').' />';
}
}
echo '</form>';
?>
$formulier = array(
'action' = '#',
'method' = 'post',
'elementen' = array
(
array('naam', 'text', 20),
array('email', 'text', null)
)
);
if($_SERVER['REQUEST_METHOD'] == 'POST')
{
foreach($_POST as $key => $value)
{
if(strlen($value) > $formulier['elementen'][$key][2])
{
$errors[$key] = 'De string is te lang';
}
}
}
echo '<form method="'.$formuliee['method'].'" action="'.$formulier['action'].'">';
foreach($formulier['elementen'] as $elementen)
{
if($element[0] == 'text' || $element[0] == 'password')
{
echo '<input type="'.$element[0].'" name="'.$element[1].'"'.(($element[2] != null) ? ' maxlength="'.$element[2].'"' : '').' />';
}
}
echo '</form>';
?>
Heb het niet getest, maar het geeft wel een indruk van wat ik bedoel.
Ik bedenk me net dat je het ook anders kan doen. Ik maak nu voor verzenden al die array aan, die kan je ook aanmaken na verzenden en in PHP. Dan komt het wel redelijk in de buurt van wat php_newbie aangeeft.
Dan is het natuurlijk wel veilig. Het idee was om gebruikers voor het formulier zo weinig mogelijk aanpassingen te laten doen. Het idee van newbie is wel een goede, dat is best verder uit te werken.
Dan is het natuurlijk wel veilig. Het idee was om gebruikers voor het formulier zo weinig mogelijk aanpassingen te laten doen. Het idee van newbie is wel een goede, dat is best verder uit te werken.
Ik heb hiervoor mijn eigen klasse geschreven, die ik voor elk project meeneem.
Dus met ->addTextfield(, ->addTextarea(, ->addButton(, enz enz bouw ik mijn formulier. In elke methode geef ik de eigenschappen aan van het inputveld. Een textfield kan verplicht zijn, maar ook kan ik meesturen of het een numeriek veld moet zijn, of bijv een emailadres, een decimaal of een postcode, enz.
Zo kan een button een imagebutton zijn, maar ook een submitbutton of een normale button.
Door middel van een handig geintegreerde validatiefunctie check ik in een keer al mijn formuliervelden (inclusief beveiliging).
Op deze manier maak ik met zeer weinig code een (complex) formulier.
Dus met ->addTextfield(, ->addTextarea(, ->addButton(, enz enz bouw ik mijn formulier. In elke methode geef ik de eigenschappen aan van het inputveld. Een textfield kan verplicht zijn, maar ook kan ik meesturen of het een numeriek veld moet zijn, of bijv een emailadres, een decimaal of een postcode, enz.
Zo kan een button een imagebutton zijn, maar ook een submitbutton of een normale button.
Door middel van een handig geintegreerde validatiefunctie check ik in een keer al mijn formuliervelden (inclusief beveiliging).
Op deze manier maak ik met zeer weinig code een (complex) formulier.
@Barman
Dat is dit principe ook he, ik heb nu het formulier er nog "hard" in staan, maar die gaat uiteindelijk wel worden gegenereerd. Ik had alleen de array (waarden) meegegeven in de name van het veld, maar dat is eigenlijk onzin. De naam van het veld is al uniek eigenlijk. Dus je kan controle heel simpel inbouwen. Had ik niet goed over nagedacht.
Dat is dit principe ook he, ik heb nu het formulier er nog "hard" in staan, maar die gaat uiteindelijk wel worden gegenereerd. Ik had alleen de array (waarden) meegegeven in de name van het veld, maar dat is eigenlijk onzin. De naam van het veld is al uniek eigenlijk. Dus je kan controle heel simpel inbouwen. Had ik niet goed over nagedacht.
Dit is niet zo'n ideale manier voor controle met php, maar wel als je het zou toepassen in JS.
Een JS scriptje overloopt dan automatisch alle form velden en maakt zelf de nodige validators aan. Tijdens het typen zie jij dan ook of je een veld correct invult.
in PHP zou je het toch weer dubbel moeten beveiligen en voegt het niet veel extra toe.
Een JS scriptje overloopt dan automatisch alle form velden en maakt zelf de nodige validators aan. Tijdens het typen zie jij dan ook of je een veld correct invult.
in PHP zou je het toch weer dubbel moeten beveiligen en voegt het niet veel extra toe.
Yepz. Een JS scriptje eronder is mooi en handig. Maar sowieso server side controleren.
En dan vind ik mijn scriptje zo geack nog niet.
En dan vind ik mijn scriptje zo geack nog niet.
@Hipska
Waarom is het niet handig in PHP? Je kan met een array (zoals newbie ook had gemaakt) heel eenvoudig een formulier maken. Koppel dit aan een database met verschillende typen (numeriek e.d.) en je php controle kan zo worden opgebouwd aan de hand van jou opgegeven waarden. Ideaal om te controleren lijkt mij.
Waarom is het niet handig in PHP? Je kan met een array (zoals newbie ook had gemaakt) heel eenvoudig een formulier maken. Koppel dit aan een database met verschillende typen (numeriek e.d.) en je php controle kan zo worden opgebouwd aan de hand van jou opgegeven waarden. Ideaal om te controleren lijkt mij.
'Hipska:
Grappig dat je altijd nog rekening moet houden met de mensen die javascript (soms) uit hebben staan. Misschien dat je het alleen bedoeld in deze situatie, maar serverside controleren is eigenlijk altijd een must.Dit is niet zo'n ideale manier voor controle met php, maar wel als je het zou toepassen in JS.
Een JS scriptje overloopt dan automatisch alle form velden en maakt zelf de nodige validators aan. Tijdens het typen zie jij dan ook of je een veld correct invult.
in PHP zou je het toch weer dubbel moeten beveiligen en voegt het niet veel extra toe.
Een JS scriptje overloopt dan automatisch alle form velden en maakt zelf de nodige validators aan. Tijdens het typen zie jij dan ook of je een veld correct invult.
in PHP zou je het toch weer dubbel moeten beveiligen en voegt het niet veel extra toe.
Een zend login-formulier, inclusief validatie:
Aan te roepen door:
Misschien kun je daar wat mee. Dan moet je wel met classes gaan werken en kom je er niet meer met een array I guess..
Code (php)
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
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
<?php
class LoginForm extends Zend_Form
{
public function __construct($options = null)
{
$this->addElementPrefixPath('MyValid', 'controllers/helpers/', Zend_Form_Element::VALIDATE);
parent::__construct($options);
$this ->setName('login');
$gebruikersnaam = new Zend_Form_Element_Text('gebruikersnaam');
$gebruikersnaam ->setLabel('Gebruikersnaam')
->setRequired(true)
->addFilter('StringTrim')
->addValidator('NotEmpty', true, array('messages' => array(
'isEmpty' => 'Geef een gebruiksnaam op',
)));
$wachtwoord = new Zend_Form_Element_Password('wachtwoord');
$wachtwoord ->setLabel('Wachtwoord')
->setRequired(true)
->addFilter('StringTrim')
->addValidator('NotEmpty', true, array('messages' => array(
'isEmpty' => 'Geef een wachtwoord op',
)));
$submit = new Zend_Form_Element_Submit('submit');
$submit ->setLabel('Login');
$this ->addElements(array($gebruikersnaam, $wachtwoord, $submit));
}
}
?>
class LoginForm extends Zend_Form
{
public function __construct($options = null)
{
$this->addElementPrefixPath('MyValid', 'controllers/helpers/', Zend_Form_Element::VALIDATE);
parent::__construct($options);
$this ->setName('login');
$gebruikersnaam = new Zend_Form_Element_Text('gebruikersnaam');
$gebruikersnaam ->setLabel('Gebruikersnaam')
->setRequired(true)
->addFilter('StringTrim')
->addValidator('NotEmpty', true, array('messages' => array(
'isEmpty' => 'Geef een gebruiksnaam op',
)));
$wachtwoord = new Zend_Form_Element_Password('wachtwoord');
$wachtwoord ->setLabel('Wachtwoord')
->setRequired(true)
->addFilter('StringTrim')
->addValidator('NotEmpty', true, array('messages' => array(
'isEmpty' => 'Geef een wachtwoord op',
)));
$submit = new Zend_Form_Element_Submit('submit');
$submit ->setLabel('Login');
$this ->addElements(array($gebruikersnaam, $wachtwoord, $submit));
}
}
?>
Aan te roepen door:
Code (php)
Misschien kun je daar wat mee. Dan moet je wel met classes gaan werken en kom je er niet meer met een array I guess..
Mooi voorbeeld, alleen jammer van het Engels en Nederlands door elkaar.
Of gebruik gewoon FormHandler. Ik heb het 1 keer gebruikt en wil niet anders meer. Gewoon object georienteerd een formulier definieren en niets meer.
Kijk eens op www.formhandler.net :)
Kijk eens op www.formhandler.net :)
Uiteindelijk is het mijn bedoeling om met 'n eigen script (daar leer ik weer van he!) vanuit een database ('t cms werkt op een centrale database) formulieren laat genereren. Klanten kunnen zo eenvoudig zelf hun contactformulier en dergelijke aanmaken. Wij maken hem nu zelf elke keer aan, en als er velden toegevoegd moeten worden doen wij dat ook. (op zich niet erg, maar het is zo weinig werk vaak dat er niets voor wordt gerekend) Daarom was ik met een dergelijk systeem bezig.
'Dennis:
Mooi voorbeeld, alleen jammer van het Engels en Nederlands door elkaar.
De classes en functies zijn engels, aangezien het Zend framework gewoon engels is, maar ik wil mijn nederlandse bezoeker natuurlijk wel de woorden "gebruikersnaam" en "wachtwoord" laten zien en niet "Username" en "password".
Dat snap ik maar ik zie ook variabele in het Nederlands.
'Dennis:
Dat snap ik maar ik zie ook variabele in het Nederlands.
Het is natuurlijk niet echt handig om het formulier element gebruikersnaam in de variabele $username te zetten he...




