password vergelijken met confirm

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Pagina: 1 2 volgende »

Krist Ensing

Krist Ensing

21/08/2013 19:37:57
Quote Anchor link
Hallo,

Ik wil in een validator wachtwoord en wachtwoordbevestiging met elkaar vergelijken.
In eerte instantie zijn ze in de constructor geset:

(hieronder volgt code met daarin opmerkingen en vragen, omdat ik de eindtag van
\[code\] niet ken...

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
$password = new PasswordElement(array(
            'name' => 'password',
            'label' => 'wachtwoord: ',
            'value' => isset($_GET['password']) ? $_GET['password'] : '',
            'validators' => array(
                new StringLengthValidator(array('min' => 3, 'minError' => 'Het wachtwoord is te kort', 'max' => 12, 'maxError' => 'Het wachtwoord is te lang'))
            ),
            'filters' => array(
                new FilterStripTags(),
                new FilterTrim())
        ));

        $confirm = new PasswordElement(array(
            'name' => 'confirm',
            'label' => 'bevestigen wachtwoord: ',
            'value' => isset($_GET['confirm']) ? $_GET['confirm'] : '',
            'validators' => array(
                new PasswordValidator(array()),
                ),
            'filters' => array(
                new FilterStripTags(),
                new FilterTrim())  


De password validator ziet er als volgt uit:



class PasswordValidator extends AbstractValidator {


    public function isValid($value) {
        $confirm = $_GET['confirm'];
        $password= $_GET['password'];
        
        if ($confirm === $password)  {
       return true;
          
        } else {
            $this->_messages[] = 'De wachtwoorden zijn niet gelijk aan elkaar';
            return false;
        }
    }
}


Dit heeft echter niet het gewenste effect.
Ook geeft de editor als comentaar: Multiple annotations here.

Wat gaat er fout?????
Gewijzigd op 21/08/2013 19:39:32 door Krist Ensing
 
PHP hulp

PHP hulp

15/05/2024 04:22:59
 
Eddy E

Eddy E

21/08/2013 20:24:00
Quote Anchor link


't Is net HTML ;)


Ik zie dat je het wachtwoord via $_GET verstuurd. Dat is niet echt handig. Doe dat liever via $_POST.
Je vergelijking is wel goed.
 
Krist Ensing

Krist Ensing

21/08/2013 20:54:56
Quote Anchor link
Ja Eddy, ik zet uiteindelijk ook alles op POST, maar voor de controle is het handig in de url te zien, welke waardes worden meegegeven.

Maar als ik de form method ook op get hebt staan zou de vergelijking het toch moeten doen?
 
Ward van der Put
Moderator

Ward van der Put

22/08/2013 08:51:24
Quote Anchor link
Je controleert hier niet of $_GET['confirm'] en $_GET['password'] wel bestaan. Zou je de error reporting aanzetten, dan zie je daarvoor de waarschuwing "Notice: Undefined index":

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
<?php
        $confirm
= $_GET['confirm'];
        $password= $_GET['password'];
        
        if ($confirm === $password) {
            return true;
        }

?>


Zijn beide niet ingesteld, dan wordt dit vervolgens toch true.
 
Krist Ensing

Krist Ensing

22/08/2013 09:03:06
Quote Anchor link
Wat leuk dat je reageert Ward van de Put! Het kookboek ligt naast mijn computer :)
Hoe zou ik wel de waardes van confirm en password kunnen vergelijken. De code bovenaan is de constructor en in onderstaande codede heb de html code gerenderd:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
class PasswordElement extends Element {

    public function render()
    {
        $html = '';
        $html .= '<label>' . $this->label;
        $html .= "<input type=\"password\" value='$this->value'   name='$this->name' $this->attribs>";
        $html .= "</label>";
        return $html;
    }
}
?>


Hopelijk kun je me helpen, want ik heb al op een aantal manieren getracht de waarden op te vragen en te vergelijken.
Gewijzigd op 22/08/2013 09:11:57 door Krist Ensing
 
Ward van der Put
Moderator

Ward van der Put

22/08/2013 09:12:09
Quote Anchor link
Zonder de extra spaties: [ c o d e ] ... [ / c o d e ] met een slash in de eindtag.

Je hebt een class PasswordValidator extends AbstractValidator voor validaties. Dan is het, denk ik, zinvol om een isset() in te bouwen in de hoofdklasse AbstractValidator: wat er niet is, kun je immers niet valideren. En dat geldt voor alle afgeleide klassen.
 
Krist Ensing

Krist Ensing

22/08/2013 09:15:59
Quote Anchor link
Waar moet die dan komen (ik ben echt een beginneling):
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
abstract class AbstractValidator implements Validator {

    protected $_options;
    protected $_messages;

    public function __construct(array $options)
    {
        $this->_messages = array();
        $this->_options = $options;
    }

    public function getMessages()
    {
        return $this->_messages;
    }

}


moet er dan komen isset($this->options); in de functie __construct?
 
Ward van der Put
Moderator

Ward van der Put

22/08/2013 09:26:19
Quote Anchor link
Wat zijn options? Alles is een optie, probeer dat concreter te maken.

Je geeft hier een $value door, maar gebruikt die helemaal niet:

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
<?php
    public function isValid($value) {
        $confirm = $_GET['confirm'];
        $password= $_GET['password'];
        
        if ($confirm === $password)  {
       return true;
          
        }
else {
            $this->_messages[] = 'De wachtwoorden zijn niet gelijk aan elkaar';
            return false;
        }
    }

?>


In de ouderklasse kun je een public function isValid($value) toevoegen die elke validatie eindigt met false zodra $value ontbreekt of leeg is. Afgeleide klassen kunnen daaraan vervolgens specifieke validaties toevoegen.
 
Krist Ensing

Krist Ensing

22/08/2013 09:34:10
Quote Anchor link
De functie <strong> public function isValid($value)</strong> zit al in de Interface boven de ouderklasse:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
<?php
interface Validator {


    public function isValid($value);

    public function getMessages();

}[
/code]
Ik kan toch niet in deze validater if($value===$value gebruiken) ???
 
Ward van der Put
Moderator

Ward van der Put

22/08/2013 09:44:34
Quote Anchor link
In de meeste validaties gebruik je één waarde.

Voor de wachtwoorden borduur je daarop voort met een uitzondering: je wilt niet alleen beide waarden apart valideren, maar ook of ze aan elkaar gelijk zijn.

Met andere woorden, zoiets als isset() geldt voor alle validaties en plaats je in een hoge klasse. In de afgeleide klasse voor wachtwoorden voeg je daaraan validaties toe die exclusief voor wachtwoorden gelden. Denk bijvoorbeeld ook aan regels uit je wachtwoordbeleid, zoals de minimumlengte van wachtwoorden.
 
Krist Ensing

Krist Ensing

22/08/2013 09:48:33
Quote Anchor link
Kun je me in de code van de AbstractValidator laten zien hoe deze eruit moet zien:
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
abstract class AbstractValidator implements Validator {

    protected $_options;
    protected $_messages;

    public function __construct(array $options)
    {
        $this->_messages = array();
        $this->_options = $options;
    }

    public function getMessages()
    {
        return $this->_messages;
    }

}
 
Ward van der Put
Moderator

Ward van der Put

22/08/2013 09:58:21
Quote Anchor link
Wat wil je met de array $options gaan doen? Wat zit er in die array?
 
Krist Ensing

Krist Ensing

22/08/2013 10:03:12
Quote Anchor link
setOptions in de astract class Element. Daar wordt volgens mij al gedaan waar jij het over hebt (isset).

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
public function setOptions(array $options)
    {
        $this->name = isset($options['name']) ? $options['name'] : 'standaardnaam'; //eigenlijk moet de naam worden getest; niet alle namen zijn volgens de HTML-specs toegestaan!
        $this->label = isset($options['label']) ? $options['label'] : 'label';
        $this->value = isset($options['value']) ? $options['value'] : '';
        $this->attribs = isset($options['attribs']) ? $options['attribs'] : '';
        if (isset($options['validators']) && is_array($options['validators'])) {
            foreach ($options['validators'] as $validator) {
                $this->addValidator($validator);
            }
        }

De classe element wordt vervolgens weer aangerepen om html te renderen, bijvoorbeeld in password:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
lass PasswordElement extends Element {

    public function render()
    {
        $html = '';
        $html .= '<label>' . $this->label;
        $html .= "<input type=\"password\" value='$this->value'   name='$this->name' $this->attribs>";
        $html .= "</label>";
        return $html;
    }
}
 
Ward van der Put
Moderator

Ward van der Put

22/08/2013 10:17:50
Quote Anchor link
Voor de validatie van input heb je geen compleet HTML-element nodig. Bovendien zitten de ingevoerde wachtwoorden helemaal niet in het HTML-element. Je kunt input en output beter strikt scheiden.
 
Krist Ensing

Krist Ensing

22/08/2013 10:27:17
Quote Anchor link
Kun je me misschien helpen met wat code, waar ik iets aan heb?
 
Ward van der Put
Moderator

Ward van der Put

22/08/2013 10:39:10
Quote Anchor link
Laten we het probleem eerst vereenvoudigen. Stel dat je dit wilt doen:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
<?php
// Array GET doorgeven voor $_GET['password'] en $_GET['confirm']
$obj = new PasswordValidator();
$pass = $obj->isValid($_GET);
?>


Dan wordt $value in de algemene functie isValid($value) een array en krijg je zoiets:

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
<?php
class PasswordValidator extends AbstractValidator
{
    public function isValid($value)
    {

        if (!is_array($value)) {
            $this->_messages[] = 'Deze methode vereist een array';
            return false;
        }


        if (!isset($value['password']) || !isset($value['confirm'])) {
            $this->_messages[] = 'Een van beide wachtwoorden ontbreekt';
            return false;
        }


        $value['password'] = trim($value['password']);
        $value['confirm'] = trim($value['confirm']);
        if (empty($value['password']) || empty($value['confirm'])) {
            $this->_messages[] = 'Een van beide wachtwoorden is leeg';
            return false;
        }

 
        if ($value['password'] === $value['confirm']) {
            return true;
        }
else {
            $this->_messages[] = 'De wachtwoorden zijn niet gelijk aan elkaar';
            return false;
        }
    }
}

?>


Er schort nog een en ander aan, maar maak je objectmodel niet te complex.
Gewijzigd op 22/08/2013 10:41:21 door Ward van der Put
 
Krist Ensing

Krist Ensing

22/08/2013 10:45:26
Quote Anchor link
Kan ik het bovenste deel van je code, dus
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
$obj = new PasswordValidator();
$pass = $obj->isValid($_GET);

Gewoon in de het regstratieformulier onder de constructor van password en confirm zetten?
 
Kris Peeters

Kris Peeters

22/08/2013 10:53:15
Quote Anchor link
(EDIT: ondertussen heb je dit net gedaan :) )

Ik ben absoluut niet de referentie wat OOP betreft; dus neem het voor wat het waard is ...

Ik hoor anderen dan mezelf dit weinig zeggen; maar als je met OOP bezig bent, begin dan niet met je class te schrijven. Begin buiten de claas.

Begin ze te gebruiken alsof alles werkte.
Alles wat je nodig hebt buiten de class, wordt binnen de class op public gezet; al de rest op private (of protected...).

Dus, wil je even tonen wat je dot buiten de class?
Wat doe je met $password en $confirm?
( $password = new PasswordElement ... )
Gewijzigd op 22/08/2013 10:54:02 door Kris Peeters
 
Ward van der Put
Moderator

Ward van der Put

22/08/2013 10:54:58
Quote Anchor link
Je kunt nu met $pass bijvoorbeeld een if-beslissingsregel inbouwen: deze is true of false.

Wel schort er nog wat aan het objectmodel. PasswordValidator() is nu (extern) afhankelijk van het bestaan van de keys 'password' en een 'confirm' in een array. Dat kun je netter formaliseren door door te geven welke keys de validatie kan verwachten.

Verder moet er nog een wachtwoordbeleid in en eventueel een databasecontrole: bijvoorbeeld 1 == 1 is nu namelijk ook geldig.
 
Kris Peeters

Kris Peeters

22/08/2013 10:58:38
Quote Anchor link
Ward van der Put op 22/08/2013 10:54:58:
... PasswordValidator() is nu (extern) afhankelijk van het bestaan van de keys 'password' en een 'confirm' in een array. ...


Ja, vind ik ook.
Dit zou beter zijn

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
<?php
$obj
= new PasswordValidator();
$passwordIsValid = $obj->isValid($_GET, array('password', 'confirm'));
?>
 
Krist Ensing

Krist Ensing

22/08/2013 11:02:38
Quote Anchor link
Maar moet ik deze code (het stukje hierboven) overnemen in de constructor van password of confirm of ergens anders?
 

Pagina: 1 2 volgende »



Overzicht Reageren

 
 

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.