DanieleCalisti

userClass.php

Apr 20th, 2020
600
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
PHP 8.82 KB | None | 0 0
  1. <?php
  2.  
  3.     //classe che contiene le funzioni di login e registrazione al sito e le funzioni di verifica dell'account dopo la registrazione
  4.     class userClass
  5.     {
  6.         /*
  7.             Variabili private da usare nel costruttore, vengono tutte poste uguali a null, in modo che quando instanzierò la classe da login.php, posso passare alcune variabili del costruttore in base alle mie esigenza, lasciando vuote altre
  8.         */
  9.         private $pdo;           //Varibaile per la connessione al db
  10.         private $nomeTabella;   //Nome della tabella del db dove voglio lavorare la inserisco nel costruttore in modo da riutilizzare la classe in più script
  11.         private $user;          //Nome dell'utente inserito
  12.         private $psw;           //Password inserita dall'utente
  13.         private $email;         //Email inserita dall'utente
  14.        
  15.         public function __construct($pdo = null, $nomeTabella = null, $user = null, $psw = null,$email = null)
  16.         {
  17.             /*
  18.                 if(isset($var)) --> controllo che la variabile sia stat inserita
  19.             */
  20.             if(isset($pdo))                             $this->pdo = $pdo;                 
  21.             if(isset($nomeTabella))                     $this->nomeTabella = $nomeTabella;
  22.             if(isset($user))                            $this->user = $user;
  23.             if(isset($psw))                             $this->psw = $psw;
  24.             if(isset($email))                           $this->email = $email;             
  25.  
  26.         }
  27.  
  28.         /*
  29.             function verificaUtente()
  30.  
  31.             Variabile utilizzate: $pdo, $nomeTabella, $user, $psw
  32.  
  33.             Ritorna true se l'utente esiste nel db altrimenti false
  34.         */
  35.  
  36.         public function verificaUtente()
  37.         {
  38.             $autenticato = false;       //Variabile per controllare che l'utente sia stato trovato
  39.            
  40.             try
  41.             {
  42.  
  43.                 $sql = "SELECT * FROM `".$this->nomeTabella."` WHERE `utente` = :user and `password` = :psw and `verificato` = :verificato ";
  44.                 $stmt = $this->pdo->prepare($sql);
  45.                 $stmt->bindValue(':user',$this->user);
  46.                 $stmt->bindValue(':psw',$this->psw);
  47.                 $stmt->bindValue(':verificato',1);
  48.                 $stmt->execute();
  49.  
  50.                 //Vedo quante righe sono state estratte dalla query
  51.                 $righeTrovate = $stmt->rowCount();
  52.  
  53.                 //Se sono state estratte delle righe, allora vuol dire che l'utente esiste
  54.                 if($righeTrovate>0)
  55.                     $autenticato = true;
  56.  
  57.             } catch (PDOException $e)
  58.             {
  59.                 echo 'Database error: '. $e->getMessage(). ' in '.$e->getFile(). ' line: '.$e->getLine();
  60.             }
  61.  
  62.             return $autenticato;
  63.         }
  64.  
  65.  
  66.         /*
  67.             function controlloUserEmail()
  68.  
  69.             Variabile utilizzate: $user, $email
  70.  
  71.             Controllo singolo su utente e su email per ritornare un errore più specifico
  72.        
  73.  
  74.             ritorna true se è stato già trovato un nome o un email, altrimenti false
  75.         */
  76.         private function controlloUserEmail()
  77.         {
  78.             $controllo = false;
  79.  
  80.             $error = "";    //Messaggio d'errore che verrà ritornato dalla funzione
  81.  
  82.             try
  83.             {
  84.                 /*
  85.                     -------------------------------Controllo utente--------------------------
  86.                 */
  87.                 //Uso il metodo con il bindValue per riuscire a contare il numero delle righe estratte dalla query
  88.                 $sql = "SELECT * FROM ".$this->nomeTabella." WHERE utente = :user ";
  89.                 $stmt = $this->pdo->prepare($sql);
  90.                 $stmt->bindValue(':user',$this->user);
  91.                 $stmt->execute();
  92.                 //Vedo quante righe sono state estratte dalla query
  93.                 $righeTrovate = $stmt->rowCount();
  94.  
  95.                 //Se sono state estratte delle righe, allora vuol dire che l'email o lo username già esistono
  96.                 if($righeTrovate>0)
  97.                 {
  98.                     $error .= "Username già esistente<br>";
  99.                     $controllo = true;
  100.                 }
  101.  
  102.                 /*
  103.                     ------------------------------Controllo email-------------------------
  104.                 */
  105.                 //Uso il metodo con il bindValue per riuscire a contare il numero delle righe estratte dalla query
  106.                 $sql = "SELECT * FROM ".$this->nomeTabella." WHERE email = :email ";
  107.                 $stmt = $this->pdo->prepare($sql);
  108.                 $stmt->bindValue(':email',$this->email);
  109.                 $stmt->execute();
  110.                 //Vedo quante righe sono state estratte dalla query
  111.                 $righeTrovate = $stmt->rowCount();
  112.  
  113.                 //Se sono state estratte delle righe, allora vuol dire che l'email o lo username già esistono
  114.                 if($righeTrovate>0)
  115.                 {
  116.                     $error .= "Email già esistente";
  117.                     $controllo = true;
  118.                 }
  119.  
  120.             } catch (PDOException $e)
  121.             {
  122.                 echo 'Database error: '. $e->getMessage(). ' in '.$e->getFile(). ' line: '.$e->getLine();
  123.             }
  124.            
  125.  
  126.             //Ritorno un array associativo per poter usare tutte e due le variabili
  127.             return ['controllo' => $controllo, 'errore' => $error];
  128.  
  129.         }
  130.  
  131.         public function aggiungiUtente()
  132.         {
  133.             //controllo se il nome utente o l'email sono già stati presi
  134.             $controllo = $this->controlloUserEmail();
  135.  
  136.             //Prendo la variabile controllo ritornata dalla funzione, se non esiste nè una mail nè un utente allora inserisco l'utente nel db
  137.             if(!$controllo['controllo'])
  138.             {
  139.                 try
  140.                 {
  141.                     //genero il token da usare per la verifica dell'account via mail
  142.                     $token = "QWERTYUIOPLKJHGFDSAZXCVBNMqwertyuioplkjhgfdsazxcvbnm1234567890()";
  143.                     $token = str_shuffle($token);
  144.                     $token = substr($token, 0,10);
  145.                     //Uso i ':' al posto dei valori per una questione di sicurezza
  146.                     $sql = "INSERT INTO ".$this->nomeTabella." SET
  147.                             utente = :user,
  148.                             password = :psw,
  149.                             email = :email,
  150.                             verificato = :verificato,
  151.                             token = :token";
  152.                     $stmt = $this->pdo->prepare($sql);
  153.                     //assegno i valori da inserire nel db
  154.                     $stmt->bindValue(':user',$this->user);
  155.                     $stmt->bindValue(':psw',$this->psw);
  156.                     $stmt->bindValue(':email',$this->email);
  157.                     $stmt->bindValue(':verificato',0);
  158.                     $stmt->bindValue(':token',$token);
  159.                     $stmt->execute();
  160.  
  161.                     //Invio l'email all'utente per verificare l'account
  162.                     $this->inviaVerificaEmail($token);
  163.  
  164.                     //Utente registrato correttamente, ma ancora non creo nessuna sessione dato che deve verificare il suo account
  165.                     header('location: /homepage/waitingAccount'); // --> lo rimando quindi ad un ipotetica homepage mostrando il messaggio di verificare l'account
  166.  
  167.                 } catch (PDOException $e)
  168.                 {
  169.                     echo 'Database error: '. $e->getMessage(). ' in '.$e->getFile(). ' line: '.$e->getLine();
  170.                 }
  171.             }else
  172.             {
  173.                 //Prendo l'errore ritornato dalla funzione
  174.                 $error = $controllo['errore'];
  175.  
  176.                 //Lo rimando alla pagina di registrazione stampando l'errore
  177.                 header('location: /register/'.$error);
  178.             }
  179.            
  180.         }
  181.  
  182.        
  183.         /*
  184.             function inviaVerificaEmail()
  185.  
  186.             Variabile utilizzate: $email
  187.  
  188.             invia una mail all'utente per verificare il proprio account
  189.         */
  190.  
  191.         private function inviaVerificaEmail($token)
  192.         {
  193.             //Corpo della mail
  194.             $body = '
  195.                     <html>
  196.                     <head>
  197.                         <meta charset="utf-8">
  198.                     </head>
  199.                     <body>
  200.  
  201.                         <div class="container" style="margin: black 1px solid">
  202.  
  203.                             <a href="localhost/confermaEmail/'.$token.'/'.$this->email.'" target="_blank">Confirm your email</a>
  204.  
  205.                         </div>
  206.  
  207.                     </body>
  208.                     </html>
  209.                     ';
  210.             //SETTO GLI HEADER CHE SERVONO PER INVIARE L'EMAIL
  211.             $headers = array(
  212.             'Content-Type: application/json'
  213.             );
  214.  
  215.             //ARRAY DI DATI (email destinatario, corpo del messaggio,ecc..)
  216.             $data = array(
  217.                 "personalizations" => array(
  218.                 array(
  219.                     "to" => array(
  220.                             array(
  221.                                 "email" => $this->email,
  222.                                 "name" => $this->user
  223.                             )
  224.                            
  225.                         )
  226.                 )
  227.             ),
  228.             "from" => array(
  229.                 "email" =>  "[email protected]"
  230.             ),
  231.             "subject" => "Verifica il tuo account!",
  232.             "content" => array(
  233.                 array(
  234.                     "type" => "text/html",
  235.                     "value" => $body
  236.                 )
  237.             )
  238.             );
  239.  
  240.             $ch = curl_init();
  241.             curl_setopt($ch, CURLOPT_URL, "https://api.sendgrid.com/v3/mail/send");
  242.             curl_setopt($ch, CURLOPT_POST, 1);
  243.             curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data));
  244.             curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
  245.             curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
  246.             curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
  247.             $response = curl_exec($ch);
  248.             curl_close($ch);
  249.  
  250.  
  251.         }
  252.  
  253.         /*
  254.             function verificaAccount()
  255.  
  256.             Variabile utilizzate: email e token passate come parametri dalla pagina login.php
  257.  
  258.         */
  259.         public function verificaAccount($getEmail,$getToken)
  260.         {
  261.             $esito = false;
  262.             try
  263.             {
  264.                 //Se ho trovato una riga corrispondente che contiene il token allora setto la variabile verificato = 1
  265.                     $sql = "UPDATE ".$this->nomeTabella." SET
  266.                             verificato = :verificato WHERE
  267.                             token = :token and
  268.                             email = :email";
  269.                     $stmt = $this->pdo->prepare($sql);
  270.                     $stmt->bindValue(':verificato',1);
  271.                     $stmt->bindValue(':token',$getToken);
  272.                     $stmt->bindValue(':email',$getEmail);
  273.                     $stmt->execute();
  274.  
  275.                     //Se dalla query ritorna almeno una riga, vuol dire che ho aggiornato il campo verificato e quindi pongo $esito = true
  276.                     if($stmt->rowCount() > 0)
  277.                     {
  278.                         $_SESSION['user'] = $user;                              //Creo la sessione da usare poi nel sito
  279.                         $esito = true;
  280.                     }
  281.                    
  282.  
  283.             } catch (PDOException $e)
  284.             {
  285.                 echo 'Database error: '. $e->getMessage(). ' in '.$e->getFile(). ' line: '.$e->getLine();
  286.             }
  287.            
  288.             return $esito;
  289.         }
  290.  
  291.  
  292.     }
  293. ?>
Advertisement
Add Comment
Please, Sign In to add comment