Login e doppia tipologia utenti

Salve a tutti, mi è stato chiesto di creare un piccolo modulo per la gestione degli ordini di un sito web, ho quindi creato una struttura del tipo:

  • registrazione utenti
  • login
  • richiesta ordine
  • pagina riepilogo/invio

Fin qui tutto funzionante, successivamente mi è stato chiesto di differenziare il tipo di utente da privato ad azienda...

Qui sono iniziati i miei dubbi, come fare?

La registrazione da privato mi chiede alcuni dati anagrafici, mentre quella da azienda ne chiede altri.

Dopo il login la pagina di richiesta ordine sarebbe sempra la stessa, ma quella di riepilogo come fa a sapere dove (o come) estrarre i dati anagrafici del cliente visto che attualmente ho solo un semplice database anagrafico?

Qualche suggerimento?

inviato 5 anni fa
wizard86
X 0 X

Scusa se il problema è la gestione,non potresti fare così:

alla richiesta della registrazione, chiedi in primo luogo se è privato o azienda con una select per esempio, in base a questo apri il form con i campi specifici, poi al momento dell'inserimento in un database, dal quel form prelevi il valore da un campo hidden,che potrebbe avere name ="privilegi" e valore 1 per privato o 2 per azienda, in sessione inserisci pure questo valore, così potrai differenziare le operazione in base ai privilegi..

risposto 5 anni fa
superson_16
X 0 X

Scusa se il problema è la gestione,non potresti fare così:

alla richiesta della registrazione, chiedi in primo luogo se è privato o azienda con una select per esempio, in base a questo apri il form con i campi specifici

questo l'avevo già pensato, chiedere fin da subito al cliente se è un privato un'azienda, OK

poi al momento dell'inserimento in un database, dal quel form prelevi il valore da un campo hidden,che potrebbe avere name ="privilegi" e valore 1 per privato o 2 per azienda

Si, avevo pensato anche a questo, ma in questo modo quindi manterrei un solo database anagrafico con all'interno sia privati che aziende, giusto?

in sessione inserisci pure questo valore, così potrai differenziare le operazione in base ai privilegi..

Io ho strutturato la pagina di riepilogo ordine in modo tale che mostri oltre alla marce ordinata, anche l'anagrafica dell'utente, in caso di unico data base come farei a distinguere i campi da estrarmi?

risposto 5 anni fa
wizard86
X 0 X

Ho letto veloce e spero di aver capito bene il problema, comunque potresti far gestire la connessione al database in modo dinamico in base alla scelta dell'utente..Sempre se ho cpaito bene oggi nel pomerriggio rileggerò più con calma

risposto 5 anni fa
superson_16
X 0 X

Ho riletto e penso di confermare di rendere dinamica la query che fai per ottenere i campi interessati, però non devi mettere le 2 identità in 2 database diversi,bensì bastano 2 tabelle diverse che interroghia seconda del valore che hai nel campo della sessione..Poi il come porre il codice per far sì che sia più leggibile o esportabile dipende da te

risposto 5 anni fa
superson_16
X 0 X
Ho riletto e penso di confermare di rendere dinamica la query che fai per ottenere i campi interessati, però non devi mettere le 2 identità in 2 database diversi,bensì bastano 2 tabelle diverse che interroghia seconda del valore che hai nel campo della sessione..Poi il come porre il codice per far sì che sia più leggibile o esportabile dipende da te

Ci provo!

risposto 5 anni fa
wizard86
X 0 X

Ok fai sapere com'è andata

risposto 5 anni fa
superson_16
X 0 X

Ciao superson_16, ho provato come dici tu ma mi vado incontro a dei dubbi...

Nel caso delle 2 tabelle:

tu intendi una cosa tipo questa?

TIPOLOGIA UTENTE (ID,NomeTipologia)

UTENTI (ID,ID Tipologia, Attr 1...Attr N)

oppure

PRIVATI (ID, ID Tipologia, Attr 1...Attr N)

AZIENDE (ID, ID Tipologia, Attr 1...Attr N)

risposto 5 anni fa
wizard86
X 0 X

Ciao ammesso che hai nella sessione il tipo di utenza,magari privilegi che se 1 è privato, se 2 è azienda,dopo il login (perchè per la registrazione,fai inserire sempre nella tabella specifica comunque tramite uno switch fatto sulla varibile in $_POST che ti sei portato dal campo hidden per la scelta fatta sulla select(privato o azienda) ),,,e dicevo  potresti fare uno switch in testa ad una pagina di redirect che ti invia ad una sotto-directory(così giusto per tenere il codice un pò più ordinato)dove hai tutti i file per la gestione di quell'entità, in seguito a questo switch interroghi la tabella 'privati'  o 'azienda' a secondo dell'entità sulla quale stai operando,,, la variabile di sessione, dalla quale nasce tutto questo, la crei a seconda del tipo di login fatto,quindi per comodità crei una tabella chiamata 'utenze',con campi (id,username,entita),quindi dopo il login fai la select su questa tabella e dal risultato crei il valore entità in sessione, questo implica che nella registrazione  non puoi permettere che come username io metta uno già esistente, quindi con messaggi ed invito a scegliere un nuovo username.. Riepilogando crei 3 tabelle, una utenze, una privati, l'altra aziende, in fase di registrazione,in base alla select scelta, registri i dati username e il campo hidden 'privati' o 'aziende' nel campo di questa tabella chiamato entita, poi gli altri campi che hai nel form(partita iva o altri a seconda del tipo di entita) lo scrivi nella tabella specifica, il login lo fai sulal tabella utenze, ed in base al campo entita reindirizzi ad una pagina  per privati o l'alta per aziende,ed in queste pagine hai lo specifico script per itnerrogare la tabella privati o aziende a seconda dell tue necessità con i  nomi dei campi corrispondenti

