Intelligenza Artificiale

A un certo punto non fu più la biologia a dominare il destino dell'uomo, ma il prodotto del suo cervello: la cultura.
Cosicché: "Le uniche leggi della materia sono quelle che la nostra mente deve architettare e le uniche leggi della mente sono architettate per essa dalla materia".
JAMES CLERK MAXWELL

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,
Se il campo (la mail):
  • è 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
tabella user
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>



Con questo codice al click del pulsante invia si viene indirizzato al file index.php della cartella signup/reg,
dove viene eseguito il processo sopra descritto
  • Collegamento al DB
  • Query SELECT per verificare se utente già inserito
  • Inserimento dei dai se non inserito
Fondamentale all’interno dei due input aver inserito un name, sara’ questo che caratterizza che consentirà di raccogliere i dati.
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 javascript
Lo 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 classe
In 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 processo
In 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;
}


Accedi alla Area Riservata per scaricare il codice


download

Se vuoi Saperne di piu’

Accedi all'area Riservata

Scarica il codice dell'articolo