[PHP]Errore registrazione

Frozzen

Utente Attivo
18 Gen 2019
55
0
6
28
Milano
Buonasera ragazzi, ho inserito nel database una riga "RUOLO" ma quando vado a registrare l'utente appare questo errore

Vorrei aggiungere a questa tabella un "ruolo" utente per dar modo di far accedere l'utenza a pagine limitate. Cosa dovrei andare a insiserire in ogni pagina per far leggere al database il ruolo?





Nome​
Tipo​
Codifica caratteri​
Attributi​
Null​
Predefinito​
Extra​
Azione​
1​
memberID
int(11)NoNessunoAUTO_INCREMENT
2​
username​
varchar(255)latin1_swedish_ciNoNessuno
3​
password​
varchar(255)latin1_swedish_ciNoNessuno
4​
email​
varchar(255)latin1_swedish_ciNoNessuno
5​
ruolo​
varchar(255)latin1_swedish_ciNoNessuno
6​
active​
varchar(255)latin1_swedish_ciNoNessuno
7​
resetToken​
varchar(255)latin1_swedish_ciNULL
8​
resetComplete​
varchar(3)SiNo
 
Ultima modifica:

mr.x

Utente Attivo
9 Apr 2016
250
25
28
Ciao Frozenn, ti appare un errore ma non hai indicato quale..

Ad ogni modo, se vuoi assegnare dei ruoli agli utenti, puoi codificare i ruoli in corrispondenza numerica (es. 1 per amministratori, 2 per editori, 3 solo visualizzazione , ecc..). Nel codice, dopo la verificato che l'utente sia loggato, recuperi anche il "grado" di accessoe presenti le pagine di conseguenza (dopo avere opportunamente salvato la session ).
 
  • Like
Reactions: Frozzen

Frozzen

Utente Attivo
18 Gen 2019
55
0
6
28
Milano
Ciao, praticamente quando mi registro dice:

SQLSTATE[HY000]: General error: 1364 Field 'ruolo' doesn't have a default value

Mi sapresti dire come fare per andare ad inserire i ruoli in base alla corrispondenza numerica?
Vorrei aver modo di dare accesso a più persone (esempio 4) ma non tutte le persone dovranno aver accesso alle pagine (esempio 2 su 4 persone)..
Magari anche da tabella diversa con corrispondenza numerica..
Grazie

in ogni pagina protetta ad inizio pagina ho:

PHP:
<?php require('includes/config.php');

//if not logged in redirect to login page
if(!$user->is_logged_in()){ header('Location: login.php'); exit(); }

//define page title
$title = 'Members Page';

//include header template
require('layout/header.php');

if($_SESSION['ruolo'] !== 'admin'){

}

?>

FORM LOGIN:
PHP:
<?php
//include config
require_once('includes/config.php');

//check if already logged in move to home page
if( $user->is_logged_in() ){ header('Location: index.php'); exit(); }

//process login form if submitted
if(isset($_POST['submit'])){

    if (!isset($_POST['username'])) $error[] = "Please fill out all fields";
    if (!isset($_POST['password'])) $error[] = "Please fill out all fields";

    $username = $_POST['username'];
    if ( $user->isValidUsername($username)){
        if (!isset($_POST['password'])){
            $error[] = 'A password must be entered';
        }
        $password = $_POST['password'];

        if($user->login($username,$password)){
            $_SESSION['username'] = $username;
            header('Location: memberpage.php');
            exit;

        } else {
            $error[] = 'Wrong username or password or your account has not been activated.';
        }
    }else{
        $error[] = 'Usernames are required to be Alphanumeric, and between 3-16 characters long';
    }



}//end if submit

//define page title
$title = 'Login';

//include header template
require('layout/header.php');
?>

FORM REGISTRAZIONE
PHP:
PHP:
<?php require('includes/config.php');

// se effettuato l'accesso reindirizza alla pagina dei membri
if( $user->is_logged_in() ){ header('Location: memberpage.php'); exit(); }