risposto 5 anni fa
superson_16
X 0 X

Allora vediamo un po...

Al login metto questo:

$query  = "SELECT * FROM utenze WHERE email = '$email' AND password = MD5('$password')";
  $result = mysql_query($query);
  // controllo l'esito
  if (!$result) {
    die("Errore nella query $query: " . mysql_error());
  }

  $record = mysql_fetch_array($result);

  if(!$record) {
    $messaggio = urlencode('86 - Dati di login non correti');
    header("location: $_SERVER[PHP_SELF]?msg=$messaggio");
  } else {
    session_start();
    ??????????????????????????????????
    header("location: mod-ordini.php");
     exit();
  }

Non ho capito bene come creare la sessione a questo punto...

Prima io la sessione la creavo in questo modo

$_SESSION['user_id'] = $record['id'];

Ti spiego meglio il funzionamento di quello che devo fare:

Sia che si tratti di un privato sia che si tratti di una azienda, la pagina che segue è sempre mod-ordini.php, da li poi, una volta effettuato l'ordine, si arriva ad una pagina di riepilogo che oltre a contenere la merce ordinata, deve contenere tutta l'anagrafica dell'utente, quindi in base al tipo di utente loggato dovrà fare una select sulla giusta tabella.

risposto 5 anni fa
wizard86
X 0 X

Allora la sessione la puoi creare appena dopo validato il post dello username e della password... per i dati specifici, allora nella pagina del riepilogo, fai sotto tutti i dettagli dell'ordine,sempre in base al valore nella sessione,che potresti creare così:

$_SESSION['user_id'] = $record['id'];

$_SESSION['entita'] = $record['entita];

uno switch($_SESSION['entita'] )

case 'privati':

 include 'Pagina_dati_privati'

 break;

case 'azienda':

include 'Pagina_dati_azienda'

queste 2 pagine ti potranno servire per molti usi,all'interno di queste pagine tramite il valore in sessione: $_SESSION['user_id'] e $_SESSION['entita'] = $record['entita]; fai la select sulla tabella di interesse e gestisci il template specifico

risposto 5 anni fa
superson_16
X 0 X

Quindi infine avrò creato le seguenti tabelle nel mio database:

UTENZE

| ID | EMAIL | PASSWORD | ENTITA |

PRIVATI

| ? | ? | NOME | COGNOME | PROVINCIA | CITTA | INDIRIZZO | CAP | TELEFONO |

AZIENDE

| ? | ? | REF AZIENDALE| RAG SOCIALE | PIVA | COD FISCALE | PROVINCIA | CITTA | INDIRIZZO | CAP | TELEFONO |

Ecco i punti interrogativi sono esattamente i miei dubbi sulle chiavi primarie e sulle chiavi esterne....

risposto 5 anni fa
wizard86
X 0 X

Io lascerei stare le chiavi esterne se sei su aruba,perchè come database engine non accetta innodb e quindi non ti passa on delete e on update, in quei campi metterei id che ti viene dopo l'inserimento in utenze (magari con un max(id)), e l'email,così te la trovi (come se avessi una vista), poi ovvio che dovrai gestire la cancellazione tu,ma in fondo è solo una riga di codice..

risposto 5 anni fa
superson_16
X 0 X

Si ma senza una chiave esterna come relaziono la tabella UTENZE con le altre 2?

Effettuo il login, so che l'utente ha come entità il valore 1(privati) a questo punto che valore uso per estrarmi i dati dalla tabella PRIVATI ?

risposto 5 anni fa
wizard86
X 0 X

io feci una cosa del genere,e aruba non mi permetteva molte cose, quindi nel tuo caso specifico farei così,id tabella utenze con auto-increment, id senza auto increment per la tabella primati e quella aziende, quindi dopo inserito in utenze estraggo l'ultimo id (max id) e lo inserisco in id per della tabella in questione (privati o aziende) insieme a tutti gli altri dati che ne competono, quindi dopo il login, io ho estratto anche l'id giusto? questo id, insieme al valore che ho in entita (della tabella utenze) ho anche il nome della tabella da dove preleverò gli altri dati... poi se in campo entita di utenze voglio mettere 1 o 2 e non privati o aziende,e quindi anche nella sessione avrò questo valore (1 o 2) tanto meglio,perchè la cosa sarà un pò più più mascherata, quindi poi in seguito allo switch aprirò la pagina specifica per utenze o aziende e di conseguenza avrò la query specifica sulla tabella preposta..

