Area Riservata
Come creare Area Riservata PHP programmazione Oggetti
Il processo di registrazione e accesso
L’utente dovrà riempire dei campi:o Username
o Password
o Email
Questi campi ,ad esempio attraverso javascript, dovranno essere obbligatoriamente riempiti, con un formato preciso
Ad esempio la mail contenere il carattere @, la password avere una lunghezza minima etc.
Questo primo passaggio lo potrò fare con il codice javascript, usando le espressioni regolari
Una volta che utente ha compilato i dati, questi saranno trasmessi con Il metodo POST ad un altro file che li elabora
L’elaborazione sarà diversa nel caso si tratti di processo di:
- Signup e quindi registrazione iniziale
- Log e quindi accesso dopo la registrazione
Signup: Registrazione iniziale
In questo caso, dopo aver catturato i dati email e password, attraverso l'istruzione: $_POST:- Mi collegherò al DB, usando la classe PDO
- eseguiro’ una query SELECT nella tabella del data base per verificare se i dati sono esitenti,
- è gia’ nel data base: Allora mi sono precedentemente registrato e quindi mandero un messaggio al utente: GIA’ Registrato
- NON E’ nel data base, Allora attraverso la query INSERT inerirò i dati che utente ha scritto nel campo( catturati con il metodo POST), nella tabella del data base
Login: accesso dopo la registrazione
La prima parte del processo è simile alla precedente:- Mi collegherò al DB, usando la classe PDO
- eseguiro’ una query SELECT nella tabella del data base per verificare se i dati sono esitenti, prendendo come riferimento ad esempio la email
Come si può intuire, però i risultato della query porta ad azioni diverse:
-
Se la mail e la password sono gia’ nel data base:
Allora mi sono precedentemente registrato e quindi posso accedere ad un area privata dove posso vedere i miei dati -
Se la mail NON E’ nel data base,
Allora dovro’ indicare all’utente che non si è registrato, mandare un messaggio e inidirizzarlo al form di registrazione.
Qui useremo la istruzione header(‘location: registrazione.php’)
Creare tabella utenti
Attraverso phpmyadmin, verrà creata una tabella USERS
Email e password verranno inseriti nel processo di registrazione,
mentre gli altri dati finalizzati nel processo di acquisto.
Come si vede a quest’ultimi è stato dato un valore di default, uguale al nome (Name) della colonna. In questo modo potro’ sempre usare la funzione UPDATE.
Caratteristiche del form inserimento dati registrazione
<form action="signup/reg" method="post">
<input type="email" name="email_reg" placeholder="Email" required=" ">
<input type="password" name="psw_reg" placeholder="Password" required=" ">
<input type="submit" value="Register">
</form>
dove viene eseguito il processo sopra descritto
- Collegamento al DB
- Query SELECT per verificare se utente già inserito
- Inserimento dei dai se non inserito
name="email_reg".
Cartella Log e registrazione i files contenuti
Come si vede ho duplicati alcuni dei file esistenti nel sito. Ad esempio DB.php Questa scelta perché la cartella signup possa essere usata come un plugin anche in altri siti. Infatti bastera’ modificare i forms come sopra descritto ed inserire la cartella. Cambiare eventualmente il nome del DB Con questi semplici passaggi. Sara’ a disposizione un sistema di Login e Registrazione
Compilare i form con javascript
Per verificare che i form siano correttamente compilati, si usa un controllo javascriptLo script è contenuto in due file simili:
- Signup/js/controllo_log.js
- Signup/js/controllo_registrazione.js
Ecco il file controllo_log.js
function checkForm_log(form)
{
if(form.email_log.value == "") {
alert("Errore: la email non puo' essere bianca!");
return false;
}
re=/^\w+([\.-]?\w+)*@\w+([\.-]?\w+)*(\.\w{2,3})+$/;
// re = /^\w+$/;
if(!re.test(form.email_log.value)) {
alert("Error: la email deve essere scritta correttamente!");
return false;
}
if(form.psw_log.value != "" ) {
if(form.psw_log.value.length < 6) {
alert("Error: la password deve contenere almeno sei caratteri!");
return false;
}
re = /[0-9]/;
if(!re.test(form.psw_log.value)) {
alert("Errore: la password deve contenere almeno un numero (0-9)!");
return false;
}
re = /[a-z]/;
if(!re.test(form.psw_log.value)) {
alert("Errore: password deve contenere almeno una lettera minuscola!");
return false;
}
re = /[A-Z]/;
if(!re.test(form.psw_log.value)) {
alert("Errore: password deve contenere almeno una lettera maiuscola (A-Z)!");
return false;
}
} else {
alert("Errore: Controlla se hai inserito una password valida!");
return false;
}
// checkbox
var checkBox = document.getElementById("checkbox-form");
// checkbox è checked?
if (checkBox.checked !== true){
alert("Errore: Devi accettare la privacy!");
return false;
}
alert("hai inserito una password valida: " + form.psw_log.value);
return true;
}
Il primo controllo è che la mail non puo’ essere bianca: form.email_log.value == "" Poi successivamente altri controlli, usando le espressioni regolari
Le espressioni regolari:
Sono un modello a cui i contenuti si devono attenere
Esempi:
[A-Z] vuole che tutti caratteri devono alfabetici e non numerici .
[A-Z 0-9] i caratteri possono essere sia alfabetici (maiuscoli) che numerici
[a-z] i caratteri possono essere alfabetici ma minuscoli
Questa la piu’ complessa per uso email
re=/^\w+([\.-]?\w+)*@\w+([\.-]?\w+)*(\.\w{2,3})+$/;
// re = /^\w+$/;
if(!re.test(form.email_log.value))
Lo script controlla poi che checkbox venga spuntato:
var checkBox = document.getElementById("checkbox-form");
// checkbox è checked?
if (checkBox.checked !== true) {
Dove getElementById = prendi l’elemento che ha come id checkbox-form Se non è checked = checkBox.checked !== true
Allora compare una alert che chiede di accettare la privacy.
Per invocare la funzione dello script nel tag form si scrive
< form action="signup/log/index.php" method="POST" onsubmit="return checkForm_log(this);">
<form action="signup/registrazione/index.php" method="POST" onsubmit="return checkForm_reg(this);">
Ultimo lo script va collegato al sito e quindi nel footer.php
&alt;script src="signup/js/controllo_log.js"&agt;&alt;/script>
&alt;script src="signup/js/controllo_registrazione.js"&agt;&alt;/script>
Processo di registrazione: i files
Anche qui lavoriamo con il processo di Classi e Viste.Il concetto di MVC
Il processo si apre con la definizione delle classi che utilizzeremo
DB.php
//classe serve per connettersi al database
class DB
{
public function connect($db)
{
try {
$conn = new PDO("mysql:host={$db['host']}; dbname=ecommerce1", $db['username'], $db['password']);
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
return $conn;
} catch (PDOException $exception) {
exit($exception->getMessage());
}
}
}
Questo file già discusso, consente di creare una classe per la connessione al DB utilizzato, chiamato ecommerce1. Come già precedentemente i parametri del DB sono contenuti nell’array del file config.php
Da notare uso di md5, per criptare la password.
Raccogliere i dati del form: Dati.php
email_reg = $email;
$this->psw_reg = md5($psw);
}
public function getEmail()
{
return $this->email_reg;
}
public function getPsw()
{
return $this->psw_reg;
}
}
?>
Raccogliamo i dati che compiliamo nel form
I dati vengono restituiti attraverso due funzioni• getEmail
• getPsw
catturati attraverso il costruttore.
Query del DB: Auth.php
s = $db->prepare("SELECT * FROM users
WHERE email='$email' AND password='$psw'");
$this->s->execute();
$this->s->setFetchMode(PDO::FETCH_ASSOC);
$this->num_row = $this->s->rowCount($this->s);
return $this->num_row;
}
public function getRow($db, $email, $psw)
{
$this->s = $db->prepare("SELECT * FROM users
WHERE email='$email' AND password='$psw'");
$this->s->execute();
$this->row = $this->s->fetch(PDO::FETCH_ASSOC);
$this->id_utente = $this->row['id'];
return $this->id_utente;
}
public function signUp($db, $email, $psw)
{
$sql = "INSERT INTO `users`( `email`, `password`)
VALUES ('$email','$psw')";
$this->s = $db->prepare($sql);
$this->s->execute();
}
}
?>
Questo file contiene 2 metodi della classe Auth:
• getAllDati($db,$email,$psw): Riceve come parametri email e psw, oltre alla connessione al DB.
Esegue una query SELECT * FROM users WHERE email='$email' AND password='$psw'
Per verificare se nella tabella users, sono presenti i dati passati.
Conta il numero di righe con questi dati e restituisce questo valore.
Questa funzione verrà utilizzata nel file registrazione/index.php. Se le righe trovate sono maggiori di zero, allora utente si è già registrato e verrà indirizzato al log
• signUp($db,$email,$psw): Inserisce email e password nella tabella users.
Questa funzione verrà utilizzata nel file registrazione/index.php. Se le righe trovate sono uguali a zero di zero, allora utente NON si è già registrato e verrà inserito nel DB.
Creare istanze delle Classi: init.php
Come ormai largamente discusso le classi (metodi e proprietà) vengono utilizzate attraverso la creazione di un oggetto istanza della classeIn parte questo viene eseguito nel file
init.php
connect($db);
//classe Auth
$auth = new Auth();
//classe Messaggio
$messaggio = new Messaggi();
?>
Alcune classi: Dati e Auth, verranno istanziate nel file registrazione/index.php.
Index.php
Questo è il file piu’ importante, che riassume tutto il processo di registrazione
connect($db);
//passaggio parametri
$email_reg = trim($_POST["email_reg"]);
$psw_reg = trim($_POST["psw_reg"]);
$user = new Dati($email_reg, $psw_reg);
$email = $user->getEmail();
$psw = $user->getPsw();
$num_row = $auth->getAllDati($dbConn, $email, $psw);
if ($num_row > 0) {
$testo = "Utente gia' registrato";
$messaggio->crea_sessione_messaggio($testo);
header('location:../../login.php');
} else {
$_SESSION['email_reg'] = $email;
$_SESSION['psw_reg'] = $psw;
$insert = $auth->signUp($dbConn, $email, $psw);
$id_utente = $auth->getRow($dbConn, $email, $psw);
$_SESSION['id'] = $id_utente;
//include('../mail/mailchimp.php');
$testo = "Registrazione effettuata";
$messaggio->crea_sessione_messaggio($testo);
header('location:../../login.php');
}
} else {
$testo = "Non hai compilato i campi correttamente";
$messaggio->crea_sessione_messaggio($testo);
header('location:../../login.php');
}
?>
Come si vede inizia caricando il file init.php e tutte le classi che si vogliono usare.
Successivamente il codice effettua un controllo
if(isset($_POST["email_reg"]))
Se il form di registrazione è stato compilato, allora viene eseguito il codice che segue.
Si raccoglie con il metodo post: email e password che utente ha scritto nel form
$email_reg=trim($_POST["email_reg"]); trim= elimina gli spazi vuoti.
Poi viene creato un oggetto della classe Dati, che viene inizializzata con il costruttore, e che ritorna i parametri email e password elaborati
$user=new Dati($email_reg,$psw_reg);
$email=$user->getEmail();
$psw=$user->getPsw();
La funzione getAllDati, restituisce il numero di record presenti nl DB, con email e password uguali a quelle che utente ha scritto nel form.
$auth = new Auth;
$num_row=$auth ->getAllDati($dbConn,$email,$psw);
1) Se il numero di record è maggiore di zero, allora l’utente viene reindirizzato alla pagina login.php con il messaggio: Utente già registrato.
if ($num_row > 0) {
$testo="Utente gia' registrato";
$messaggio->crea_sessione_messaggio($testo);
header ('location:../../login.php');
}
2)else
//Altrimenti utente viene inserito nel DB, richiamando la funzione signUp
$insert= $auth->signUp($dbConn,$email,$psw);
Vengono poi create delle SESSIONI:
$_SESSION['email_reg']=$email;
$_SESSION['psw_reg']=$psw;
$_SESSION['id']=$id_utente;
Queste SESSIONI saranno molto utili nel topMenu.php per decidere cosa visualizzare. Quale tipo di menù visualizzare se l’utente HA o NON ha eseguito il processo di registrazione. Se è stata creata la SESSIONE:
if(isset($_SESSION['email_log']) or isset($_SESSION['email_reg'])) {?>
<div class="mega-dropdown-menu">
<div class="w3ls_vegetables">
<ul class="dropdown-menu drp-mnu">
<li > < a href="#">Il tuo profilo </a> < /li >
<li> <a href="#">I tuoi ordini </a > </li >
<li > < a href="signup/esci.php">Esci < /a > < /li >
</ul >
</div >
</div >
<?php } else {? >
<div class="mega-dropdown-menu">
<div class="w3ls_vegetables">
<ul class="dropdown-menu drp-mnu">
<li> < a href="login.php">Login/Sign Up </a> </li >
</ul >
</div>
</div>
<?php } ? >
Processo di log: i files
Qui sostituiamo alle classi uso delle funzioni. I files config.php, DB.php,Dati.php sono simili ai precedenti
Config.php
//da usare in tag php
session_start();
include('DB.php');
include('Dati.php');
$db = [
//connessione al DB 8889= portaMysql di Mamp
'host' => 'localhost',
'username' => 'root',
'password' => 'root'
];
include('../registrazione/classes/Messaggi.php');
$messaggio = new Messaggi();
DB.php
//classe serve per connettersi al database
class DB
{
public function connect($db)
{
try {
$conn = new PDO("mysql:host={$db['host']}; dbname=ecommerce1", $db['username'], $db['password']);
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
return $conn;
} catch (PDOException $exception) {
exit($exception->getMessage());
}
}
}
Dati.php
class Dati
{
protected $email_log;
protected $psw_log;
public function __construct($email, $psw)
{
$this->email_log = $email;
$this->psw_log = md5($psw);
}
public function getEmail()
{
return $this->email_log;
}
public function getPsw()
{
return $this->psw_log;
}
}
Index.php
Ultimo il file che riassume il processoIn sintesi vengono create due funzioni:
• getAllDati($db,$email,$psw)
Restituisce il numero di righe che hanno email e password uguali a quelle inserite nei forms dall’utente
• getRow($db,$email,$psw)
Restituisce ID dell’utente
Vengono catturati con il metodo POST i dati scritti dall’utente.
Viene poi invocata la funzione getAllDati($db,$email,$psw)
if ($num_row > 0)
Se il numero di righe è >0 allora i dati sono inseriti nel DB, utente può effettuare il loign. In questo caso vengino create 3 SESSIONI:
$id_utente=getRow($dbConn,$email,$psw);
$_SESSION['id']=$id_utente;
$_SESSION['email_log']=$email;
$_SESSION['psw_log']=$psw;
Dove id utente è ottenuto da getRow($dbConn,$email,$psw);
Else
Se il numero di righe NON è >0 allora i dati NON sono inseriti nel DB.
Utente viene indirizzato alla registrazione.
include('config.php');
// se il form è stato compilato
if(isset($_POST["email_log"])) {
//connessione al DB
$dbInstance = new DB();
$dbConn = $dbInstance->connect($db);
//catturo i dati del form con il metodo post
$email_log = trim($_POST["email_log"]);
$psw_log = trim($_POST["psw_log"]);
//elaboro i dati
$user = new Dati($email_log, $psw_log);
$email = $user->getEmail();
$psw = $user->getPsw();
//attraverso una funzione seleziono i dati
//ottengo il numero di righe con il record che contiene
//email e psw che utente ha inserito nel Db
$num_row = getAllDati($dbConn, $email, $psw);
//se il numero di righe >0 utente riconosciuto
// creo le sessioni e un messaggio di avvenuto log
if ($num_row > 0) {
$id_utente = getRow($dbConn, $email, $psw);
$_SESSION['id'] = $id_utente;
$_SESSION['email_log'] = $email;
$_SESSION['psw_log'] = $psw;
//messaggio
$testo = "Hai effettuato accesso correttamente";
$messaggio->crea_sessione_messaggio($testo);
header('location:../../login.php');
}
//se il numero di righe non è >0 allora utenete si deve registrare
else {
$testo = "Utente non riconosciuto devi registrarti";
$messaggio->crea_sessione_messaggio($testo);
header('location:../../login.php');
}
} else {
$testo = "Non hai compilato i campi correttamente";
$messaggio->crea_sessione_messaggio($testo);
header('location:../../login.php');
}
//ritorna numero record con email e psw uguali a quelle inserite
function getAllDati($db, $email, $psw)
{
$statement = $db->prepare("SELECT * FROM users WHERE email='$email' AND password='$psw'");
$statement->execute();
$statement->setFetchMode(PDO::FETCH_ASSOC);
$num_row = $statement->rowCount($statement);
return $num_row;
}
//ritorna ID
function getRow($db, $email, $psw)
{
$statement = $db->prepare("SELECT * FROM users WHERE email='$email' AND password='$psw'");
$statement->execute();
$statement->setFetchMode(PDO::FETCH_ASSOC);
$row = $statement->fetch(PDO::FETCH_ASSOC);
$id = $row['id'];
return $id;
}