Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Samsung Micro RGB R95H, il primo LCD a LED rossi, verdi e blu di Samsung alla prova del banco di misura
Samsung Micro RGB R95H, il primo LCD a LED rossi, verdi e blu di Samsung alla prova del banco di misura
Il primo Micro RGB di Samsung per il salotto è il 65 pollici da 2.749 euro. Sul banco di misura abbiamo rilevato 2.000 nit di picco, nero assoluto con il local dimming e il 91,4% del BT.2020, il colore più ampio che abbiamo misurato su un LCD
iPhone 18 Pro: la recensione del miglior iPhone compatto di sempre
iPhone 18 Pro: la recensione del miglior iPhone compatto di sempre
Apple ha rinnovato iPhone 18 Pro soprattutto dentro: chip A20 Pro a 2 nm con memoria affiancata al SoC, camera di vapore tre volte più ampia, Dynamic Island più piccola del 25% grazie a Face ID sotto il display e fotocamera principale con diaframma variabile da f/1.48 a f/4. Lo abbiamo misurato al colorimetro e nei benchmark, usato con iOS 27 e messo alla prova in fotografia tra laghi, borghi e interni poco illuminati
Panasonic, 30 anni di Toughbook: la "Bibbia" di mille regole dietro i nuovi G3 e 34
Panasonic, 30 anni di Toughbook: la "Bibbia" di mille regole dietro i nuovi G3 e 34
A Londra, per il trentennale dei Toughbook, Panasonic ha presentato il tablet G3 e il 2-in-1 34. Con Jon Tucker, a capo dell'ingegneria europea, abbiamo parlato di ciò che non si vede: batterie, antenne, porte seriali e accorgimenti nati sul campo
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 07-09-2007, 11:52   #1
andbin
Senior Member
 
L'Avatar di andbin
 
Iscritto dal: Nov 2005
Messaggi: 5206
[PHP] Gestione e validazione dei dati di un form

Premessa

Devo gestire un form un pochino più complesso dei "soliti" form di contatto che ho già fatto diverse volte in passato.
Dal momento che la gestione e la validazione dei dati di un form è una cosa abbastanza noiosa che ho già fatto svariate volte e che in futuro farò certamente altre volte, stavo pensando di realizzare un piccolo framework di classi specifiche per PHP 5 (tanto PHP 4 se non è ancora morto, lo sarà a breve tempo...).
Pensavo di fare una classe base FormField e poi una serie di classi derivate, ognuna per gestire un tipo specifico di campo (di testo, di testo per una email, di <select>, di password, ecc....). Più eventualmente alcune classi di utility e per tenere dati "globali".

In genere la gestione/validazione la faccio con del codice PHP un pochino, per così dire, sparpagliato.

Codice:
if (isset ($_POST['blabla']))
{
    $blabla = $_POST['blabla'];
    .....
}

e poi nel corpo del <form> faccio cose del tipo:

Codice:
<input type="text" name="blabla" size="40" maxlength="40" value="<?php echo htmlspecialchars ($blabla, ENT_QUOTES); ?>">
Indubbiamente molto noioso. Ma ancora più noioso quando ci sono delle <select> con le sue <option>, in quanto per ognuna delle option devo stabilire se è quella a cui mettere l'attributo 'selected'.


Il framework

Al momento ho già scritto 2 classi, quella base e una sottoclasse. Sono solo un abbozzo per il momento, ma funzionano.
Ecco il codice:

Codice PHP:
abstract class FormField
{
    private 
$name;
    private 
$value;
    private 
$submitted;
    private 
$required;
    private 
$attributes;

    function 
__construct ($name, $required, $defvalue="")
    {
        
$this->name = $name;
        
$this->required = $required ? TRUE : FALSE;
        
$this->attributes = array ();

        if (isset (
$_POST[$this->name]))
        {
            
$this->submitted = TRUE;

            if (
get_magic_quotes_gpc ())
                
$this->value = stripslashes ($_POST[$this->name]);
            else
                
$this->value = $_POST[$this->name];
        }
        else
        {
            
$this->submitted = FALSE;
            
$this->value = $defvalue;
        }
    }

    function 
getName () { return $this->name; }
    function 
getValue () { return $this->value; }
    function 
isSubmitted () { return $this->submitted; }
    function 
isRequired () { return $this->required; }

    function 
isValid ()
    {
        if (!
$this->isSubmitted ())
            return !
$this->isRequired ();
        else
            return 
$this->validate ();
    }

    function 
validate () { return TRUE; }