P.s: l'id estratto dalla tabella utenze avrà un solo id uguale presente nella tabella aziende o privati nel caso specifico

risposto 5 anni fa
superson_16
X 0 X

Eccomi di nuovo qui, ho cercato di mettere in codice i tuoi consigli ma, non tutto va come deve andare...

eseguendo il codice riportato qui sotto, la query alla tabella Privati non genera nulla, invece mi viene replicato l'inserimento della tabella Login

if ($nome == null || $cognome == null || $indirizzo == null || $cap == null || $citta == null || $provincia == null || $telefono == null || $email == null || $password == null) {
      echo "\n<div class='ui-messages ui-widget' id='msgs'>";
      echo "\n<div class='ui-messages-error ui-corner-all'>";
      echo "\n<span class='ui-messages-error-icon'></span>";
      echo "\n<ul>";
      echo "\n<li>";
      echo "\n<span class='ui-messages-error-summary'>Tutti i campi sono obbligatori</span>";
      echo "\n</li>";
      echo "\n</ul>";
      echo "\n</div>";
      echo "\n</div>";
   }
   
   else {

      $query = "INSERT INTO Login (id_categoria,email,password)
                      VALUES ('".$categoria."','".$email."','".$password."')";
      $id      = mysql_insert_id();
      $result = mysql_query($query);
      
      
      if (!$result) {
         echo ("<h2>Risultato Inserimento</h2>\r\n");
         echo ("Errore durante la registrazione di un nuovo utente<br/ >\r\n");
         echo mysql_errno() . ": " . mysql_error();
         echo ("<br />Riprova...<br />\n");
      }
      
      else {
      
         $querypvt = "INSERT INTO Privati (id_privato,nome,cognome,indirizzo,cap,citta,provincia,telefono)
                         VALUES ('".$id."','".$nome."','".$cognome."','".$indirizzo."','".$cap."','".$citta."','".$provincia."','".$telefono."')";
         
         $resultpvt = mysql_query($query);
      
         if (!$resultpvt) {
            echo ("<h2>Risultato Inserimento</h2>\r\n");
            echo ("Errore durante la registrazione di un nuovo utente<br/ >\r\n");
            echo mysql_errno() . ": " . mysql_error();
            echo ("<br />Riprova...<br />\n");
         }
      
         else {
   
            $emailda       = 'xxxx@gmail.com'; //Indirizzo usato per l'invio
            $destinatario  = $email. "\r\n";
            $header       = "From: xxxx <".$emailda.">\r\n";
            $header       .= "MIME-Version: 1.0\r\n";
            $header      .= "Content-type: text/html; charset=iso-8859-1\r\n";
            $oggetto       = "Attivazione\r\n";
            $messaggio      = "Registrazione su www.xxx.it avvenuta con successo!<br />\r\n";
            $messaggio     .= "Ti consigliamo di conservare con cura i dati di accesso.<br />\r\n";
            $messaggio     .= "Email: ".$email."<br /> Password: ".$password."\r\n";
   
            //ini_set('sendmail_from', 'xxxx@gmail.com');
   
            if(mail($destinatario, $oggetto, $messaggio , $header)) {
               
               $rsl = ok;
               header("location: check.php?result=$rsl");
               exit();
            }
            else {
               echo "\n<div class='ui-messages ui-widget' id='msgs'>";
               echo "\n<div class='ui-messages-error ui-corner-all'>";
               echo "\n<span class='ui-messages-error-icon'></span>";
               echo "\n<ul>";
               echo "\n<li>";
               echo "\n<span class='ui-messages-error-summary'>".mysql_errno() . ": " . mysql_error()."</span>";
               echo "\n</li>";
               echo "\n</ul>";
               echo "\n</div>";
               echo "\n</div>";
            }
         }
      }
   }
risposto 5 anni fa
wizard86
X 0 X

Ciao non capisco bene come stai impostando il codice tu comunque la parte:

[CODE PHP]

      $query = "INSERT INTO Login (id_categoria,email,password)

                      VALUES ('".$categoria."','".$email."','".$password."')";

      $id      = mysql_insert_id();

      $result = mysql_query($query);

[END CODE PHP]

fà sì che $result abbia l'id appena inserito in tabella login(che suppongo sia la stessa tabella utenze che ti ho suggerito?)

comunque se è la tabella che identificavo io con "utenze", in questa pagina hai anche il tipo di select che ha selzionato l0utente, quindi un $_POST['entita'] che corrisponde o a privati o aziende, a questo punto,, fai uno switch sulla variabile $_POST['entita'], e se ha  valore "privati"  fai eseguire una insert sulla tabella privati se ha valore "aziende" fai eseguire la insert in aziende con i dovuti campi specifici, questo per quanto riguarda la registrazione ovviamente...Se non è chiaro mandami un messaggio privato,così magari alla fine postiamo direttament la soluzione,se ne esce un topic lungo un'eternità

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