Form di Log-In, Registrazione, Attivazione Utente

Ciao Gianni apro un nuovo thread per fare chiarezza su alcuni problemi legati al login, al controllo dati inseriti nel login, alla loro registrazione ed alla successiva attivazione.

Come già detto nell'altro thread ho trovato un tutorial che gestisce tutto questo ed ovviamente l'ho rielaborato sul caso mio.

Quello che dovrei fare è appunto una pagina dinamica che al momento del login verifichi se un utente possiede già un account nel mio db. Se sì i dati inseriti vanno verificati e una volta accertati l'utente può gestire i suoi files attraverso le 4 operazioni fondamentali (up-load, download, edit, erase), per mezzo di un form.

Se non esiste alcun account l'utente deve registrarsi. La registrazione è fatta inviando una mail di attivazione all'utente che chiede di registrarsi.

L'SQL della tabella del db è questo:

CREATE TABLE users (

  userid int(25) NOT NULL auto_increment,

  first_name varchar(25) NOT NULL default '',

  last_name varchar(25) NOT NULL default '',

  email_address varchar(25) NOT NULL default '',

  username varchar(25) NOT NULL default '',

  password varchar(255) NOT NULL default '',

  decrypted_password varchar(255) NOT NULL default '',

info text NOT NULL,

  user_level enum('0','1','2','3') NOT NULL default '0',

  signup_date datetime NOT NULL default '0000-00-00 00:00:00',

  last_login datetime NOT NULL default '0000-00-00 00:00:00',

  activated enum('0','1') NOT NULL default '0',

  PRIMARY KEY  (userid)

) TYPE=MyISAM COMMENT='Membership Information';

Ho lasciato tutto così tranne il campo "info" che ho cancellato e decommentato nei successivi script php.

Lo script di controllo login è così formulato:

<?php
session_start();
include ("./_include/config.php");

//Includo il file con i forms di Log-In, Controllo, Registrazione e Attivazione
include("./_include/forms.php");

/*include 'db.php';*/

// Dichiaro le variabili di Log-in
$username = $_POST['username'];
$password = $_POST['password'];

if((!$username) || (!$password)){
   // Stampo il form che controlla se l'utente ha riempito i campi user e password
   echo $form_check_campi;
   exit();
}

// Converto la password con md5 hash
$password = md5($password);

// mi connetto al db
$connection = mysql_pconnect('localhost', 'xxx', 'xxx')
   or die ("Impossibile connettersi al server.");

$db = mysql_select_db('db_prova1', $connection)
   or die("Impossibile connettersi al database.");

// controllo se le info dello user corrispondono al db   
$sql = mysql_query("SELECT * FROM users WHERE username='$username' AND password='$password' AND activated='1'");
$login_check = mysql_num_rows($sql);

if($login_check > 0){
   while($row = mysql_fetch_array($sql)){
   foreach( $row AS $key => $val ){
      $$key = stripslashes( $val );
   }
      // Registro le variabili di sessione!
      session_register('first_name');
      $_SESSION['first_name'] = $first_name;
      session_register('last_name');
      $_SESSION['last_name'] = $last_name;
      session_register('email_address');
      $_SESSION['email_address'] = $email_address;
      
      header("Location: sample.php");
   }
} else {
//Stampo il form che controlla se il log-in è corretto. In caso contrario restituisce "LOG-IN ERRATO!"
echo $form_check_login;
}
?>

Questo è il php per la registrazione:

<?php
include ("./_include/config.php");

//Includo il file con i forms di Log-In, Controllo, Registrazione e Attivazione
include("./_include/forms.php");

// Dichiaro le variabili
$first_name = $_POST['first_name'];
$last_name = $_POST['last_name'];
$email_address = $_POST['email_address'];
$username = $_POST['username'];
/*$info = $_POST['info'];*/

//Stripslashes
$first_name = stripslashes($first_name);
$last_name = stripslashes($last_name);
$email_address = stripslashes($email_address);
$username = stripslashes($username);
/*$info = stripslashes($info);*/

// mi connetto al db
$connection = mysql_pconnect('localhost', 'xxx', 'xxx')
   or die ("Impossibile connettersi al server.");

$db = mysql_select_db('db_prova1', $connection)
   or die("Impossibile connettersi al database.");

// Controllo riempimento di tutti i campi
?>
   <div class="contenuto2" style="background:url(_image/bianco3.gif) no-repeat center #FFF;">
         <div id="form">
            <form name="form1" method="post" action="register.php">
            <?php if((!$first_name) || (!$last_name) || (!$email_address) || (!$username)){
               echo 'Inserire tutte le informazioni richieste. <br />';?>
               <font size="-1"><b>Nome </b></font><input name="first_name" type="text" id="first_name" value='<?php echo($first_name)?>'>
               <?php if(!$first_name){
                  echo "<strong><font color=red>Nome obbligatorio!</font></strong><br />";
               }?>
               <font size="-1"><b>Cognome </b></font><input name="last_name" type="text" id="last_name" value='<?php echo($last_name)?>'>
               <?php if(!$last_name){
                  echo "<strong><font color=red>Cognome obbligatorio!</font></strong><br />";
               }?>
               <font size="-1"><b>E-mail </b></font><input name="email_address" type="text" id="email_address">
               <?php if(!$email_address){
                  echo "<strong><font color=red>E-mail obbligatoria!</font></strong><br />";
               }?>
               <font size="-1"><b>User </b></font><input name="username" type="text" id="username">
               <?php if(!$username){
                  echo "<strong><font color=red>User obbligatorio!</font></strong><br />";
               }?>
               <input type="submit" name="Submit" value="Conferma">
            </form>
         </div>
      </div>
     <div class="clear"></div>
   </div>
   <div id="foot"></div>
</div>
</body>
</html>

<?php
//Se è tutto ok creo l'account
    exit(); //Se ci sono errori esco dallo script!
}

