PHP Interrogazione SQL variabile

Noisy

Utente Bronze
20 Febbraio 2019
19
2
8
34
Ciao ragazzi, vi spiego brevemente cosa dovrei fare e non riesco: in base alle credenziali di login, dovrei provare, tramite query, le coppie (email,password) in 4 tabelle differenti: admin, addetto, magazziniere, fornitore. (non ho una tabella unica chiamata users, perchè il progetto prevede che ci siano 4 tabelle differenti per 4 tipi di utenti diversi)

Perciò provo la prima query con la coppia email e password nella tabella admin, se va bene mi redirecta in admin.php, altrimenti dovrei provare sempre quella coppia email e password nella tabella addetto con un'altra query e così via..
Ho provato in tutte le maniere, con un if, con gli switch, ma nulla.


Come potrei fare?
 
Ciao ragazzi, vi spiego brevemente cosa dovrei fare e non riesco: in base alle credenziali di login, dovrei provare, tramite query, le coppie (email,password) in 4 tabelle differenti: admin, addetto, magazziniere, fornitore. (non ho una tabella unica chiamata users, perchè il progetto prevede che ci siano 4 tabelle differenti per 4 tipi di utenti diversi)

Perciò provo la prima query con la coppia email e password nella tabella admin, se va bene mi redirecta in admin.php, altrimenti dovrei provare sempre quella coppia email e password nella tabella addetto con un'altra query e così via..
Ho provato in tutte le maniere, con un if, con gli switch, ma nulla.


Come potrei fare?
Ciao, normalmente questa tipologia di problemi viene risolta con un campo enumeratore o stringa sulla tabella degli utenti. Visto che le tue specifiche richiedono la presenza obbligatoria di 4 tabelle ti posso dare qualche via possibile per risolvere il tuo problema:
  • Lavorare tramite una VIEW e centralizzare i dati, per esempio tramite UNION:
    SQL:
    SELECT NomeUtente, Password,
    'ADMIN' AS Ruolo
    FROM tblADMIN
    
    UNION
    
    SELECT NomeUtente,
    Password,
    'ADDETTO' AS Ruolo
    FROM tblADDETTI
    
    UNION
    
    ...
  • Gestire l'interrogazione SQL in base alla tipologia di utente, cioè eseguire una query diversa a seconda della tipologia di login
Fammi sapere se ti servono ulteriori chiarimenti oppure risolvi il tuo problema :)
 
Ultima modifica:
  • Gestire l'interrogazione SQL in base alla tipologia di utente, cioè eseguire una query diversa a seconda della tipologia di login
Ed è proprio qui che trovo difficoltà.
Fino ad adesso, sono riuscito a loggare solamente come direttore, dovrei fare in modo che se va male la query, prova la seconda, se va male la seconda prova la terza e così via ma non riesco
Messaggio unito automaticamente:

Sono riuscito a farlo, funziona. Posto il codice qui sotto.
Mi chiedo se c'è un modo per farlo meglio?
PHP:
<?php 
require_once "database.php";
$error =''; // Variabile che conterrà i messaggi di errore;
if(isset($_POST['login'])){
    if(empty($_POST['email']) || empty($_POST['pass'])){
        $error = "Email o password invalidi!";
    }
    else {
        $email = $_POST['email'];
        $pass = $_POST['pass'];
        $pass = hash("sha256", $pass);
        $sql = "SELECT email, pass, id_direttore, 'admin' AS Ruolo FROM direttore WHERE email = '$email' AND pass = '$pass'
        UNION SELECT email, pass, id_fornitore, 'fornitore' AS Ruolo FROM fornitore WHERE email = '$email' AND pass = '$pass'
        UNION SELECT email, pass, id_magazziniere, 'magazziniere' AS Ruolo FROM magazziniere WHERE email = '$email' AND pass = '$pass'
        UNION SELECT email, pass, id_addetto, 'addetto' AS Ruolo FROM addetto_vendita WHERE email = '$email' AND pass = '$pass'";
        $result = mysqli_query($conn, $sql) or die("Bad query: $sql");
            
        while($row = mysqli_fetch_assoc($result)){
                if($row['Ruolo'] == 'admin'){
                    session_start();
                    $_SESSION['logged_in'] = $row['id_direttore'];
                    header("location: direttore.php");
                }
                if($row['Ruolo'] == 'magazziniere')
                {
                    session_start();
                    $_SESSION['logged_in'] = $row['id_direttore'];
                    header("location: magazzino.php");
                }
                if($row['Ruolo'] == 'fornitore'){
                    session_start();
                    $_SESSION['logged_in'] = $row['id_direttore'];
                    header("location: fornitore.php");
                }
                if($row['Ruolo'] == 'addetto'){
                    session_start();
                    $_SESSION['logged_in'] = $row['id_direttore'];
                    header("location: addetto.php");
                }
            }
        $error = "Username o password non trovati";
    }
}
?>
Messaggio unito automaticamente:

