Visualizzazione dei risultati da 1 a 9 su 9
  1. #1
    Utente di HTML.it
    Registrato dal
    Jan 2008
    Messaggi
    15

    Registrazione e Login con PHP e MySQL

    Buongiorno a tutti,
    è la prima volta che scrivo in questa sezione del forum, perchè è da poco tempo che mi sono buttato nella programmazione PHP e MySQL.

    Premetto subito che il mio lavoro principale è la programmazione nell'ambito dell'automazione industriale (PLC, Azionamenti, motori, e pannelli operatori) quindi può essere che il mio metodo di programmazione sia differente da un puro programmatore Web Master.

    Parto subito con la descrizione del problema che mi sta tenendo fermo da una settimana

    Bene, il form di registrazione è funzionante, quindi passa in "Post" tutti i valori inseriti a se stessa, che provvede a fare tutti i controlli del caso ed infine salverà (momentaneamente) i dati in un file txt sul server, in attesa che l'utente confermi l'email.

    Codice PHP:
    // Verifica se ci sono stati errori nell'inserimento dei dati
    if ($Errore == 0)
    {
        
    // Definisco il nome del file come l'MD5 del "nome utente"
        
    $nome_file_Utente md5($Nome_Utente);
        
    $Password_crypt md5($Password);
                                
        
    // Apertura del file in modalità scrittura
        
    $file fopen($nome_file_Utente .'.txt''w') or exit("Impossibile creare il file");
        
    // Scrittura delle infomazione del file 
        
    fwrite($file"$Nome\r\n$Cognome\r\n$Nome_Utente\r\n$Email\r\n$Password_crypt");
        
    fclose($file);
                                
        echo 
    "I dati sono stati salvati correttamente sul server.\r\n";
                                
        
    // Inizializzazione variabili per invio mail
        
    $mittente 'From: "Server"'
        
    $destinatario $Email
        
    $oggetto "Conferma Registrazione"
                            
        
    // Composizione del corpo della mail
        
    $messaggio '';
        
    $messaggio $messaggio ."\n--- Conferma di registrazione di ".$Email." ---\n\n";
        
    $messaggio $messaggio ."Ciao ".$Nome." ".$Cognome."\n";
        
    $messaggio $messaggio ."grazie per esserti registrato al sito xxxx.\n\n";
        
    $messaggio $messaggio ."I dettagli del tuo Login sono :\n";
        
    $messaggio $messaggio ."Username: ".$Nome_Utente."\n";
        
    $messaggio $messaggio ."Password: ".$Password."\n\n";
        
    $messaggio $messaggio ."Per completare la fase di registrazione, utilizza il seguente link :\n";
        
    $messaggio $messaggio ."http://www.pippo.pluto/Registrati.php?y=2&z=".$nome_file_Utente ."\n\n";
        
    $messaggio $messaggio ."Grazie\n";
                        
        
    //Invio della mail        
        
    mail($destinatario$oggetto$messaggio$mittente);         
        Exit;

    A questo punto, quando l'utente aprirà il link inviato via mail, prenderò i valori salvati sul file txt e li salverò nel database.

    Codice PHP:
    //Verifica fase di attivazione account y=2
    if ($y == 2)
            {
        
    $File_Name $_GET["z"] .'.txt';            // Creazione della stringa con il percorso e nome del file
        // Apertura del file in modalità lettura
        
    $file fopen($File_Name"r") or exit("Impossibile aprire il file!");
        
    // il metodo 'fgets' permette di leggere una singola riga alla volta
        
    $name fgets($file);                    // Nome
        
    $surname fgets($file);                // Cognome
        
    $user_name addslashes(filter_var($user_nameFILTER_SANITIZE_STRING));
        
    $aemail fgets($file);                    // Email
        
    $password fgets($file);                // Password
                        
        // Inserimento della tabella da utilizzare
        
    $t "Users";
        
    // Inserimento dei valori
        
    $v = array ($name,$surname,$aemail,$user_name,$password,"User",date("d-m-Y"));
        
    // Campi di popolare nella tabella
        
    $r =  "name,surname,email,username_login,password_login,user_group,data_registrazione";
                     
        
    $data = new MysqlClass();                // istanza della classe
        
    $data->connetti();                    // chiamata alla funzione di connessione
        
    $data->inserisci($t,$v,$r);                // chiamata alla funzione per l'inserimento dei dati
        
    echo "Utente registrato con successo.";
        
    $data->disconnetti();                    // disconnessione
        
    fclose($file);                        // Chiusura del file
        
    unlink($File_Name)                    // Eliminazione del file sul server

    E fin qui tutto bene, se apro PHPmyAdmin i campi vengono popolati con tutti i dati prelevati dal file txt.
    Ora possiamo passare alla fase di login.
    Ed è proprio qui che sorge il problema, dopo aver controllato se il nome utente e la password sono stati inseriti, devo verificare se esiste quel nome utente con quella password (nel codice che riporterò ho tolto appositamente il controllo della password) tramite la query "SELECT", ed infine verificare quanti record esistono con quel filtro.

    Codice PHP:
    // validazione dei parametri tramite filtro per le stringhe
    $password md5($password);
                                
    $username trim(filter_var($_POST['username'], FILTER_SANITIZE_STRING));
    $password trim(filter_var($_POST['password'], FILTER_SANITIZE_STRING));
                                            
    // istanza della classe
    $data = new MysqlClass();
    // chiamata alla funzione di connessione
    $data->connetti();
    // interrogazione della tabella
    $auth $data->query("SELECT id_login FROM users WHERE username_login = '$username'");

    $appoggio mysql_num_rows($auth);
    echo 
    $appoggio;
                                
    // controllo sul risultato (deve essere 1)
    if(mysql_num_rows($auth)==0)
        {
        
    // reindirizzamento alla homepage in caso di insuccesso
        
    echo "nessuno user trovato";
        }
        else
        {
        
    // chiamata alla funzione per l'estrazione dei dati
        
    $res =  $data->estrai($auth);
        
    // creazione del valore di sessione
        
    $_SESSION['login'] = $res-> id_login;
        
    // disconnessione da MySQL
        
    $data->disconnetti();
        
    // reindirizzamento alla pagina di amministrazione in caso di successo
        
    echo "login eseguito";
        } 
    Bene alla fine di tutto questo .... mi ritrovo sempre con la scritta : "nessuno user trovato"
    Se invece inserisco manualmente l'utente da PHPmyAdmin, riesco a fare il login .... ma solo se ho inserito quell'utente da PHPmyAdmin.
    Non riesco a capire dove diavolo sto sbagliando, ed è ormai una settimana che sto provando a fare di tutto.
    Nel database i dati ci sono, vengono popolati dai dati letti sul file txt.
    Ho anche creato un'altra pagina che mi stampa a video la colonna username_login della tabella "users", e ovviamente mi riporta tutti i dati in modo corretto .... boh .... non so più che fare .
    Se un problema necessita di assoluta concentrazione,
    simultaneamente interverrà una distrazione assolutamente irresistibile.

  2. #2
    Veramente non ho capito se senza il controllo sulla password funziona o meno. Comunque questo:

    Codice PHP:
    ...
    $password md5($password);
    ...
    $password trim(filter_var($_POST['password'], FILTER_SANITIZE_STRING)); 
    ... 
    non ha senso.
    "Mai discutere con un idiota. Ti trascina al suo livello e ti batte con l'esperienza." (Oscar Wilde)

  3. #3
    Utente di HTML.it
    Registrato dal
    Jan 2008
    Messaggi
    15
    Ciao satifal,
    anche senza controllo password non funziona ..... anzi ti dirò di più .....

    Codice PHP:
    // interrogazione della tabella 
    $auth $data->query("SELECT id_login FROM users WHERE username_login = 'minny'"); 
    anche immettendo il nome utente come costante (nell'esempio "minny"), il risultato è sempre lo stesso, cioè : "utente non trovato".

    Per il filtro sulla password in MD5, hai perfettamente ragione ..... mi sarà sfuggito nelle mille modifiche che ho apportato per trovare il problema, comunque al momento la password non è utilizzata, sarà il passo successivo, insieme alla verifica (in fase di registrazione) del nome utente già utilizzato.
    Se un problema necessita di assoluta concentrazione,
    simultaneamente interverrà una distrazione assolutamente irresistibile.

  4. #4
    Se esegui la stessa query:

    codice:
    SELECT id_login FROM users WHERE username_login = 'minny'
    a mano funziona?
    Posta il codice della classe MysqlClass. Sei sicuro che la connessione avvenga correttamente senza errori o eccezioni?
    "Mai discutere con un idiota. Ti trascina al suo livello e ti batte con l'esperienza." (Oscar Wilde)

  5. #5
    Utente di HTML.it
    Registrato dal
    Jan 2008
    Messaggi
    15
    Scusami, a mano intendi su PHPmyAdmin ?

    Cmq ci ho provato adesso (intendo su PHPmyAdmin), e mi dà gli stessi risultati, cioè :

    * Dati inseriti in automatico dal farm di registrazione --> Utente non trovato
    * Dati inseriti manualmente (tramite PHPmyAdmin) ---> tutto ok, trova il note utente

    Quindi a questo punto immagino che sia un problema riguardante il database e non la funzione di estrazione, oppure un problema nella fase di inserimento dei dati nella tabella.

    Comunque la classe MysqlClass è quella estrapolata dall'esempio "blog" qui su HTLM.it

    Codice PHP:
       // funzione per la connessione a MySQL
        
    public function connetti()
        {
            if(!
    $this->attiva)
            {
                if(
    $connessione mysql_connect($this->nomehost,$this->nomeuser,$this->password) or die (mysql_error()))
                    {
                    
    $selezione mysql_select_db($this->nomedb,$connessione) or die (mysql_error());
                    }
            }
            else
            {
            }
        }

        
    //funzione per l'esecuzione delle query 
        
    public function query($sql)
        {
            if(isset(
    $this->attiva))
            {
            
    $sql mysql_query($sql) or die (mysql_error());
            return 
    $sql
            }
            else
            {
            return 
    false
            }
        }
     
     
    //funzione per l'inserimento dei dati in tabella
        
    public function inserisci($t,$v,$r null)
        {
            if(isset(
    $this->attiva))
                {
                
    $istruzione 'INSERT INTO '.$t;
                if(
    $r != null)
                {
                
    $istruzione .= ' ('.$r.')';
                }
                for(
    $i 0$i count($v); $i++)
                    {
                    if(
    is_string($v[$i]))
                        
    $v[$i] = '"'.$v[$i].'"';
                    }
                
    $v implode(',',$v);
                
    $istruzione .= ' VALUES ('.$v.')';
                
    $query mysql_query($istruzione) or die (mysql_error());
                }
                else
                {
                return 
    false;
                }
        }
        
        
    //funzione per l'estrazione dei record 
        
    public function estrai($risultato)
        {
            if(isset(
    $this->attiva))
            {
            
    $r mysql_fetch_object($risultato);
            return 
    $r;
            }
            else
            {
            return 
    false
            }
        } 

    potrebbe essere la Codifica caratteri ?
    Se un problema necessita di assoluta concentrazione,
    simultaneamente interverrà una distrazione assolutamente irresistibile.

  6. #6
    Prova a stampare la query prima di eseguirla.
    Nel metodo inserisci():

    Codice PHP:
    //funzione per l'inserimento dei dati in tabella
        
    public function inserisci($t,$v,$r null)
        {
                ...
                echo 
    $istruzione;
                
    $query mysql_query($istruzione) or die (mysql_error());
                ...
        } 
    e vedi se la query di insert è corretta.
    "Mai discutere con un idiota. Ti trascina al suo livello e ti batte con l'esperienza." (Oscar Wilde)

  7. #7
    Utente di HTML.it
    Registrato dal
    Jan 2008
    Messaggi
    15
    Ho fatto come mi hai consigliato, ed ecco il risultato :

    codice:
    INSERT INTO Users (name,surname,email,username_login,password_login,user_group,data_registrazione) 
    VALUES 
    ("Topolino ","Topolino ","Topolino@Topolino.com ","Topolino ","e10adc3949ba59abbe56e057f20f883e","User","24-01-2013")





    E poi ho copiato la stringa che mi presenta PHPmyAdmin dopo aver effettuato un inserimento manuale :

    codice:
    INSERT INTO `nome_database`.`users` 
    (`id_login`, `name`, `surname`, `email`, `username_login`, `password_login`, `user_group`, `data_registrazione`, `ora_registrazione`) 
    VALUES (NULL, 'manuale', 'manuale', 'manuale@manuale.it', 'manuale', '', 'User', '2013-01-24', NULL);

    saranno le doppie virgolette ?
    Se un problema necessita di assoluta concentrazione,
    simultaneamente interverrà una distrazione assolutamente irresistibile.

  8. #8
    Se guardi bene, nella query che hai stampato (quella del metodo inserisci) nei valori corrispondenti ai campi "name, surname, email, username_login" c'è sempre uno spazio alla fine per cui deve esserci un problema nel codice.
    Probabilmente è per questo che non trova l'utente. Quando fai la ricerca prova ad aggiungere uno spazio alla fine dell'username e vedrai che l'utente verrà trovato.
    "Mai discutere con un idiota. Ti trascina al suo livello e ti batte con l'esperienza." (Oscar Wilde)

  9. #9
    Utente di HTML.it
    Registrato dal
    Jan 2008
    Messaggi
    15
    In effetti hai ragione, ma in parte,

    Quello che hai trovato tu non è uno spazio, ma è il carattere di a capo (New Line).

    Codice PHP:
    // Scrittura delle informazione del file  
        
    fwrite($file"$Nome\r\n$Cognome\r\n$Nome_Utente\r\n$Email\r\n$Password_crypt"); 
        
    fclose($file); // Scrittura delle informazione del file  
        
    fwrite($file"$Nome\r\n$Cognome\r\n$Nome_Utente\r\n$Email\r\n$Password_crypt"); 
        
    fclose($file); 
    Infatti, nello scrive i dati sul file txt, sono stati inseriti i caratteri \r e \n per andare in una nuova riga, e ovviamente questi venivano salvati sul database.

    E' bastato inserire un comando che elimina questi caratteri prima di salvarli nella tabella

    Codice PHP:
    $user_name str_replace(array("\n","\r","\t"),"",$user_name); 
    e il problema si è risolto.
    Poi ovviamente ho riportato la modifica a tutti gli altri dati.

    Grazie dell'aiuto .... questa sarà una cosa che mi rimarrà in mente per un bel po' .... direi fino all'alzheimer ....
    Grazie ancora e buona serata.
    Se un problema necessita di assoluta concentrazione,
    simultaneamente interverrà una distrazione assolutamente irresistibile.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.