Empfehlungen: Erweiterte Suche

validierung der Eingabedaten funktioniert nicht

Datenbankobjekte strukturieren und validieren

validierung der Eingabedaten funktioniert nicht

Beitragvon Luckie » Fr 22. Mai 2009, 12:45

Ich habe folgenden View mit einem Formular:
Code: Alles auswählen
<!--
  // Project      : Blog Tutorial
  // Author       : Michael Puff http://www.michael-puff.de
  // Date         : 2009-05-22;
-->
  <h2>Anmeldung Adminpanel</h2>
  <br>
  <?php echo $form->create('User', array('action' => 'login'));?>
    <p>
      Benutzername:<br>
      <?php
        echo $form->input('username',                  
          array(           
            'label' => '',
            'error' => array
            (
              'required' => 'Bitte dieses Feld ausfüllen'          
            )
          )      
        );
      ?>
    </p>
 
    <p>
      Passwort:<br>
      <?php
        echo $form->input('password',
          array(           
            'label' => '',
            'error' => array
            (
              'required' => 'Bitte dieses Feld ausfüllen'          
            )
          )      
        )
      ;?>
    </p>
 
    <p>
      <?php echo $form->submit('Anmelden');?>
    </p>
 
  <?php echo $form->end();?>


Dazu das zugehörige Model:
Code: Alles auswählen
<?php
  // Project      : Blog Tutorial
  // Author       : Michael Puff http://www.michael-puff.de
  // Date         : 2009-05-22;
  class User extends AppModel
  {
    var $name = 'User';

    var $validate = array
    (
      'username' => array
        (        
          'required' => VALID_NOT_EMPTY
        ),
      'password' => array
        (        
          'required' => VALID_NOT_EMPTY
        )
    );
   
    function validateLogin($data)
    {
        $user = $this->find(array('username' => $data['username'], 'password' => $data['password']), array('id', 'username'));
        if(empty($user) == false)
            return $user['User'];
        return false;
    }
  }
?>


Und der Controller:
Code: Alles auswählen
<?php
  class UsersController extends AppController
  {
    var $name = 'Users';   
    var $helpers = array('Form');          
   
    function login()
    {        
        if(empty($this->data) == false)
        {
            if(($user = $this->User->validateLogin($this->data['User'])) == true)
            {
              $this->Session->write('User', $user);                                            
              $this->redirect('/posts/adminpanel');
              exit();
            }
            else
            {
              //$this->redirect('/posts/accessdenied');
              $this->Session->setFlash('Zugriff verweigert');              
              exit();
            }
        }      
    }
   
    function logout()
    {
        $this->Session->destroy('user');      
        $this->redirect('/posts');
    }  
  }
?>

Wenn ich jetzt die Eingabefelder leer lasse, komme ich zu einer leeren Seite nur mit der Debugausgabe für die Datenbankabfrage.

Aber warum funktioniert meine Validierung der Eingabefelder nicht?
Luckie
 
Beiträge: 115
Registriert: Fr 22. Mai 2009, 12:16
OS: Windows XP

Re: validierung der Eingabedaten funktioniert nicht

Beitragvon bjoern.etzold » Fr 22. Mai 2009, 15:16

Du muss im User-Controller dem Model die Daten übergeben und die Validierungfunktion manauell aufrufen.
Code: Alles auswählen
$this->User->validates($this->data);


Und deine Validierungsfunktion musst du als in der Definierung der Klassenvariable validate aufrufen.

Code: Alles auswählen