Mi chiedo se c'è un modo per farlo meglio? (ho provato a farlo con $conn->prepare('query') però con questa query così lunga mi da problemi, non so)
E poi non so perchè questa query mi da nel risultato tutti gli id come id_direttore anche se in realtà dovrebbero essere id_magazziniere id_addetto ecc?
 
Ed è proprio qui che trovo difficoltà.
Fino ad adesso, sono riuscito a loggare solamente come direttore, dovrei fare in modo che se va male la query, prova la seconda, se va male la seconda prova la terza e così via ma non riesco
Messaggio unito automaticamente:

Sono riuscito a farlo, funziona. Posto il codice qui sotto.
Mi chiedo se c'è un modo per farlo meglio?
PHP:
<?php
require_once "database.php";
$error =''; // Variabile che conterrà i messaggi di errore;
if(isset($_POST['login'])){
    if(empty($_POST['email']) || empty($_POST['pass'])){
        $error = "Email o password invalidi!";
    }
    else {
        $email = $_POST['email'];
        $pass = $_POST['pass'];
        $pass = hash("sha256", $pass);
        $sql = "SELECT email, pass, id_direttore, 'admin' AS Ruolo FROM direttore WHERE email = '$email' AND pass = '$pass'
        UNION SELECT email, pass, id_fornitore, 'fornitore' AS Ruolo FROM fornitore WHERE email = '$email' AND pass = '$pass'
        UNION SELECT email, pass, id_magazziniere, 'magazziniere' AS Ruolo FROM magazziniere WHERE email = '$email' AND pass = '$pass'
        UNION SELECT email, pass, id_addetto, 'addetto' AS Ruolo FROM addetto_vendita WHERE email = '$email' AND pass = '$pass'";
        $result = mysqli_query($conn, $sql) or die("Bad query: $sql");
           
        while($row = mysqli_fetch_assoc($result)){
                if($row['Ruolo'] == 'admin'){
                    session_start();
                    $_SESSION['logged_in'] = $row['id_direttore'];
                    header("location: direttore.php");
                }
                if($row['Ruolo'] == 'magazziniere')
                {
                    session_start();
                    $_SESSION['logged_in'] = $row['id_direttore'];
                    header("location: magazzino.php");
                }
                if($row['Ruolo'] == 'fornitore'){
                    session_start();
                    $_SESSION['logged_in'] = $row['id_direttore'];
                    header("location: fornitore.php");
                }
                if($row['Ruolo'] == 'addetto'){
                    session_start();
                    $_SESSION['logged_in'] = $row['id_direttore'];
                    header("location: addetto.php");
                }
            }
        $error = "Username o password non trovati";
    }
}
?>
Messaggio unito automaticamente:

Mi chiedo se c'è un modo per farlo meglio? (ho provato a farlo con $conn->prepare('query') però con questa query così lunga mi da problemi, non so)
E poi non so perchè questa query mi da nel risultato tutti gli id come id_direttore anche se in realtà dovrebbero essere id_magazziniere id_addetto ecc?
Sicuramente protesti migliorarlo levando il blocco while dato che ti aspetti una singola istanza di ritorno dalla query. Inoltre rimuovere le righe di codice duplicato come session_start(), dato che puoi benissimo eseguirle una singola volta indipendentemente dalla tipologia di utente.
 
Okay giusto, non ci avevo pensato..
Però se volessi farlo sicuro e non iniettabile, dovrei fare una cosa simile:
PHP:
$stmt = $conn->prepare("SELECT email, pass, id_direttore, 'admin' AS Ruolo FROM direttore WHERE email LIKE ? AND pass = ?
 UNION SELECT email, pass, id_fornitore, 'fornitore' AS Ruolo FROM fornitore WHERE email LIKE ? AND pass = ?
UNION SELECT email, pass, id_magazziniere, 'magazziniere' AS Ruolo FROM magazziniere WHERE email LIKE ? AND pass = ?
UNION SELECT email, pass, id_addetto, 'addetto' AS Ruolo FROM addetto_vendita WHERE email LIKE ? AND pass = ?

$stmt->bind_param("ssssssss", $email, $password, $email, $password, $email, $password, $email, $password);
$res = $stmt->get_result();

if($res['ruolo'] == admin){
ecc..ecc..
}
Il problema è che non mi funziona la query! Non so per quale motivo non mi da nessun risultato