Validazione form php ajax

criric

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
21 Ago 2010
5.607
54
48
TN
E' solo un inizio
Ci occorrono quattro pagine:
registrazione.php
conterra il form di registrazione e le funzioni javascript per le chiamate ajax
PHP:
<?php
// se premuto il pulsante registrati
if (isset($_POST['register']) && $_POST['register'] == "Registrati") {
    // richiamo la classe
    require_once 'users.class.php';
    // istanza della classe
    $users = new userClass();
    // elimino il post del submit
    unset($_POST['register']);
    // richiamo la registrazione
    $registrazione = $users->registrazione($_POST);
    // stampo il risultato
    echo $registrazione;
}
?>
<!DOCTYPE html>
<html>
    <head>
        <title>Esempio validazione form ajax php</title>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <script src="http://code.jquery.com/jquery-latest.min.js" type="text/javascript"></script>
        <link rel="stylesheet" type="text/css" href="style.css"/>
        <script type="text/javascript">
            $("document").ready(function() {
                // disattivo il pulsante del submit
                $("#submit").attr("disabled",true);
                // chiamata ajax sugli eventi keyup e blur
                $(".check").bind("keyup blur",function(){
                    $.ajax({
                        type: "POST",
                        url: "checkform.php",
                        data: $("#form").serialize(),
                        success: function(response){
                            eval(response);
                        }
                    });
                });
                // informazioni per l'utente su come compilare il modulo
                $(".check").focus(function(){                
                    switch($(this).attr("name")) {
                        case "username":
                            var info = "La username deve contenere da 6 a 12 caratteri alfanumerici e non puo' essere gia' assegnata ad un altro utente"; 
                            break;
                        case "password":
                            var info = "La password deve contenere da 8 a 12 caratteri almeno un numero, una lettera maiuscola e una minuscola"; 
                            break;
                        default:
                            var info = "Compila il modulo per la registrazione <br/>I campi contrassegnati dall'asterisco sono obbligatori";
                            break;
                    }
                    $("#info").html(info);
                });
            }); 
        </script>
    </head>
    <body>
        <fieldset>
            <legend>Modulo di registrazione</legend>
            <form id="form" method="post" action="<?php echo $_SERVER['PHP_SELF'] ?>">
                <div id="info">
                    Compila il modulo per la registrazione <br/>I campi contrassegnati dall'asterisco sono obbligatori
                </div>
                <p>Username :</p>
                <p>
                    <input class="check" type="text" name="username"/>
                    <span id="username">! - campo obbligatorio</span>
                </p>
                <p>Password :</p>
                <p>
                    <input class="check" type="password" name="password"/>
                    <span id="password">! - campo obbligatorio</span>
                </p>
                <p>Ripeti password :</p>
                <p>
                    <input class="check" type="password" name="r_password"/>
                    <span id="r_password">! - campo obbligatorio</span>
                </p>
                <p>
                    <input class="fright" type="submit" id="submit" name="register" value="Registrati"/>
                </p>
            </form>
        </fieldset>
    </body>
</html>
style.css
un po di stile
Codice:
html body {
    font-family: Verdana;
    font-size: .8em;
}
fieldset {
    width: 330px;
    padding:22px;
}
p {
    margin:2px;
    padding:3px;
}
.fright {
    float: right;
}
p span {
    color: #EE0D0D;
    font-family: "Trebuchet MS";
    font-weight: bold;
    margin-left: 12px;
}
span.valid {
    color:#5CC10C;
}

div#info {
   margin-bottom: 12px;
}
checkform.php
la pagina richiamata da ajax per i controlli
PHP:
<?php

