Idee: Formulier controle
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 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.
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 schreef op 05.12.2008 12:21:
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
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.
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.
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.
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.
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.
En dan vind ik mijn scriptje zo geack nog niet.
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 schreef op 09.12.2008 11:56:
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.
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.
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 Mertens schreef op 10.12.2008 08:30:
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 Mertens schreef op 10.12.2008 13:00:
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...