// se il modulo è stato inviato, elaboralo
if(isset($_POST['submit'])){

    if (!isset($_POST['username'])) $error[] = "Please fill out all fields";
    if (!isset($_POST['email'])) $error[] = "Please fill out all fields";
    if (!isset($_POST['password'])) $error[] = "Please fill out all fields";

    $username = $_POST['username'];

// validazione
    if(!$user->isValidUsername($username)){
        $error[] = 'I nomi utente devono contenere almeno 3 caratteri alfanumerici';
    } else {
        $stmt = $db->prepare('SELECT username FROM members WHERE username = :username');
        $stmt->execute(array(':username' => $username));
        $row = $stmt->fetch(PDO::FETCH_ASSOC);

        if(!empty($row['username'])){
            $error[] = 'Nome inserito già in uso.';
        }

    }

    if(strlen($_POST['password']) < 3){
        $error[] = 'Password troppo corta.';
    }

    if(strlen($_POST['passwordConfirm']) < 3){
        $error[] = 'La password confermata è troppo corta';
    }

    if($_POST['password'] != $_POST['passwordConfirm']){
        $error[] = 'le password non corrispondono';
    }

    //validazione email
    $email = htmlspecialchars_decode($_POST['email'], ENT_QUOTES);
    if(!filter_var($email, FILTER_VALIDATE_EMAIL)){
        $error[] = 'Inserisci un indirizzo email valido.';
    } else {
        $stmt = $db->prepare('SELECT email FROM members WHERE email = :email');
        $stmt->execute(array(':email' => $email));
        $row = $stmt->fetch(PDO::FETCH_ASSOC);

        if(!empty($row['email'])){
            $error[] = 'Email inserita già in uso.';
        }

    }


// se non sono stati creati errori, continua
    if(!isset($error)){

        //hash the password
        $hashedpassword = $user->password_hash($_POST['password'], PASSWORD_BCRYPT);

        //create the activasion code
        $activasion = md5(uniqid(rand(),true));

        try {

// inserisce nel database con un'istruzione preparata
            $stmt = $db->prepare('INSERT INTO members (username,password,email,active) VALUES (:username, :password, :email, :active)');
            $stmt->execute(array(
                ':username' => $username,
                ':password' => $hashedpassword,
                ':email' => $email,
                ':active' => $activasion
            ));
            $id = $db->lastInsertId('memberID');

            //invia email
            $to = $_POST['email'];
            $subject = "Registrazione confermata";
            $body = "<p>Registrazione avvenuta con successo.</p>
            <p>Per attivare il tuo account, clicca sul link: <a href='".DIR."activate.php?x=$id&y=$activasion'>".DIR."activate.php?x=$id&y=$activasion</a></p>
            <p>Saluti, Davide Marcellino</p>";

            $mail = new Mail();
            $mail->setFrom(SITEEMAIL);
            $mail->addAddress($to);
            $mail->subject($subject);
            $mail->body($body);
            $mail->send();

            // reindirizza alla pagina dell'indice
            header('Location: index.php?action=joined');
            exit;

        // else cattura l'eccezione e mostra l'errore.
        } catch(PDOException $e) {
            $error[] = $e->getMessage();
        }

    }

}

// definisce il titolo della pagina
$title = 'Demo';

// include modello di intestazione
require('layout/header.php');
?>