// richiamo classe users
require_once 'users.class.php';
// istanza classe users
$users = new userClass();
// inizializzo variabili per abilitazione submit
$u = $p = $r = false;
// se passata la stringa username 
if (isset($_REQUEST['username'])) {
    // se non è vuota
    if (!empty($_REQUEST['username'])) {
        // rimuovo l'eventuale classe assegnata 
        echo "$('#username').removeClass('valid');";
        // verifica username
        $checkUsername = $users->checkUsername($_REQUEST['username']);
        if ($checkUsername === true) {
            // username valida
            $u = true;
            echo "$('#username').addClass('valid');";
            echo "$('#username').html('V - valida');";
        } else {
            // username non valida mostro il messaggio
            echo "$('#username').html('$checkUsername');";
        }
    } else {
        // la username è vuota avviso
        echo "$('#username').html('! - campo obbligatorio');";
    }
}
// se passata la stringa password 
if (isset($_REQUEST['password'])) {
    // se non è vuota
    if (!empty($_REQUEST['password'])) {
        // // rimuovo l'eventuale classe assegnata 
        echo "$('#password').removeClass('valid');";
        $checkPassword = $users->checkPassword($_REQUEST['password']);
        if ($checkPassword === true) {
            // password valida
            $p = true;
            echo "$('#password').addClass('valid');";
            echo "$('#password').html('V - valida');";
        } else {
            // password non valida mostro il messaggio
            echo "$('#password').html('$checkPassword');";
        }
    } else {
        // la password è vuota avviso
        echo "$('#password').html('! - campo obbligatorio');";
    }
}

// se passata la stringa r_password 
if (isset($_REQUEST['r_password'])) {
    // se non è vuota
    if (!empty($_REQUEST['r_password'])) {
        // rimuovo l'eventuale classe assegnata 
        echo "$('#r_password').removeClass('valid');";
        if ($_REQUEST['r_password'] == $_REQUEST['password']) {
            // r_password valida
            $r = true;
            echo "$('#r_password').addClass('valid');";
            echo "$('#r_password').html('V - valida');";
        } else {
            // r_password non valida mostro il messaggio
            echo "$('#r_password').html('non corrispondono');";
        }
    } else {
        // la r_password è vuota avviso
        echo "$('#r_password').html('! - campo obbligatorio');";
    }
}

if ($u == true && $r == true && $p == true) {
    // abilito il submit
    echo "$('#submit').attr('disabled',false);";
} else {
    // disabilito il submit
    echo "$('#submit').attr('disabled',true);";
}
?>
users.class.php
la classe puo essere implementata con tutti i metodi per la gestione degli utenti
PHP:
<?php

/**
 * Gestione utenti
 * 
 * CriRic 12 giugno 2013
 * Aggiunti metodi per il controllo della username e della password
 * Iniziato il metodo per la registrazione dei dati
 * 
 */
class userClass {

    var $sql;

    /**
     * Istanzia la classe mysqli 
     */
    public function __construct() {
        // connetto al database cambiare parametri di connessione
        $this->sql = new mysqli("localhost", "root", "", "database");
    }

    /**
     * Chiude la connessione al database
     */
    public function __destruct() {
        // disconnetto dal database
        $this->sql->close();
    }

    /**
     * Se la username rispetta i seguenti parametri
     * - da 6 a 12 caratteri alfanumerici 
     * - non deve essere gia presente nella tabella users
     * il metodo restituirà true, altrimenti una stringa contenente il messaggio di errore
     * @param type $username
     * @return type true or string
     */
    public function checkUsername($username) {
        // pulizia stringa
        $username = $this->protect($username);
        // verifico lunghezza username
        if (strlen($username) < 6) {
            // la username è minore di 6 caratteri
            return "! - min  6 chr";
        } else if (strlen($username) > 12) {
            // la username è maggiore di 12 caratteri
            return "! - max  12 chr";
        }
        // verifico caratteri alfanumerici
        if (!ctype_alnum($username)) {
            return "! - chr alfanumerici";
        }
        // query di ricerca username
        $query = "SELECT username FROM users WHERE username = '" . $username . "'";
        // esecuzione query
        $result = $this->sql->query($query);
        // verifico presenza username
        if (!$result || $result->num_rows > 0) {
            // la query non è andata a buon fine o la username è già presente
            return "! - non disponibile";
        }
        // username valida
        return true;
    }

