Visualizzazione risultati 1 fino 19 di 19

Discussione: come controllare se un utente ha fatto il login o no?

  1. #1
    Guest

    Post come controllare se un utente ha fatto il login o no?

    Salve, mi chiedevo se qualcuno può aiutarmi e sopratutto spiegarmi come fare un sistema che controlli se l'utente ha fatto il login o no.

    Esempio if($loggato){

    Mostra il normale forum
    }else {
    invita a fare il login
    }


    Ho visitato diversi forum e provato verie possibilità ma non mi funziona...un esempio di ciò che ho scritto è:

    Ho scritto questo sulla parte in cui il login avviene senza dare altri errori:
    $_SESSION['user'] = $username;
    e altra roba esempio setcookie che ho trovato su una guida, ma non so se davvero funzioni o no.

    $username sarebbe
    $username = mysql_real_escape_string($_POST['username']);


    poi ho scritto su validate.php (dove dovrei fare questo scrit per controllare se un utente è loggato):

    (comandi per connettersi al db)
    If(!empty($_SESSION['user'])){
    $logged = TRUE;
    }else{
    $logged = false;
    }

    Ed infine ho scritto sulla pagina che vorrei non venisse mostrata se l'utente non è loggato:

    session_start();
    require_once 'validate.php';
    if($logged){ mostra tutto
    }else{
    echo "devi fare il login";
    }

    Qualcuno può dirmi dove sbaglio e soprattutto spiegarmi come funziona questa cosa? :)

  2. #2
    L'avatar di Luffio
    Luffio non è connesso Utente attivo
    Data registrazione
    02-07-2006
    Messaggi
    439

    Predefinito

    Non vedo errori. Hai ricordato di inserire session_start() anche nella pagina dove salvi lo username (prima di $_SESSION['user'] = $username;)?
    Luffio Web Site, Luffio's personal site
    Age Of Empires GIF, sito per la creazione di GIF animate di Age of Empires
    Clan italiano di Age of Empires The Conquerors, uno dei più vecchi ancora attivi

  3. #3
    Guest

    Predefinito

    All'inizio di tutto il processo di login si, o devo metterlo insieme a $_SESSION['user'] = $username ?

    Esempio:
    if(blabla){
    session_start()
    $_SESSION['user'] = $username
    echo "sei loggato";
    }

  4. #4
    L'avatar di Luffio
    Luffio non è connesso Utente attivo
    Data registrazione
    02-07-2006
    Messaggi
    439

    Predefinito

    Va bene così. Da dove esce fuori $username? Sicuro che non sia una stringa vuota?
    Codice PHP:
    var_dump($username);
    Viene da chiedersi quali siano questi "comandi per connettersi al db".
    Luffio Web Site, Luffio's personal site
    Age Of Empires GIF, sito per la creazione di GIF animate di Age of Empires
    Clan italiano di Age of Empires The Conquerors, uno dei più vecchi ancora attivi

  5. #5
    Guest

    Predefinito

    Ti copio quasi tutto il codice cosi vedi bene :P
    PS: è mezzo inglese e mezzo italiano XD



    iniziamo con login.php:

    Codice PHP:
    $connect = mysql_connect("localhost", "root", "") or die("impossibile connettersi al server");
    mysql_select_db("phplogin", $connect) or die("impossibile connettersi al server");


    if(
    $_POST['login']){ //se viene premuto il tasto "login"
    if($_POST['username'] && $_POST['password']){ //campo di testo 'username' e campo di testo 'password'
    $username = mysql_real_escape_string($_POST['username']);
    $password = mysql_real_escape_string(hash("sha512", $_POST['password']));
    $domanda = "SELECT * FROM `users` WHERE `username` = '$username'";
    $prova = mysql_query($domanda);
    $user = mysql_fetch_array($prova);

    if(
    $user == "0"){
    die(
    'Questo utente non esiste! <li> <a href="registrazione.php"</a> Clicca qui per registrarti! </li><br>');

    }

    if(
    $user['password'] != $password){
    die(
    'Hai sbagliato password');
    }
    session_start();
    $_SESSION['user'] = $username; //qui ho sparato un po' di roba copiata da un video che ho visto su youtube...
    $expiry = time() +24 * 60 *60; //in cui se non ho capito male usavano setcookie con time() per il logout automatico
    $salt = hash("sha512", rand() . rand() . rand()); //dopo 1 mese. Ed usavano il comando $_COOKIE['c_user']
    setcookie("c_user", hash("sha512", $username), $expiry); // e $_COOKIE['c_salt']... ma comunque non funzionava
    setcookie("c_salt", $salt, $expiry);
    $userID = $user['ID'];
    mysqli_query("UPDATE 'users' SET 'salt' = $salt WHERE 'ID' = $userID");
    die(
    "Sei loggato come ''$username''... <li><a href='index.php'</a>Indietro</li>");
    }
    }
    ?>

    Passiamo ora al validate.php:
    Codice PHP:
    <?php

    $connect
    = mysql_connect("localhost", "root", "") or die("impossibile connettersi al server");
    mysql_select_db("phplogin", $connect) or die("impossibile connettersi al server");

    session_start();

    If(!empty(
    $_SESSION['user'])){ //magari devo mettere $_SESSION['username'] ?
    $logged = TRUE;
    }else{
    $logged = false;
    }



    Ed infine la pagina che non dovrebbe vedersi, o meglio che non dovrebbe calcolare :P :


    Codice PHP:
    session_start();
    require_once
    'validate.php';
    if(
    $logged){


    Codice calcolatrice

    }else{
    echo
    "Devi loggare";
    }

    Ora, se io in questa ultima parte metto if(!$logged)
    lui non funzionerà mai
    Se metto (come è ora) if($logged)
    funziona sempre.
    Ultima modifica di competenzepertutti : 25-09-2014 alle ore 18.33.31

  6. #6
    L'avatar di Luffio
    Luffio non è connesso Utente attivo
    Data registrazione
    02-07-2006
    Messaggi
    439

    Predefinito

    1) Dati di accesso MySQL e PHPMyAdmin (su Altervista funziona così)

    2) Noto che hai scritto $user['ID']. Ti faccio notare che 'ID' è diverso da 'id' (minuscolo) e da 'Id', quindi assicurati che sia scritto esattamente identico al nome del campo del database.

    3) Questa riga non è corretta:
    Codice PHP:
    mysqli_query("UPDATE 'users' SET 'salt' = $salt WHERE 'ID' = $userID");
    dovrebbe essere invece:
    Codice PHP:
    mysqli_query("UPDATE `users` SET `salt` = $salt WHERE `ID` = $userID");
    (accento grave al posto dell'apice) oppure fai prima a ometterli (possibile quando il nome del campo è composto di una parola sola):
    Codice PHP:
    mysqli_query("UPDATE users SET salt = $salt WHERE ID = $userID");
    4) (questo è un accorgimento) Questa riga è bizzarra:
    Codice PHP:
    die("Sei loggato come ''$username''... <li><a href='index.php'</a>Indietro</li>");
    a parte che non hai scritto bene il link, guarda che puoi usare le virgolette in stringa delimitate da virgolette, basta farne l'escape:
    Codice PHP:
    die("Sei loggato come \"$username\"... <li><a href='index.php'>Indietro</a></li>");
    5) Guarda che i cookie che hai impostato con setcookie non scadono dopo un mese come hai scritto nel commento ma dopo un giorno (24*60*60 = secondi corrispondenti a un giorno).

    6) if($logged) è verificato se $logged = true, mentre if(!$logged) è verificato se $logged = false (il punto esclamativo indica negazione).

    7) Utilizzare un sale ("stranamente" salt si traduce sale, l'avresti mai detto?) senza sapere cosa sia un sale in ambito informatico non ha molto senso. E ancora meno senso ha impostare un cookie e non usarlo.
    Ultima modifica di Luffio : 25-09-2014 alle ore 18.58.36
    Luffio Web Site, Luffio's personal site
    Age Of Empires GIF, sito per la creazione di GIF animate di Age of Empires
    Clan italiano di Age of Empires The Conquerors, uno dei più vecchi ancora attivi

  7. #7
    Guest

    Predefinito

    1) E' vero, errore mio, questo perché lo uso in localhost con apache e mysql.

    2)E' giusto, scritto ID...ma comunque non penso sia quello il problema.

    5) Probabile che ricordassi male :P

    6) era per indicare che in nessuno dei due casi funziona.

    7)L'ho utilizzato perché lo utilizzavano sul tutorial che ho seguito.. alla fine ho usato $_SESSION invece che $_COOKIE e non l'ho piu cancellato.
    PS: L'avrei detto si :P.

    Ma quindi, perché non funziona?

  8. #8
    L'avatar di Luffio
    Luffio non è connesso Utente attivo
    Data registrazione
    02-07-2006
    Messaggi
    439

    Predefinito

    Citazione Originalmente inviato da competenzepertutti Visualizza messaggio
    Ma quindi, perché non funziona?
    Hai corretto le cose che ti ho scritto e l'hai provato?
    Luffio Web Site, Luffio's personal site
    Age Of Empires GIF, sito per la creazione di GIF animate di Age of Empires
    Clan italiano di Age of Empires The Conquerors, uno dei più vecchi ancora attivi

  9. #9
    Guest

    Predefinito

    Sul punto 1 non c'è niente da correggere, uso i dati del mio localhost, se li cambio con quelli di altervista e lo uso qui non cambia nulla, funziona sempre allo stesso modo
    Il punto 2 ho controllato ed è giusto.
    Il punto 3 non credo influisca, o sbaglio?
    Punto 4 come hai detto è solo un accorgimento e comunque non ho capito che intendi
    Col punto 5 mi hai rinfrescato la memoria
    Il punto 6 come ti ho detto se metto solo $logged lo da sempre come loggato, se metto !$logged lo da sempre non loggato.
    Punto 7 come ti ho già detto anche qui lo ho scritto inutilmente, volendo posso anche cancellarlo, semplicemente seguivo il tutorial in cui usavano questo "sale".

    Non c'è niente da correggere

  10. #10
    L'avatar di Luffio
    Luffio non è connesso Utente attivo
    Data registrazione
    02-07-2006
    Messaggi
    439

    Predefinito

    Ok, l'unico punto da correggere è il 3, che a differenza di quanto pensi tu (e quanto pensavo anch'io prima di scoprirlo) influisce.

    Il 4 te lo spiego in due secondi: Se una stringa è delimitata da virgolette " " se tu usi semplicemente le virgolette all'interno della stringa, il codice crede che le virgolette siano il termine della stringa e ti dà errore. Se però al posto di " scrivi \" , il backslash indica al codice che le virgolette non rappresentano la terminazione della stringa ma sono virgolette letterali, cioè tu volevi proprio delle virgolette lì. Scrivendo:
    Codice PHP:
    "Sei loggato come \"$username\"... "
    il tuo programma leggerà questo:
    Codice PHP:
    Sei loggato come "$username"...
    Mettere due apici (=apostrofi) al posto delle virgolette non lo fa nessuno.
    Ultima modifica di Luffio : 25-09-2014 alle ore 20.48.07
    Luffio Web Site, Luffio's personal site
    Age Of Empires GIF, sito per la creazione di GIF animate di Age of Empires
    Clan italiano di Age of Empires The Conquerors, uno dei più vecchi ancora attivi

  11. #11
    L'avatar di zerobruno
    zerobruno non è connesso Utente
    Data registrazione
    03-10-2013
    Messaggi
    192

    Predefinito

    Evita di fare !empty(), piuttosto fai isset().

    Codice PHP:
    if (isset($_GET['q']) && empty($_GET['q']))
    {
    //stampa a video
    }
    Ciò stamperà eccome qualcosa, basta lasciare ?q=, senza scriverci dentro nulla.

  12. #12
    Guest

    Predefinito

    Citazione Originalmente inviato da Luffio Visualizza messaggio
    Ok, l'unico punto da correggere è il 3, che a differenza di quanto pensi tu (e quanto pensavo anch'io prima di scoprirlo) influisce.

    Il 4 te lo spiego in due secondi: Se una stringa è delimitata da virgolette " " se tu usi semplicemente le virgolette all'interno della stringa, il codice crede che le virgolette siano il termine della stringa e ti dà errore. Se però al posto di " scrivi \" , il backslash indica al codice che le virgolette non rappresentano la terminazione della stringa ma sono virgolette letterali, cioè tu volevi proprio delle virgolette lì. Scrivendo:
    Codice PHP:
    "Sei loggato come \"$username\"... "
    il tuo programma leggerà questo:
    Codice PHP:
    Sei loggato come "$username"...
    Mettere due apici (=apostrofi) al posto delle virgolette non lo fa nessuno.
    Ho visto ora che su localhost mi funziona.
    Provato a trasferire i file su altervista (cambiando i comandi per collegarsi al db) login e registrazione funzionano ma il controllo se uno è loggato o no, non funziona
    Ho provato a fare un piccolo test e questo è ciò che risulta:

    Ho creato un nuovo file con scritto:

    Codice PHP:
    <?php
    session_start
    ();

    include
    'validate.php';

    $ust = $_SESSION['user'];
    if(
    $logged){
    echo
    "sei loggato come $ust";
    }else{
    echo
    "Non sei loggato";}


    Il file validate.php è sempre lo stesso:

    Codice PHP:
    <?php


    include 'include/init.php'; //init.php sono i comandi per colleggarsi al db di altervista

    session_start();

    If(!empty(
    $_SESSION['user'])){
    $logged = true;
    }else{
    $logged = false;
    }
    ?>
    Dunque, se io metto, sul nuovo file if(!$ust) lui mi darà che io sono connesso col nome col quale ho fatto il login, dunque sembra che $_SESSION prenda il valore giusto.
    Se io metto if($ust) mi da sempre "non sei loggato".


    Inizio a preoccuparmi, ogni volta che cerco di fare una nuova cosa trovo sempre problemi

    L'unica volta in cui non ho trovato problemi è stato nel fare il pulsante di logout.

    MAH

  13. #13
    Guest

    Predefinito

    Citazione Originalmente inviato da zerobruno Visualizza messaggio
    Evita di fare !empty(), piuttosto fai isset().

    Codice PHP:
    if (isset($_GET['q']) && empty($_GET['q']))
    {
    //stampa a video
    }
    Ciò stamperà eccome qualcosa, basta lasciare ?q=, senza scriverci dentro nulla.



    Provato, non funziona comunque

  14. #14
    L'avatar di Luffio
    Luffio non è connesso Utente attivo
    Data registrazione
    02-07-2006
    Messaggi
    439

    Predefinito

    Ah forse ho capito: devi usare mysql_fetch_assoc anziché mysql_fetch_array
    Luffio Web Site, Luffio's personal site
    Age Of Empires GIF, sito per la creazione di GIF animate di Age of Empires
    Clan italiano di Age of Empires The Conquerors, uno dei più vecchi ancora attivi

  15. #15
    Guest

    Predefinito

    Citazione Originalmente inviato da Luffio Visualizza messaggio
    Ah forse ho capito: devi usare mysql_fetch_assoc anziché mysql_fetch_array
    Ho provato a modificarlo in login.php ma non funziona.

    Eppure mi sembra strano, in localhost mi funziona su altervista no :/

    PS:posso aggiungerti su skype cosi parliamo meglio? (se lo hai)

  16. #16
    L'avatar di Luffio
    Luffio non è connesso Utente attivo
    Data registrazione
    02-07-2006
    Messaggi
    439

    Predefinito

    Citazione Originalmente inviato da competenzepertutti Visualizza messaggio
    Dunque, se io metto, sul nuovo file if(!$ust) lui mi darà che io sono connesso col nome col quale ho fatto il login, dunque sembra che $_SESSION prenda il valore giusto.
    Se io metto if($ust) mi da sempre "non sei loggato".
    Non so se hai notato ma è il comportamento esattamente opposto a quello desiderato: in sostanza, $ust è nullo, quindi è nullo anche $_SESSION['user']. Fai un bel print_r($_SESSION['user']) per rendertene conto. Prova a togliere session_start() da validate.php. Io ti consiglio di fare print_r anche dei risultati del database.
    Citazione Originalmente inviato da competenzepertutti Visualizza messaggio
    PS:posso aggiungerti su skype cosi parliamo meglio? (se lo hai)
    Non ce l'ho.
    Ultima modifica di Luffio : 26-09-2014 alle ore 21.10.22
    Luffio Web Site, Luffio's personal site
    Age Of Empires GIF, sito per la creazione di GIF animate di Age of Empires
    Clan italiano di Age of Empires The Conquerors, uno dei più vecchi ancora attivi

  17. #17
    Guest

    Predefinito

    Ho fatto il print_r

    Se lo faccio senza loggare non viene scritto niente, se lo faccio dopo aver loggato mi da l'username con cui ho loggato :/

  18. #18
    Guest

    Predefinito

    Ho provato a copiare l'identico codice però facendolo partire in locahost e funziona.
    magari qualche comando non è riconosciuto da altervista?

    Esempio in localhost mi accetta anche require_once 'validate.php'; invece che include...
    Su altervista non mi accetta il require_once, tocca mettere include.
    Ultima modifica di competenzepertutti : 26-09-2014 alle ore 21.33.54

  19. #19
    Guest

    Predefinito

    Citazione Originalmente inviato da Luffio Visualizza messaggio
    Non so se hai notato ma è il comportamento esattamente opposto a quello desiderato: in sostanza, $ust è nullo, quindi è nullo anche $_SESSION['user']. Fai un bel print_r($_SESSION['user']) per rendertene conto. Prova a togliere session_start() da validate.php. Io ti consiglio di fare print_r anche dei risultati del database.


    Non ce l'ho.

    Forse ho capito, dovrei semplicemente mettere che se uno non è loggato mi apra la pagina di login.
    Mi puoi spiegare come si fa questa cosa? Se uso if(!loggato){include 'login.php';} non funziona, c'è magari un altro modo?

Regole di scrittura

  • Non puoi creare nuove discussioni
  • Non puoi rispondere ai messaggi
  • Non puoi inserire allegati.
  • Non puoi modificare i tuoi messaggi
  •