<div class="container">

    <div class="row">

        <div class="col-xs-12 col-sm-8 col-md-6 col-sm-offset-2 col-md-offset-3">
            <form role="form" method="post" action="" autocomplete="off">
                <h2>REGISTRATI ADESSO!</h2>
                <p>Sei già registrato? <a href='login.php'>Login</a></p>
                <hr>

                <?php
                // controlla eventuali errori
                if(isset($error)){
                    foreach($error as $error){
                        echo '<p class="bg-danger">'.$error.'</p>';
                    }
                }

                // se l'azione si unisce mostra il successo
                if(isset($_GET['action']) && $_GET['action'] == 'joined'){
                    echo "<h4 class='bg-success'>Registrazione avvenuta con successo, controlla la tua e-mail per attivare il tuo account.</h4>";
                }
                ?>

                <div class="form-group">
                    <input type="text" name="username" id="username" class="form-control input-lg" placeholder="Nome utente" value="<?php if(isset($error)){ echo htmlspecialchars($_POST['username'], ENT_QUOTES); } ?>" tabindex="1">
                </div>
                <div class="form-group">
                    <input type="email" name="email" id="email" class="form-control input-lg" placeholder="Indirizzo email" value="<?php if(isset($error)){ echo htmlspecialchars($_POST['email'], ENT_QUOTES); } ?>" tabindex="2">
                </div>
                <div class="row">
                    <div class="col-xs-6 col-sm-6 col-md-6">
                        <div class="form-group">
                            <input type="password" name="password" id="password" class="form-control input-lg" placeholder="Password" tabindex="3">
                        </div>
                    </div>
                    <div class="col-xs-6 col-sm-6 col-md-6">
                        <div class="form-group">
                            <input type="password" name="passwordConfirm" id="passwordConfirm" class="form-control input-lg" placeholder="Conferma Password" tabindex="4">
                        </div>
                    </div>
                </div>

                <div class="row">
                    <div class="col-xs-6 col-md-6"><input type="submit" name="submit" value="Registrati" class="btn btn-primary btn-block btn-lg" tabindex="5"></div>
                </div>
            </form>
        </div>
    </div>

</div>

<?php
//include header template
require('layout/footer.php');
?>
 
Ultima modifica:

macus_adi

Utente Attivo
5 Dic 2017
1.266
82
48
IT/SW
$stmt->execute(array( ':username' => $username, ':password' => $hashedpassword, ':email' => $email, ':active' => $activasion ));
Questo che dovrebbe essere il model andrebbe fatto in modo diverso!!!

Prova così:
PHP:
class UserModel {
 
   protected $table="tabella_utenti";
 
   protected $default_values=
      [
         'username'=>['field'=>'username','default'=>'','not_null'=>true,'filter'=>'sanatize_string','conditions'=>['unique']],
         'password'=>['field'=>'password','default'=>'','not_null'=>true,'filter'=>'hash'],
         'email'=>['field'=>'email','not_null'=>true,'default'=>'','filter'=>'validation_email','conditions'=>['unique']],
         'active'=>['field'=>'','not_null'=>true,'default'=>false,'filter'=>'boolean'],
         'ruolo'=>['field'=>'','not_null'=>true,'default'=>'general_user','filter'=>'string']
      ];
   public $data=[];

   public static function newUser(){
      return (new self);
   }

   public function prepareDataInsert($data){
      foreach ($this->default_values as $k=>$v){
         (!isset($data[$v['field']]))?$data[$v['field']]=$v['default']:null;
         $this->filters($data[$v['field']],$v);
         $this->data[$v['field']]=$data[$v['field']];
      }
   }

   private function filters($data,$config){
      //condizioni qui dentro
   }
}
La richiami in questo modo:
PHP:
$user_to_insert=UserModel::newUser()->prepareDataInsert($_POST)->data;
Questa chiamate restituisce esattamente i dati pronti per l'inserimento nel db, con i vincoli da te descritti...

In questo modo prevedi i dati mancanti di default, e utilizzando una notazione nettamente migliore separando le varie logiche.
Naturalmente la classe dovrà gestire le operazioni basilari che lascio a te l'onere di scriverle...
 
  • Like
Reactions: Frozzen

Frozzen

Utente Attivo
18 Gen 2019
55
0
6
28
Milano
Ciao Marcus, grazie dell'aiuto ma non riesco minimamente a capire come modificare tutti i file per far si da creare ciò che ho chiesto.
Se ti va di scrivermi anche i nomi dei file da sostituire va bene, altrimenti grazie per l'aiuto. o_Oo_Oo_O
 

macus_adi