var $validate = array(
           ‘username’ => array(
               ‘rule’ => array(’NameDeinerFunktion’,'username’)
           )
);


Oder so ähnlich von der Syntax her. Denn die normale Validierung wird nur aufgerufen, bei Save etc.
bjoern.etzold
 
Beiträge: 8
Registriert: Mi 20. Mai 2009, 10:51

Re: validierung der Eingabedaten funktioniert nicht

Beitragvon Luckie » Mo 25. Mai 2009, 09:44

Danke schon mal für die Antwort, besonders für den letzten Satz. Das muss man ja erstmal wissen. In dem Tutorial, was ich gelesen habe, stand dazu nämlich nichts.

Ich habe im Model jetzt folgendes:
Code: Alles auswählen
class User extends AppModel
  {
    var $name = 'User';

    var $validate = array
    (
      'username' => array
      (
        'rule' => array(doValidate, 'username')
      ),
      'password' => array
      (
        'rule' => array(doValidate, 'password')
      )
    );
   
    var $doValidate = array
    (
      'username' => array
        (        
          'required' => VALID_NOT_EMPTY
        ),
      'password' => array
        (        
          'required' => VALID_NOT_EMPTY
        )
    );
   
    function validateLogin($data)
    {
        $user = $this->find(array('username' => $data['username'], 'password' => $data['password']), array('id', 'username'));
        if(empty($user) == false)
            return $user['User'];
        return false;
    }
  }


Und der aufruf im Controller:
Code: Alles auswählen
function login()
    {        
        if(empty($this->data) == false)
        {
            $this->User->validate($this->data);
            if(($user = $this->User->validateLogin($this->data['User'])) == true)
            {
              $this->Session->write('User', $user);                                            
              $this->redirect('/posts/adminpanel');
              exit();
            }
            else
            {
              //$this->redirect('/posts/accessdenied');
              $this->Session->setFlash('Zugriff verweigert');              
              exit();
            }
        }      
    }


Wird das Formular jetzt aufgerufen kommt die meldung>
Notice (8): Use of undefined constant doValidate - assumed 'doValidate' [CORE\cake\libs\class_registry.php, line 140]

Und schicke ich es leer ab:
Notice (8): Use of undefined constant doValidate - assumed 'doValidate' [CORE\cake\libs\class_registry.php, line 140]

Warning (512): SQL Error: 1064: You have an error in your SQL syntax;
Luckie
 
Beiträge: 115
Registriert: Fr 22. Mai 2009, 12:16
OS: Windows XP

Re: validierung der Eingabedaten funktioniert nicht

Beitragvon bjoern.etzold » Mo 25. Mai 2009, 09:46

In der Validierung muss der Funktionsname ein String sein, bei dir ist er eine Konstante
bjoern.etzold
 
Beiträge: 8
Registriert: Mi 20. Mai 2009, 10:51

Re: validierung der Eingabedaten funktioniert nicht

Beitragvon Luckie » Mo 25. Mai 2009, 10:09

Ächtz, was ist das für eine komische Sprache, in der Funktionsreferenzen als Zeichenketten übergeben werden?

OK, bleibt noch der zweite Fehler übrig:
SQL Error: 1064: You have an error in your SQL syntax;

Query: doValidate
Luckie
 
Beiträge: 115
Registriert: Fr 22. Mai 2009, 12:16
OS: Windows XP

Re: validierung der Eingabedaten funktioniert nicht

Beitragvon Luckie » Di 26. Mai 2009, 11:57

So, ich denke, ich habe es hinbekommen:
Model:
Code: Alles auswählen
var $isDataValid = array
    (
      'username' => array
        (        
          'required' => VALID_NOT_EMPTY
        ),
      'password' => array
        (        
          'required' => VALID_NOT_EMPTY
        )
    );(/code]

Controller:
[code]if(empty($this->data) == false)
        {
            $this->User->set($this->data);
            if ($this->User->isDataValid())
            {
              if(($user = $this->User->validateLogin($this->data['User'])) == true)
              {
                $this->Session->write('User', $user);                                              
                $this->redirect('/posts/adminpanel');
                exit();
              }
              else
              {
                $this->redirect('/pages/accessdenied');
                //$this->Session->setFlash('Zugriff verweigert');              
                exit();
              }
            }
            else
            {
              $this->Session->setFlash('Eingaben unvollständig');
            }
        } [/code]

Allerdinsg soll er mir jetzt noch den Fehlertext unter den entsprechenden Feldern ausgeben, den ich im Formular festgelegt habe:
[code]<?php echo $form->create('User', array('action' => 'login'));?>
    <p>
      Benutzername:<br>
      <?php
        echo $form->input('username',                  
          array(
            'div' => false,      
            'label' => '',
            'error' => array
            (
              'required' => 'Bitte dieses Feld ausfüllen'          
            )
          )      
        );
      ?>
    </p>
 
    <p>
      Passwort:<br>
      <?php
        echo $form->input('password',
          array(
            'div' => false,      
            'label' => '',
            'error' => array
            (
              'required' => 'Bitte dieses Feld ausfüllen'          
            )
          )      
        )
      ;?>
    </p>
 
    <p>
      <?php echo $form->submit('Anmelden');?>
    </p>

Wie bekomme ich das noch hin?

Ach ja, im Debugmodus zeigt er mir immer ein SQL-Fehler an, der aber nicht weiter zu stören scheint.
Luckie
 
Beiträge: 115
Registriert: Fr 22. Mai 2009, 12:16
OS: Windows XP

Re: validierung der Eingabedaten funktioniert nicht

Beitragvon dth33 » Di 26. Mai 2009, 14:17

Hi

also ich validiere immer wie folgt:

Code: Alles auswählen

    var $validate = array (

        'belegnummer' => array (
            'uniqueRule' => array (
                'rule' => 'isUnique',
                'message' => 'Die Belegnummer existiert bereits.'
            ),
            'rangeRule' => array (
                'rule' => array ('between', 4, 25),
                'message' => 'Die Belegnummer darf zwischen 4 und 25 Zeichen lang sein.'
            ),
            'alphanumericRule' => array (
                'rule' => 'alphaNumeric',
                'message' => 'Die Belegnummer darf keine Sonderzeichen enthalten.'
            ),
            'notEmptyRule' => array (
                'rule' => 'notEmpty',
                'required' => true,
                'message' => 'Bitte geben Sie eine Belegnummer ein.'
            )
        ),

      usw....

 


Die Fehlermeldung (Message) wird so unter die Felder geschrieben.

Und bitte nicht noch ein Blog-Tutorial. Macht doch mal was anderes. Ich kann die Dinger nicht mehr sehen.

Gruß Steffen
dth33
 
Beiträge: 33
Registriert: Do 22. Jan 2009, 15:38
Wohnort: Am schönen Niederrhein
CakePHP-Version: 1.3
OS: Win32

Re: validierung der Eingabedaten funktioniert nicht

Beitragvon Luckie » Di 26. Mai 2009, 14:38

Also du machst das im Model. Ich habe die Fehlermeldungen im View im Formular. Aber muss ich da nicht noch was im else-Zweig im Controller machen?

Dsa Blog-Tutorial habe ich als erstes gefunden. Aber ich habe hier auch ein Buch von O'Reilly. Leider scheint das an diesem Punkt auch etwas unvollständig zu sein.
Luckie
 
Beiträge: 115
Registriert: Fr 22. Mai 2009, 12:16
OS: Windows XP

Re: validierung der Eingabedaten funktioniert nicht

Beitragvon dth33 » Di 26. Mai 2009, 15:36

Das Buch von Ammelburger / Scherer ist wirklich nur zu empfehlen. Ich glaube nicht, dass das Werk zum Thema Validierung unvollständig ist (Seiten 65 ff.).

Klar mach ich das im Model. Die Fehlermeldung erscheint dann automatisch unter dem Feld im View. Um bei meinem Beispiel zu bleiben: gibt jemand eine Belegnummer ein, die bereits existiert, wird der Datensatz nicht gespeichert und es wird die in Message abgelegte Meldung ausgegeben. Im Controller mach ich dafür gar nix. Steht aber auch alles in dem Buch.
dth33
 
Beiträge: 33
Registriert: Do 22. Jan 2009, 15:38
Wohnort: Am schönen Niederrhein
CakePHP-Version: 1.3
OS: Win32

Re: validierung der Eingabedaten funktioniert nicht

Beitragvon euromark » Di 26. Mai 2009, 16:09

@dth33

required = true
ist äußert gefährlich als Validierungsregel!

damit verbaust du dir normalerweise, dass du per ajax einzelne felder editieren kannst etc
jeder einzelne update/insert query muss dieses feld "belegnummer" enthalten, ansonsten validiert das Model den Input als "false"
euromark
 
Beiträge: 643
Registriert: Fr 27. Jun 2008, 22:17
Wohnort: München
CakePHP-Version: 2.x
OS: Windows

Nächste

Zurück zu Models

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 2 Gäste