Impressum · Kontakt · Hilfe
Besucher online · Mitglieder



Portal > Foren > PHP > PHP-Programmierung > Klassen für Eingabeüberprüfungen ?
Antwort
 
Themen-Optionen
Alt 30.01.2006, 15:06   Nach oben    #1
Erfahrener Benutzer
 
Benutzerbild von Doggi
 
Registriert seit: 26.10.2005
Ort: Basel
Beiträge: 115
Standard Klassen für Eingabeüberprüfungen ?

Ich fang grade mit OOP an und habe hier mal meine erste Klasse zur Prüfung einer Eingabe eines Formulars geschrieben.

Meine Frage: Ist dies überhaupt sinnvoll solche Überprüfungen in Form von Klassen zu realisieren?

Wenn ja, ist an der unten stehenden Klasse was auszusetzen?

OOP ist nicht gerade einfach zu verstehen wenn man gerade anfängt. Ich habe jede Menge Tutorials mehrmals gelesen und es immernoch nicht so richtig verstanden.

PHP-Code:
//-----------------------------------------------
//PLZ prüfen
class Plz {

    var 
$ergebnis "Bitte geben Sie eine Postleitzahl ein.";
    var 
$plzvon 39110;
    var 
$plzbis 39120;
    var 
$isPlz 00000;
    var 
$lengthplz  5;
//----------Plz setzen----------------------------------
 
function Plz($isPlz 00000)
    {
        
$this->setPlz($isPlz);
    }
//--------Plz ausgeben----------------------------------
       
function getPlz()
    {
        return 
$this->isPlz;
    }
//--------Ergebnis auswerten----------------------------------
   
function checkPlz()
    {
        if ((
strlen($this->isPlz) != $thist->lengthplz) OR (!is_int($this->isPlz)))
    {
       
$this->ergebnis "Das Format der eingegebenen Postleitzahl ist falsch!<br />"
        return 
$this->ergebnis;
    }elseif
     (    (
$this->isPlz $this->plzvon) OR
               (
$this->isPlz $this->plzbis) ){
        
        
$this->ergebnis 'Ihre angegebene Postleitzahl liegt nicht im gültigen Postleitzahlenbereich von "            '$this->plzvon.'" bis "'.$this->plzbis.'" !<br>'
    
    }else{
        
$this->ergebnis "true"
        
    }
    return 
$this->ergebnis;
}
//----------Ergebnis ausgeben----------------------------------
    
function getErgebnis()
    {
        return 
$this->ergebnis;
    }
//---------------Neue Plz setzen ----------------
    
function setPlz($neuePlz)
    {
        if (!
is_numeric($neuePlz)) {
            return 
false;
        }
        
$this->isPlz = (int)$neuePlz;
        return 
$this->isPlz;
    }
//-----------------------------------------

Getestet hab ich es. Es funktioniert auch.

Wenn es nicht sinnvoll ist solche Prüfungen in Klassen zu realisieren, was ist dann sinnvoll?
Jedesmal den code in die neue Seite einbinden ist auch blöd find ich.

Danke schonmal für eure Anregungen.
__________________
Wer später bremst, fährt länger schnell...

Geändert von Doggi (30.01.2006 um 15:09 Uhr).
Doggi ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 30.01.2006, 15:13   Nach oben    #2
Corvin Gröning
 
Benutzerbild von Corvin
 
Registriert seit: 19.03.2005
Ort: S-H | Flensburg
Beiträge: 449
Standard

Falls du mit PHP5 arbeitest, solltest du die Zugriffsspezifizierer (anstelle von var und vor function) verwenden.
http://www.php.net/manual/de/languag...visibility.php
__________________
Corvin ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 30.01.2006, 15:21   Nach oben    #3
Erfahrener Benutzer
 
Benutzerbild von Doggi
 
Registriert seit: 26.10.2005
Ort: Basel
Beiträge: 115
Standard

danke, werds mir mal durchlesen. dachte das gilt nur für php5 und da das nicht auf jedem server läuft dachte ich einfach, ich lass es weg
__________________
Wer später bremst, fährt länger schnell...

Geändert von Doggi (30.01.2006 um 15:23 Uhr).
Doggi ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 30.01.2006, 15:25   Nach oben    #4
Ben
Erfahrener Benutzer
 
Benutzerbild von Ben
 
Registriert seit: 02.12.2004
Ort: Remagen
Beiträge: 4.619
Standard

Es gilt auch nur für PHP 5.
Ben ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 30.01.2006, 15:37   Nach oben    #5
Corvin Gröning
 
Benutzerbild von Corvin
 
Registriert seit: 19.03.2005
Ort: S-H | Flensburg
Beiträge: 449
Standard

Habe ich doch auch geschrieben
__________________
Corvin ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 30.01.2006, 15:37   Nach oben    #6
Erfahrener Benutzer
 
Benutzerbild von Doggi
 
Registriert seit: 26.10.2005
Ort: Basel
Beiträge: 115
Standard

ZITAT:
Zitat:
Methoden ohne jede Deklaration sind als public definiert.
insofern kann ich mir doch ein public sparen oder?

was ändert sich eigentlich wenn ich checkPlz auf private oder protected setze?

ist dann die Methode nur innerhalb Klasse aufrufbar? (vielleicht blöd formuliert)

ist dann die Methode nicht direkt vom script abrufbar?

wenn checkPlz nun private wäre, würde dann ein

PHP-Code:
print $PLZ->checkPlz($_SESSION['plz']); 
nichts ergeben?

aber ein...

PHP-Code:
if ($PLZ->checkPlz($_SESSION['plz']) != "true")
{
    print 
$PLZ->getErgebnis();

würde ein ergebnis ausgeben?
__________________
Wer später bremst, fährt länger schnell...
Doggi ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 30.01.2006, 15:41   Nach oben    #7
Ben
Erfahrener Benutzer
 
Benutzerbild von Ben
 
Registriert seit: 02.12.2004
Ort: Remagen
Beiträge: 4.619
Standard

Nein.
Wenn eine Methode als private deklariert ist, dann kannst Du sie nur von innerhalb der Klasse aufrufen. Teste das mal aus .. Du wirst eine Fehlermeldung erhalten. Schau Dir das mal an .. ist gut, wenn man das mal gesehen hat.

Zur Klasse an sich. Ich denke, dass eine Klasse Plz unnötig ist. So wirklich was passiert da ja auch nicht.
Allerdings ist diese Aussage mit Vorsicht zu beachten, da ich ja gar nicht weiß, wie Du das alles organisiert hast.

Grüße Ben.
Ben ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 30.01.2006, 15:47   Nach oben    #8
Erfahrener Benutzer
 
Benutzerbild von Doggi
 
Registriert seit: 26.10.2005
Ort: Basel
Beiträge: 115
Standard

Ich werds gleich mal testen.

Zur Klasse. Ich bin grad am üben mit OOP und dachte mir, ich packe einfach alle Formularprüfungen und eine SQL-Injection-Schutz Klasse in eine class.php, die ich ja dann einfach überall einbinden kann ohne großartig den Code ändern zu müssen.

Das war zumindest meine Überlegung.

Ich möchte irgendwann ein eigenes Templatesystem basteln und da ist es doch praktisch wenn schon alles in Klassen vorhanden ist oder?

//EDIT: Habs getestet. Allerdings konnte ich keinen Unterschied zwischen protected und private feststellen. beide werfen einen Fehler wenn man direkt zugreift. (soweit verstanden)
es müsste doch innerhalb der klasse ein unterschied zwischen protected und private sein.
__________________
Wer später bremst, fährt länger schnell...

Geändert von Doggi (30.01.2006 um 15:53 Uhr).
Doggi ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 30.01.2006, 15:55   Nach oben    #9
Ben
Erfahrener Benutzer
 
Benutzerbild von Ben
 
Registriert seit: 02.12.2004
Ort: Remagen
Beiträge: 4.619
Standard

private ist nur innerhalb der eigenen Klasse verfügbar, auf mit protected deklarierte Methoden und Variablen kann auch in Subklassen (extends) zugegriffen werden.
Ben ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 30.01.2006, 16:09   Nach oben    #10
Erfahrener Benutzer
 
Benutzerbild von Doggi
 
Registriert seit: 26.10.2005
Ort: Basel
Beiträge: 115
Standard

Genau die Antwort hatte ich erwartet Nur wie herum war die Frage... Danke Dir.

//EDIT konkretisiert

Ansonsten ist gegen eine Klassenlösung nichts auszusetzen? Etwa evtl. auftretende Performanceprobleme gegenüber normalen Funktionen oder Abragen innerhalb des Scriptes?
__________________
Wer später bremst, fährt länger schnell...

Geändert von Doggi (30.01.2006 um 16:23 Uhr).
Doggi ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 30.01.2006, 16:21   Nach oben    #11
Ben
Erfahrener Benutzer
 
Benutzerbild von Ben
 
Registriert seit: 02.12.2004
Ort: Remagen
Beiträge: 4.619
Standard

Ich denke mal, dass Du Dir keine allzu großen Gedanken über Performance machen solltest. Das ist bei kleinen Applikationen zunächst mal vernachlässigbar. Umso komplexer das System, desto wichtiger werden aber Benchmarks .. das ist klar. Aber zunächst einfach mal wegschieben.

Ich persönlich hätte jetzt so etwas hier gebaut ... ohne darüber nachzudenken.
Wenn das Formular abgeschickt wurde wird die Methode validate() aufgerufen, welche dann intern alle möglichen Sachen überprüft.
Ich hätte jetzt auch gar keine Klasse Plz gebaut, sondern das irgendwie in eine Validationsklasse integriert.
Aber wie gesagt .. ich hab genau gar nicht darüber nachgedacht.

Grüße Ben.
Ben ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 30.01.2006, 16:54   Nach oben    #12
Erfahrener Benutzer
 
Benutzerbild von Doggi
 
Registriert seit: 26.10.2005
Ort: Basel
Beiträge: 115
Standard

Hmm... stimmt, man könnte alle Formularprüfungen in eine Klasse packen, allerdings ist diese Klasse dann nicht übertragbar auf andere Formulare.
Naja, da ich gerade am Anfang von OOP stehe, werd ich erstmal so weitermachen und für alles eine eigene Klasse basteln. Vielleicht kann man später noch optimieren oder zusammenfügen.

THX a lot.
__________________
Wer später bremst, fährt länger schnell...
Doggi ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 30.01.2006, 16:56   Nach oben    #13
Ben
Erfahrener Benutzer
 
Benutzerbild von Ben
 
Registriert seit: 02.12.2004
Ort: Remagen
Beiträge: 4.619
Standard

Hi, ich hab das so gemacht, dass ich jedem Formularfeld eine Regel hinzufügen kann .. somit ist das auch universell übertragbar .
Ben ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 30.01.2006, 17:42   Nach oben    #14
Erfahrener Benutzer
 
Benutzerbild von Doggi
 
Registriert seit: 26.10.2005
Ort: Basel
Beiträge: 115
Standard

wie hast du das mit den regeln gemacht?

sitze mal wieder dran. irgendwie finde ich immer fehler.

strpos versuche ich gerade, aber der ignoriert im string meine Zeichen wie ":}{[]"
escapen hab ich auch probiert. kein ergebnis.

PHP-Code:

$Zeichenkette 
"go:ogle@googlemail.com";
$Suchstring ':,[]\"';

if (
strpos ($zeichenkette$suchstring) !==false)
{
    echo 
"Zeichenkette vorhanden";
}
else 
{
    echo 
"Zeichenkette nicht vorhanden";

gibt bei mir else aus.
mit "," gehts.
__________________
Wer später bremst, fährt länger schnell...
Doggi ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 30.01.2006, 18:03   Nach oben    #15
Ben
Erfahrener Benutzer
 
Benutzerbild von Ben
 
Registriert seit: 02.12.2004
Ort: Remagen
Beiträge: 4.619
Standard

Ich werde jetzt wahrscheinlich von unseren Spezis zerrissen, aber okay .. *gg*

Meine nicht-fertige Formklasse
PHP-Code:
<?php

    
/**
     * 
     * QuickForm
     *
     * @author Benjamin Klaile <benjamin@klaile.com>
     * @version 0.4
     * @copyright Copyright &copy; 2005, Benjamin Klaile
     * @package classes.utilities
     */
     
    
class QuickForm {
        
         
/**
         * @access private
         * @var Configuration 
         *    
         * An instance of class Configuration. 
         */
        
protected $conf null;       
        
        
        
/**
         * @access private
         * @var SessionHandler
         * 
         * The current instance of class SessionHandler that was created in file autoload.inc.php
         */         
        
private $session null;              
        
        
        
/**
         * @access private
         * @var string
         * 
         * Variable holds the created HTML output.
         */
        
private $formHTML '';
        
        
        
/**
         * @access private
         * @var boolean
         * 
         * Is set to 'false' if the formular is not initialized yet. In other case to 'true'.
         */
        
private $initialized false;
           
    
        
/**
         * @access private
         * @var string
         * 
         * Filename of the file that contains the HTML form elements.
         * Default value can be changed from outside the class by using the 
         * 'setFormElementFile(string filename)'-method.
         * The file has to be located in the template folder.
         */
        
private $formElementFile 'form_elements.html'
        
        
        
/**
         * @access private
         * @var array 
         * 
         * Contains the form elements. The structure looks like this
         * 
         * Array (
         *      ['FORM']     => <form action="{ACTION}" method="post" {ID}>{FORM}</form>,
         *      ['FIELDSET'] => <fieldset><legend>{LEGEND}</legend>{FIELDSET}</fieldset>
         *      ...
         * )
         * 
         * The values for the 'template' keys is addicted to the content of the file 
         * form_elements.html
         */
        
private $formElements = array();
        
        
        
/**
         * @access private
         * @var string
         * 
         * This variable is temporarily filled with a parsed formular element if a label
         * is going to be added.
         */
        
private $bufferedElement '';
        
        
        
/**
         * @access private
         * @var array
         * 
         * This array contains all validation rules that have been assigned.
         */
        
private $rules = array();
        
      
        
/**
         * @access private
         * @var array
         * 
         * This array contains all error messages of the errors that occur.
         */
        
private $errors = array();
              
          
        
/**
         * @access private
         * @var array
         * 
         * The data of the _POST request.
         */  
        
private $input = array();
        

        
/**
         * @access private
         * @var array
         * 
         * The data of the _POST request that is correct.
         */  
        
private $validatedInput = array();       
  
  
        
/**
         * 
         * __construct()
         * 
         * @access public
         * 
         * A Configuration instance is created.
         */
        
public function __construct($session) {
            
$this->conf    ConfigurationManager::getConfiguration();
            
$this->session $session;
            
            if(!
is_null($this->session->getSessionVar('validationRules'))) {
                
$this->rules $this->session->getSessionVar('validationRules');
            }
            
            if(!
is_null($this->session->getSessionVar('validatedInput'))) {
                
$this->validatedInput $this->session->getSessionVar('validatedInput');
            }          
        }   


        
/**
         * 
         * initForm(string action, [mixed id])
         * 
         * @access public
         * @param string $action 
         *               The value of the action attribute of the form tag.
         * 
         * @param mixed $id [optional = null]
         * 
         * Some initial methods are called.
         */ 
        
public function initForm($action$id null) {
        
            
$this->loadFormElements();
            
$this->addForm($action$id);
            
$this->initialized true;        
        }


        
/**
         * 
         * loadFormElements()
         * 
         * @access private
         * 
         * Loads the formular HTML elements from a 
         */
        
private function loadFormElements() {
            
            
$filepath $this->conf->getTemplateDir() . $this->formElementFile;
            
            
$string_formElements file_get_contents($filepath);
            
$tmpFormElements = array();
            
$tmpFormElements explode("\n"$string_formElements);

            foreach(
$tmpFormElements as $key => $value) {
                
                
$elementInfo explode(': '$value