Utente Attivo
5 Dic 2017
1.266
82
48
IT/SW
grazie dell'aiuto ma non riesco minimamente a capire come modificare tutti i file per far si da creare ciò che ho chiesto
Crei la classe di cui sopra
if(isset($_POST['submit'])){
Esattamente qui richiami la classe in questo modo:
PHP:
$user_to_insert=UserModel::newUser()->prepareDataInsert($_POST)->data;
Quindi in $user_to_insert hai esattamente il modello dati da inserire con lo statment
PHP:
$stmt = $db->prepare('INSERT INTO members (username,password,email,active) VALUES (:username, :password, :email, :active)');
            $stmt->execute(array(
':username' => $username,
':password' => $hashedpassword,
':email' => $email,
':active' => $activasion
));
$id = $db->lastInsertId('memberID');
Naturalmente le variabili username,hashedpassword,etc saranno da modificare con l'unica variabile tornata dal model ossia: user_to_insert['username'] etc......


invece di scrivere a manina l'execute potresti provare ad utilizzare una cosa come questa
Dove $type è esattamente la tipologia di dato da inserire separati da virgola ossia:
i - integer
d - double
s - string
b - BLOB
PHP:
public function BindConnQuery($bind,$type){
      $this->stmt=$this->mysqli->prepare($this->query);
      if($this->stmt->param_count != count($bind)){
          //return [];
      }
      $callArgs = array();
      foreach($bind as $index => $arg) {
          $callArgs[$index] = &$bind[$index];
      }
      try {
          array_unshift($callArgs, $type);
          call_user_func_array(array($this->stmt, 'bind_param'), $callArgs);
          $this->stmt->execute();
      }
      catch (Exception $e) {
          print_r($e);
          die;
      }
  }
Nel tuo esempio sarà del tipo:
PHP:
$conn->query='INSERT INTO members (username,password,email,active,ruolo) VALUES (?,?,?,?,?)';
$conn->BindConnQuery($user_to_insert,'sssss');
Questa sintassi permette di evitare la scrittura della logica in posizioni errate!
 

Frozzen

Utente Attivo
18 Gen 2019
55
0
6
28
Milano
Ho scritto bene?
- Perchèper loggare si logga..ma se elimino dalla pagina privata "admin" si logga comunque..
- Invece per la registrazione esce:
SQLSTATE[HY093]: Invalid parameter number: parameter was not defined


registrazione.php

PHP:
<?php require('includes/config.php');

// se effettuato l'accesso reindirizza alla pagina dei membri
if( $user->is_logged_in() ){ header('Location: memberpage.php'); exit(); }

// se il modulo è stato inviato, elaboralo
if(isset($_POST['submit'])){

    if (!isset($_POST['username'])) $error[] = "Please fill out all fields";
    if (!isset($_POST['email'])) $error[] = "Please fill out all fields";
    if (!isset($_POST['password'])) $error[] = "Please fill out all fields";

    $username = $_POST['username'];

// validazione
    if(!$user->isValidUsername($username)){
        $error[] = 'I nomi utente devono contenere almeno 3 caratteri alfanumerici';
    } else {
        $stmt = $db->prepare('SELECT username FROM members WHERE username = :username');
        $stmt->execute(array(':username' => $username));
        $row = $stmt->fetch(PDO::FETCH_ASSOC);

        if(!empty($row['username'])){
            $error[] = 'Nome inserito già in uso.';
        }

    }

    if(strlen($_POST['password']) < 3){
        $error[] = 'Password troppo corta.';
    }

    if(strlen($_POST['passwordConfirm']) < 3){
        $error[] = 'La password confermata è troppo corta';
    }

    if($_POST['password'] != $_POST['passwordConfirm']){
        $error[] = 'le password non corrispondono';
    }

    //validazione email
    $email = htmlspecialchars_decode($_POST['email'], ENT_QUOTES);
    if(!filter_var($email, FILTER_VALIDATE_EMAIL)){
        $error[] = 'Inserisci un indirizzo email valido.';
    } else {
        $stmt = $db->prepare('SELECT email FROM members WHERE email = :email');
        $stmt->execute(array(':email' => $email));
        $row = $stmt->fetch(PDO::FETCH_ASSOC);

        if(!empty($row['email'])){
            $error[] = 'Email inserita già in uso.';
        }

    }


// se non sono stati creati errori, continua
    if(!isset($error)){

        //hash the password
        $hashedpassword = $user->password_hash($_POST['password'], PASSWORD_BCRYPT);

        //create the activasion code
        $activasion = md5(uniqid(rand(),true));

        try {

// inserisce nel database con un'istruzione preparata
class UserModel {
 
   protected $table="tabella_utenti";
 
   protected $default_values=
      [
         'username'=>['field'=>'username','default'=>'','not_null'=>true,'filter'=>'sanatize_string','conditions'=>['unique']],
         'password'=>['field'=>'password','default'=>'','not_null'=>true,'filter'=>'hash'],
         'email'=>['field'=>'email','not_null'=>true,'default'=>'','filter'=>'validation_email','conditions'=>['unique']],
         'active'=>['field'=>'','not_null'=>true,'default'=>false,'filter'=>'boolean'],
         'ruolo'=>['field'=>'','not_null'=>true,'default'=>'general_user','filter'=>'string']
      ];
   public $data=[];

   public static function newUser(){
      return (new self);
   }

      public function BindConnQuery($bind,$type){
      $this->stmt=$this->mysqli->prepare($this->query);
      if($this->stmt->param_count != count($bind)){
          //return [];
      }
      $callArgs = array();
      foreach($bind as $index => $arg) {
          $callArgs[$index] = &$bind[$index];
      }
      try {
          array_unshift($callArgs, $type);
          call_user_func_array(array($this->stmt, 'bind_param'), $callArgs);
          $this->stmt->execute();
      }
      catch (Exception $e) {
          print_r($e);
          die;
      }
  }

   private function filters($data,$config){
      //condizioni qui dentro
   }
}
            $stmt->execute(array(
                ':username' => $username,
                ':password' => $hashedpassword,
                ':email' => $email,
                ':active' => $activasion
            ));
            $id = $db->lastInsertId('memberID');

            //invia email
            $to = $_POST['email'];
            $subject = "Registrazione confermata";
            $body = "<p>Registrazione avvenuta con successo.</p>
            <p>Per attivare il tuo account, clicca sul link: <a href='".DIR."activate.php?x=$id&y=$activasion'>".DIR."activate.php?x=$id&y=$activasion</a></p>
            <p>Saluti, Davide Marcellino</p>";

            $mail = new Mail();
            $mail->setFrom(SITEEMAIL);
            $mail->addAddress($to);
            $mail->subject($subject);
            $mail->body($body);
            $mail->send();

            // reindirizza alla pagina dell'indice
            header('Location: index.php?action=joined');
            exit;

        // else cattura l'eccezione e mostra l'errore.
        } catch(PDOException $e) {
            $error[] = $e->getMessage();
        }

    }

}

// definisce il titolo della pagina
$title = 'Demo';

// include modello di intestazione
require('layout/header.php');
?>

login.php
PHP:
<?php
//include config
require_once('includes/config.php');

//check if already logged in move to home page
if( $user->is_logged_in() ){ header('Location: index.php'); exit(); }

//process login form if submitted
$user_to_insert=UserModel::newUser()->prepareDataInsert($_POST)->data;
$stmt = $db->prepare('INSERT INTO members (username,password,email,active) VALUES (:username, :password, :email, :active)');
            $stmt->execute(array(
':username' => $username,
':password' => $hashedpassword,
':email' => $email,
':active' => $activasion
));
$id = $db->lastInsertId('memberID');

    if (!isset($_POST['username'])) $error[] = "Please fill out all fields";
    if (!isset($_POST['password'])) $error[] = "Please fill out all fields";

    $username = $_POST['username'];
    if ( $user->isValidUsername($username)){
        if (!isset($_POST['password'])){
            $error[] = 'A password must be entered';
        }
        $password = $_POST['password'];

        if($user->login($username,$password)){
            $_SESSION['username'] = $username;
            header('Location: memberpage.php');
            exit;

        } else {
            $error[] = 'Wrong username or password or your account has not been activated.';
        }
    }else{
        $error[] = 'Usernames are required to be Alphanumeric, and between 3-16 characters long';
    }



}//end if submit

//define page title
$title = 'Login';

//include header template
require('layout/header.php');
?>


invece nel login non ci dovrebbe essere un'alternativa di accesso in base all'utenza nel punto

PHP:
if($user->login($username,$password)){
            $_SESSION['username'] = $username;
            header('Location: memberpage.php');
            exit;