    function 
addAttribute ($name, $value)
    {
        
$this->attributes[(string) $name] = (string) $value;
    }

    function 
outputHTML () { }

    protected function 
outputAttributes ()
    {
        
$a = "";

        foreach (
$this->attributes as $k => $v)
        {
            if (
$a != "")
                
$a .= " ";

            
$a .= $k . "=\"" . htmlspecialchars ($v, ENT_QUOTES) . "\"";
        }

        return 
$a;
    }
}


class 
EmailFormField extends FormField
{
    function 
__construct ($name, $required, $size, $maxlength, $defvalue="")
    {
        
parent::__construct ($name, $required, $defvalue);
        
$this->addAttribute ("size", (int) $size);
        
$this->addAttribute ("maxlength", (int) $maxlength);
    }

    function 
validate ()
    {
        if (
eregi ("^[a-z0-9\._-]+@[a-z0-9\._-]+(\.[a-z]{2,3}){1,2}$", $this->getValue ()))
            return 
TRUE;
        else
            return 
FALSE;
    }

    function 
outputHTML ()
    {
        echo 
"<input type=\"text\" name=\"" .
             
htmlspecialchars ($this->getName (), ENT_QUOTES) .
             
"\" " . $this->outputAttributes () . " value=\"" .
             
htmlspecialchars ($this->getValue (), ENT_QUOTES) .
             
"\">\r\n";
    }
} 
A quel punto in una pagina php mi basterebbe scrivere:

Codice:
$fld_email = new EmailFormField ("email", TRUE, 30, 60);

....uso isValid().....


<form .....>
<?php $fld_email->outputHTML (); ?>
E mi sembra che sia già molto più semplice e pulito. Che ne pensate?

Ci sarebbero poi delle informazioni, da memorizzare in qualche modo, che riguardano la pagina nella sua globalità, cioè ad esempio: il charset utilizzato o se la pagina è HTML o XHTML o ancora la sequenza di newline da mandare in output. Potrei fare una classe con campi statici accessibili tramite getter/setter.
Ma ci sarebbero anche informazioni relative al form: potrei volerlo inviare come GET piuttosto che come POST. In tal caso stavo pensando di creare una classe che contiene le informazioni su un form. Visto che in uno script gestisco solo un form per request, pensavo di usare anche qui dei campi static con getter/setter.

In definitiva: avete idee, suggerimenti? Cosa ne pensate delle mie scelte? Mi interessa più che altro capire se il "design" è quello giusto oppure se è una delle classiche scemenze che scrivo.
Se poi avete esperienze specifiche riguardo la validazione di form in PHP, magari se avete usato dei framework già pronti per queste cose, fatemi sapere.

Naturalmente, ringrazio fin da ora per qualunque risposta.
__________________
Andrea, Senior Java developer – SCJP 5 (91%) • SCWCD 5 (94%)
Java Versions Cheat Sheet
andbin è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Samsung Micro RGB R95H, il primo LCD a LED rossi, verdi e blu di Samsung alla prova del banco di misura Samsung Micro RGB R95H, il primo LCD a LED rossi...
iPhone 18 Pro: la recensione del miglior iPhone compatto di sempre iPhone 18 Pro: la recensione del miglior iPhone ...
Panasonic, 30 anni di Toughbook: la "Bibbia" di mille regole dietro i nuovi G3 e 34 Panasonic, 30 anni di Toughbook: la "Bibbia...
realme C100x, lo smartphone economico con la batteria da 7500 mAh. La recensione realme C100x, lo smartphone economico con la bat...
Star Wars Zero Company è l'erede di XCOM 2 Star Wars Zero Company è l'erede di XCOM ...
La NFL arriva in Europa con i London Gam...
Uno sviluppatore ha usato iPhone come se...
L'AI di OpenAI scoperta a barare: GPT-6 ...
Gli utenti di ChatGPT potranno provare v...
Scende a 692€ Samsung Galaxy S26 256GB i...
Instagram ha lanciato un assistente IA p...
Samsung Galaxy S26 Ultra scontato di 500...
Samsung prepara il lancio di un nuovo Go...
Apple: John Ternus assume il controllo d...
PS5 Slim cambia ancora: Sony introduce u...
Cultura 'rotta' e sicurezza sotto accusa...
Android Auto, il nuovo lettore porta in ...
I nuovi MacBook con display OLED potrebb...
Windows 11: l'aggiornamento KB5124010 fa...
iPhone Duo, la pellicola protettiva del ...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 08:00.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Served by www3v