    /**
     * Se la password rispetta i seguenti parametri
     * - da 8 a 12 caratteri
     * - almeno una lettera maiuscola
     * - almeno una lettera minuscola
     * - almeno un numero
     * il metodo restituirà true, altrimenti una stringa contenente il messaggio di errore
     * @param type $password
     * @return type true or string
     */
    public function checkPassword($password) {
        // pulizia stringa
        $password = $this->protect($password);
        // verifico lunghezza username
        if (strlen($password) < 8) {
            // la password è minore di 8 caratteri
            return "! - min  8 chr";
        } else if (strlen($password) > 12) {
            // la password è maggiore di 12 caratteri
            return "! - max  12 chr";
        }
        // espressione regolare
        if (!preg_match("/^.*(?=.{8,})(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).*$/", $password)) {
            return "! - chr non validi";
        }
        // password valida
        return true;
    }

    /**
     * NON FINITO
     * Prende come parametro l'intero POST del submit
     * rielabora i dati ricevuti e prepara la registrazione dell'utente
     * se tutto va a buon fine il metodo restituisce true altrimenti una stringa contenente l'errore
     * @param type $post
     * @return type true or string
     */
    public function registrazione($post) {
        // ciclo del post
        foreach ($post as $key => $value) {
            // creazione variabile e pulizia stringa
            ${$key} = $this->protect($value);
        }
        // verifico username
        $checkUsername = $this->checkUsername($username);
        if ($checkUsername !== true) {
            return $checkUsername;
        }
        // verifico password
        $checkPassword = $this->checkPassword($password);
        if ($checkPassword !== true) {
            return $checkPassword;
        }
        // query di inserimento nuovo utente
        $query = "INSERT INTO users SET username = '$username', password = '" . md5($password) . "'";
        // restituzione elaborazione
        return $query . " <br/>Tutto OK <br/>Per ora mi fermo qui";
    }

    /**
     * Accetta una stringa elimina i tag HTML e restituisc l'escape
     * @param type $string
     * @return type $string
     */
    private function protect($string) {
        // pulizia tag html
        $string = strip_tags($string);
        // restituzione escape stringa
        return $this->sql->real_escape_string($string);
    }

}

?>
un esempio online per vedere come funziona ( username gia presenti : criric , borgoitalia)
come sempre sono ben accettati consigli per migliorare il codice
ps
appena riesco a capire come caricare uno zip magari vi allego i file
 
Ultima modifica di un moderatore:

paperinik4

Utente Attivo
29 Mag 2011
1.812
0
36
Roma
www.ricetteagogo.it
problema rifatto in locale e non va

Ciao cricric,

Ho provato il tuo codice ma c'è qualcosa che sul mio in locale non funziona non capisco bene cosa. In pratica non mi visualizza l'ok a posto del campo obbligatorio. E' possibile avere un file zippato di questo esempio ??? Lo so che è molto vecchio. Però è sempre utile. Grazie.
 

criric

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
21 Ago 2010
5.607
54
48
TN
I file sono quei 4 che ho postato, basta che li copi e li incolli con il nome che gli ho assegnato
Devi invece stare più attento nel file users.class.php:
devi cambiare i parametri di connessione con i tuoi e sistemare i nome delle tabelle e dei campi nelle query.
 

paperinik4

Utente Attivo
29 Mag 2011
1.812
0
36
Roma
www.ricetteagogo.it
Che scemo ecco dove li avevo visti. Che poi non li ho più ritrovati. Allora sicuramente sarà quello. Ma una cosa si possono aumentare ovviamente i campi oltre a quelli che hai messo te ????
 

paperinik4

Utente Attivo
29 Mag 2011
1.812
0
36
Roma
www.ricetteagogo.it
Allora ho provato a cambiare i valori della connessio ma sembra che non gli piacciano, Volevo un'info. Io adopero un file chiamato connettimysqli.php che contiene tutti i dati necessari per la connessione al db. Nel file connettimysqli qdopero la variabile $con. Questa variabile va sostituita con $this ??? Io ho sostituito queste due righe qua:

PHP:
class userClass {

    var $sql;

    public function __construct() {
        // connetto al database cambiare parametri di connessione
       // $this->sql = new mysqli("localhost", "root", "", "database");
        require_once ('connettymysqli');
    }

    public function __destruct() {
        // disconnetto dal database
        $this->sql->close();
    }
Ho provato a sostituire la variabile $con con $this nel file connetimysqli ma sembra ch enon gli piaccia.