Versio

Idee: Formulier controle

Overzicht Reageren

Robert Deiman

Robert Deiman

05/12/2008 11:47:00
Quote Anchor link
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?

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
<?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>


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
 
PHP hulp

PHP hulp

24/05/2012 23:42:54
Gesponsorde koppelingen:
BHosted Hosting al vanaf € 1,- per maand

Controleer nu gratis jouw domeinnaam:

  
 
PHP Newbie

PHP Newbie

05/12/2008 12:07:00
Quote Anchor link
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.
 
Niborx Trump

Niborx Trump

05/12/2008 12:17:00
Quote Anchor link
Lijkt me ook niet echt veilig ha?
 
Robert Deiman

Robert Deiman

05/12/2008 12:21:00
Quote Anchor link
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.
 
Dennis Mertens

Dennis Mertens

05/12/2008 12:40:00
Quote Anchor link
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.

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
<?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;
        }
    }
}

?>


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:
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 ga naar jouw site. Ik vul het formulier in en krijg een foutmelding, huh :S Waarom te lang?
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
 
PHP Newbie

PHP Newbie

05/12/2008 14:01:00
Quote Anchor link
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:

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
<?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>';
        
?>


Heb het niet getest, maar het geeft wel een indruk van wat ik bedoel.
 
Robert Deiman

Robert Deiman

09/12/2008 07:42:00
Quote Anchor link
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.
 
Barman V

Barman V

09/12/2008 08:13:00
Quote Anchor link
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.
 
Robert Deiman

Robert Deiman

09/12/2008 09:28:00
Quote Anchor link
@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.
 
Hipska BE

Hipska BE

09/12/2008 11:56:00
Quote Anchor link
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.
 
Dennis Mertens

Dennis Mertens

09/12/2008 12:16:00
Quote Anchor link
Yepz. Een JS scriptje eronder is mooi en handig. Maar sowieso server side controleren.

En dan vind ik mijn scriptje zo geack nog niet.
 
Robert Deiman

Robert Deiman

09/12/2008 12:57:00
Quote Anchor link
@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.
 
Barman V

Barman V

10/12/2008 07:57:00
Quote Anchor link
Hipska schreef op 09.12.2008 11:56:
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.
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.
 
PHP Newbie

PHP Newbie

10/12/2008 08:11:00
Quote Anchor link
Een zend login-formulier, inclusief validatie:

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
<?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));
    }
}

?>


Aan te roepen door:
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
<?php
        $form
= new LoginForm();
        $this->view->form = $form;
        
        if ($this->_request->isPost())
        {

            $formData = $this->_request->getPost();
            
            if(!$form->isValid($formData))
            {

                $form->populate($formData);
            }

            else
            {
?>


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..
 
Dennis Mertens

Dennis Mertens

10/12/2008 08:30:00
Quote Anchor link
Mooi voorbeeld, alleen jammer van het Engels en Nederlands door elkaar.
 
Marien xD

Marien xD

10/12/2008 10:16:00
Quote Anchor link
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 :)
 
Robert Deiman

Robert Deiman

10/12/2008 10:29:00
Quote Anchor link
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.
 
PHP Newbie

PHP Newbie

10/12/2008 12:44:00
Quote Anchor link
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".
 
Dennis Mertens

Dennis Mertens

10/12/2008 13:00:00
Quote Anchor link
Dat snap ik maar ik zie ook variabele in het Nederlands.
 
PHP Newbie

PHP Newbie

10/12/2008 16:53:00
Quote Anchor link
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...
 



Overzicht Reageren