//Controllo l'esistenza di campi con lo stesso valore

 $sql_email_check = mysql_query("SELECT email_address FROM users WHERE email_address='$email_address'");
 $sql_username_check = mysql_query("SELECT username FROM users WHERE username='$username'");

 $email_check = mysql_num_rows($sql_email_check);
 $username_check = mysql_num_rows($sql_username_check);
 ?>
   <div class="contenuto2" style="background:url(_image/bianco3.gif) no-repeat center #FFF;">
         <div id="form">
            <form name="form1" method="post" action="register.php">
            <?php if(($email_check > 0) || ($username_check > 0)){
            echo "Attenzione: <br />";?>
            <font size="-1"><b>Nome </b></font><input name="first_name" type="text" id="first_name" value='<?php echo($first_name)?>'>
            <font size="-1"><b>Cognome </b></font><input name="last_name" type="text" id="last_name" value='<?php echo($last_name)?>'>
            <font size="-1"><b>E-mail </b></font><input name="email_address" type="text" id="email_address">
               <?php if($email_check > 0){
               echo "<font color=red size=\"-1\">E-mail esistente. Riprovare grazie.</font><br />";
               unset($email_address);
               }?>
            <font size="-1"><b>User </b></font><input name="username" type="text" id="username">
               <?php if($username_check > 0){
               echo "<font color=red size=\"-1\">User esistente. Riprovare grazie.</font><br />";
               unset($username);
               }?>
            <input type="submit" name="Submit" value="Conferma">
            </form>
         </div>
      </div>
   <div class="clear"></div>
   </div>
   <div id="foot"></div>
</div>
</body>
</html>
<?php
    exit();  //Se ci sono errori esco dallo script!
 }

//Se è tutto ok procedo nella creazione dell'account.

/*Random Password generator.
http://www.phpfreaks.com/quickcode/Random_Password_Generator/56.php

Creo una pasword casuale per lo user e la cripto. Poi mando una mail allo user e lo inserisco nel db.*/

function makeRandomPassword() {
  $salt = "abchefghjkmnpqrstuvwxyz0123456789";
  srand((double)microtime()*1000000);
     $i = 0;
     while ($i <= 7) {
          $num = rand() % 33;
          $tmp = substr($salt, $num, 1);
          $pass = $pass . $tmp;
          $i++;
     }
     return $pass;
}

$random_password = makeRandomPassword();

$db_password = md5($random_password);

//Inserisco i dati nel db
/*$info2 = htmlspecialchars($info);*/
$sql = mysql_query("INSERT INTO users (first_name, last_name, email_address, username, password, signup_date, decrypted_password)
      VALUES('$first_name', '$last_name', '$email_address', '$username', '$db_password', now(), '$random_password')") or die (mysql_error());

if(!$sql){
   echo 'Errore nella registrazione. Contattare il web master. Grazie.';
} else {
   $userid = mysql_insert_id();
   $activatepath = "activate.php?id=$userid&code=$db_password";
   
   //Mando la mail all'utente!
   $subject = "Richiesta di registrazione presso $sitename";
   $message = "Gentile $first_name $last_name,
   sei stato registrato su $sitepath !

   Per attivare la registrazione clicca qui: $sitepath $activatepath

   Attivata la registrazione, potrai effettuare il login digitando le seguenti informazioni:
   Username: $username
   Password: $random_password
   Mantieni questi dati in un posto sicuro ed accessibile a te.

   Grazie!
   Webmaster, $sitename



   Questo messaggio è una risposta automatica. Non eseguire il \"reply\"!";

   mail($email_address, $subject, $message, "Da: $sitename <$adminemail>\nX-Mailer: PHP/" . phpversion());
   echo 'I dati di accesso sono stati inviati all\'indirizzo e-mail fornitoci. Controlli e segua le istruzioni. Grazie!';
}
?>

In locale, ho provato a fare una registrazione e mi segnala questi errori.

- Undefined variable: pass in C:\www\sito\register.php on line 137

- Undefined variable: sitename in C:\www\sito\register.php on line 158

- Undefined variable: sitepath in C:\www\sito\register.php on line 162

- Undefined variable: sitename in C:\www\sito\register.php on line 174

- Undefined variable: adminemail in C:\www\sito\register.php on line 176

- Warning: mail() [function.mail]: "sendmail_from" not set in php.ini or custom "From:" header missing in C:\www\sito\register.php on line 176

Suppongo ci sia un errore di dichiarazione per ognuna di queste variabili. Queste variabili sono dichiarate dentro config.php. Ho poi provato ad abilitare la function.mail nel php.ini ma l'errore persiste.

Ad ogni modo i dati dell'utente vengono memorizzati nel db però non viene spedita la mail che richiede l'attivazione, e di conseguenza la varibile activated='1' della query dello script di login non viene soddisfatta. Così facendo lo script salta la funzione header (location) mostrandomi il form di login errato.

I dati però sono giusti.

Chiedo venia per la lungaggine.

inviato 10 anni fa
Piero83
modificato 10 anni fa
X 0 X
Suppongo ci sia un errore di dichiarazione per ognuna di queste variabili. Queste variabili sono dichiarate dentro config.php.

Ho risolto un paio di errori sostituendo le variabili $sitename <$adminemail> con 'nomesito' <'adminemail'>

E' come se non includesse il file config.php... ???

Per $pass = $pass . $tmp; e $sitepath non so proprio dove mettere le mani.

risposto 10 anni fa
Piero83
X 0 X
Effettua l'accesso o registrati per rispondere a questa domanda