Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Peugeot Polygon Concept: ecco il futuro delle utilitarie
Peugeot Polygon Concept: ecco il futuro delle utilitarie
Polygon è la concept car di Peugeot che mostra il futuro delle soluzioni del segmento B: tra design compatti e innovativi affiancati da dimensioni compatte uno scherzo dalla manovrabilità incredibile per le manovre a bassa velocità
Reno16 Pro: il compatto di OPPO punta su fotocamera da 200MP e il nuovo Bubble! La recensione
Reno16 Pro: il compatto di OPPO punta su fotocamera da 200MP e il nuovo Bubble! La recensione
OPPO ha portato in Italia, dal 1° luglio 2026, Reno16 Pro: display AMOLED da 6,32 pollici a 144Hz, tripla fotocamera con sensore principale da 200 megapixel, chip Dimensity 8550 Super e batteria da 6000mAh, al prezzo di lancio di 899 euro. Lo abbiamo provato per due settimane insieme al nuovo accessorio Bubble, per capire se la formula compatta della serie regge ancora di fronte a un listino da 1099 euro
 Hisense 55U7SE: tuttofare e accessibile, il MiniLED per film, sport e gioco
Hisense 55U7SE: tuttofare e accessibile, il MiniLED per film, sport e gioco
MiniLED di fascia media con local dimming a 192 zone, 144 Hz nativi e audio firmato Devialet. La prova strumentale riscontra colori affidabili e gaming reattivo, per un prodotto molto accessibile e convincente. Ma la soundbar aggiuntiva è quasi d'obbligo
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 ($vENT_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 developerSCJP 5 (91%) • SCWCD 5 (94%)
Java Versions Cheat Sheet
andbin è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Peugeot Polygon Concept: ecco il futuro delle utilitarie Peugeot Polygon Concept: ecco il futuro delle ut...
Reno16 Pro: il compatto di OPPO punta su fotocamera da 200MP e il nuovo Bubble! La recensione Reno16 Pro: il compatto di OPPO punta su fotocam...
 Hisense 55U7SE: tuttofare e accessibile, il MiniLED per film, sport e gioco Hisense 55U7SE: tuttofare e accessibile, il Min...
Kindle Scribe Colorsoft: riduce le cornici e diventa a colori, ma il prezzo è alto Kindle Scribe Colorsoft: riduce le cornici e div...
L'IA cambia tutte le regole della sicurezza tra vulnerabilità e sorveglianza. Intervista al CEO di Proofpoint L'IA cambia tutte le regole della sicurezza tra ...
SpaceX Starship: Ship 40 ha eseguito un ...
Redmi Note 17 a un passo dal debutto, ma...
Gli aumenti di prezzo del PS Plus potreb...
Almeno 64 GB di RAM per giocare? Il caso...
Gemini si integrerà con le auto e potrà ...
Addio a OxygenOS di OnePlus e alla Realm...
Intel conferma l'aumento dei prezzi su C...
In vendita Withings BodyFit, molto più d...
Inkterface: Steam Machine ospita un pann...
Stare seduti oltre 30 minuti di fila aum...
A Milano l'Italia ha firmato la sovranit...
Cos'è PeerTube, la piattaforma di...
In 12 articoli TOP c'è il meglio ...
La pirateria è l'unica tutela per...
Roomba Plus 516 Combo in offerta a 479€:...
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: 05:57.


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