Script Login PHP + Database Mysql...

Siccome io non ci sono riucito... e facendo una ricerca sul forum non sono riuscito a trovare nulla di completo... mi chiedevo se qualcuno ha a disposizione uno script completo PHP+Mysql per registrazione e login di utenti...  ;D

Nel caso nessuno lo avesse... se magari qualcuno vuole aiutarmi a farne uno O0

inviato 11 anni fa
z3ro
z3ro
1
X 0 X

Di "precotti" non ne ho. Se vuoi ti do una mano a realizzarlo. Inizia con il descrivere dettagliatamente cosa ti serve.

 :bye:

risposto 11 anni fa
Gianni Tomasicchio
X 0 X

Di "precotti" non ne ho. Se vuoi ti do una mano a realizzarlo. Inizia con il descrivere dettagliatamente cosa ti serve.

 :bye:

Allora io pensavo innanzitutto a una pagina di Registrazione con inserimento di dati semplici quali Username e Password, controllo che non siano già presenti nel database se no -> inserimento dei dati nel database; se si -> ritorno alla pagina di registrazione

Poi una pagina di Login con ovviamente ricerca dati nel database, e login quando i dati sono corretti...

Cose possibili da aggiungere per migliorare lo script:

1- Criptazione del campo "password" nel database in modo che se qualcuno accede al database non possa leggere le password di tutti gli utenti registrati

2- Possibilità al 1° di registrarsi come Admin e quindi cancellare le iscrizioni di altri o eventualmente modificare le iscrizioni degli altri utenti, settare altri come admin e, ovviamente, avere un'area di accesso riservata per gestire il sito ;D

Forse pretendo troppo  :) :bye:

risposto 11 anni fa
z3ro
z3ro
1
X 0 X

Il punto 2 lascialo perdere, è troppo presto per te...

La prima cosa che devi fare è realizzare la tabella del db che conterrà gli utenti. Individua i campi che deve contenere ed il tipo di dati. Ad esempio:

id_utente int autoincrement

username varchar 32

nome_cognome varchar 64

password varchar 16

email varchar 64

poi devi realizzare le query per inserire un utente e per verificare il log-in. Provale da phpMyAdmin per vedere se funzionano.

Una volta che le query funzionano prepara il form per la registrazione dell'utente. Verifica i dati che ricevi dalla variabile $_POST e prova a ricreare le query che avevi già collaudato con phpMyAdmin

La stessa cosa va fatta con il form del login.

L'importante è provedere per piccoli passi.

Un consiglio generale: imposta il livello di segnalazione degli errori al massimo, con il comando error_reporting(E_ALL);

Inoltre prima di eseguire una query in php mostra il contenuto della query stessa con una echo.

 :bye:

risposto 11 anni fa
Gianni Tomasicchio
X 0 X

Il punto 2 lascialo perdere, è troppo presto per te...

La prima cosa che devi fare è realizzare la tabella del db che conterrà gli utenti. Individua i campi che deve contenere ed il tipo di dati. Ad esempio:

id_utente int autoincrement

username varchar 32

nome_cognome varchar 64

password varchar 16

email varchar 64

poi devi realizzare le query per inserire un utente e per verificare il log-in. Provale da phpMyAdmin per vedere se funzionano.

Una volta che le query funzionano prepara il form per la registrazione dell'utente. Verifica i dati che ricevi dalla variabile $_POST e prova a ricreare le query che avevi già collaudato con phpMyAdmin

La stessa cosa va fatta con il form del login.

L'importante è provedere per piccoli passi.

Un consiglio generale: imposta il livello di segnalazione degli errori al massimo, con il comando error_reporting(E_ALL);

Inoltre prima di eseguire una query in php mostra il contenuto della query stessa con una echo.

 :bye:

Ok! Ora mi metto al lavoro!

risposto 11 anni fa
z3ro
z3ro
1
X 0 X

Ok; primo problema:

Allora fin'ora cos'ho fatto:

1- Creazione tabella nel database

CREATE TABLE z3_user (id_utente INT (5) UNSIGNED not null AUTO_INCREMENT, username VARCHAR (32) not null , nome_cognome VARCHAR (64) not null , password VARCHAR (16) not null , email VARCHAR (64) not null, PRIMARY KEY (id_utente))

2- Inserimento query da phpmyadmin:

Codice:
INSERT INTO z3_user VALUES ('1', 'z3ro', 'Federico Pepe', 'password', 'z3ro@email.it')

3- Ho creato la pagina di Login con un semplice form:

<form method=POST action=login.php class="Stile3">
        <div align="center">
          <p align="justify"><span class="Stile5">Username:</span>            
            <input name=user type=username class="Stile3" size=20>
            <br>
            <br>
            <span class="Stile5">Password</span>: 
            <input name=pass type=password class="Stile3" size=20>
          </p>
          <p align="justify"><br>
            <input name="submit" type=submit class="Stile1" value=Login>
            <input name="reset" type=reset class="Stile1" value=Reset>
          </p>
  </div>
</form>

4- Sto facendo la pagina login.php è necessario che: 1) si connetta al database 2)controlli che i campi siano stati completati 3) ricavi le variabili col metodo $_POST 4) controlli nel database che le variabili siano corrette. Io al momento ho fatto i primi 3 punti:

<?php
session_start();
include ("inc/config.php");
// Controllo riempimento campi User & Password
if (trim($user) == "" OR trim($pass) == "")
{
header("Refresh:3 ; add_user.php");
echo "I campi devono essere riempiti! Attendi il caricamento o clicca <a href=\"add_user.php\">qui</a>";
} 
else 
{
// Connessione al database
$db = mysql_connect($db_host, $db_user, $db_password);
if ($db == FALSE)
die ("Errore nella connessione. Verificare i parametri nel file config.php");
mysql_select_db($db_name, $db)
or die ("Errore nella selezione del database. Verificare i parametri nel file config.php");

// Ricavo le variabili $user e $pass
$user= $_POST['username'];
$pass= $_POST['password'];

Ma non so come fare il punto 4...

 :bye:

risposto 11 anni fa
z3ro
z3ro
1
X 0 X

la query al punto 2) non è corretta, poiché non ha senso assegnare un valore ad un campo autoincrement. Usa piuttosto degli inserimenti tipo:

INSERT INTO z3_user (username,nome_cognome,password,email)VALUES ('z3ro', 'Federico Pepe', 'password', 'z3ro@email.it')

Il form al punto 3) non è "pulitissimo". Tutti i valori degli attributi di un tag vanno tra doppi apici:

<input name=user type=username class="Stile3" size=20>

deve essere cambiato in:

<input name="user" type="username" class="Stile3" size="20">

non è necessario, ma bisogna rispettare gli standard. Tranne se non ti chiami Bill G.

Per il punto 4) devi fare una SELECT e vedere se ti restituisce un record della tabella. Hai provato a farla con phpMyAdmin? Dovresti realizzare qualcosa del tipo

SELECT * from z3_user WHERE username = 'z3ro' AND PASSWORD = 'password'

In PHP dovresti prima proteggere le stringhe dagli apici e poi comporre la query:

if (!get_magic_quotes_gpc())
{
   $user= addslashes($_POST['username']);
   $pass= addslashes($_POST['password']);
}
else
{
   $user= $_POST['username'];
   $pass= $_POST['password'];
}

$query = "SELECT * from z3_user WHERE username = '$user' AND PASSWORD = '$pass'";

Fatta la query (mysql_query), non serve fare la fetch dei risultati, basta usare la funzione mysql_num_rows per avere il numero delle righe restituite dalla query. Se vale 1 allora l'utente è stato riconosciuto.

$risultato = mysql_query($query);
$num_righe = mysql_num_rows($risultato);
if($num_righe)
{
   // wow! l'utente è stato riconosciuto
}
else
{
   // nome utente o password errati
}

Se vuoi criptare le password devi usare la funzione md5()...

risposto 11 anni fa
Gianni Tomasicchio
X 0 X

Ho fatto le modifiche che hai detto! Ho controllato con phpmyadmin a fare SELECT e mi restituisce il risultato, ma creando una pagina con il codice che mi hai dato non riesce a farlo... e non ho capito una cosa quando dai:

if($num_righe)

vale già, se viene TRUE come "1" ?

Scusa per le mille domande ma sto imparando a programmare il php e quindi sono pieno di cose da chiedere e sono ancora un newbie

risposto 11 anni fa
z3ro
z3ro
1
X 0 X

per il dubbio sull'if guarda questa lezionde della guida base:

http://www.phpnews.it/content/view/248/107/

riporta il codice del login

risposto 11 anni fa
Gianni Tomasicchio
X 0 X

<?php

session_start();

include ("inc/config.php");

// Connessione al database

$db = mysql_connect($db_host, $db_user, $db_password);

if ($db == FALSE)

die ("Errore nella connessione. Verificare i parametri nel file config.php");

mysql_select_db($db_name, $db)

or die ("Errore nella selezione del database. Verificare i parametri nel file config.php");

   if (!get_magic_quotes_gpc())

   {

         $user= addslashes($_POST['username']);

         $pass= addslashes($_POST['password']);

   }

   else

   {

         $user= $_POST['username'];

         $pass= $_POST['password'];

   }

   $query = "SELECT * from z3_user WHERE username = '$user' AND password = '$pass'";

   $risultato = mysql_query($query);

   $num_righe = mysql_num_rows($risultato);

   if($num_righe)

   {

   // wow! l'utente è stato riconosciuto

   echo ("Riconosciuto");

   }

   else

   {

   // nome utente o password errati

   echo ("Non riconosciuto");

   }

?>

risposto 11 anni fa
z3ro
z3ro
1
X 0 X

Che errore ti da?

Metti una echo($query); dopo la query così puoi vedere cosa stai chiedendo realmente al DB

risposto 11 anni fa
Gianni Tomasicchio
X 0 X

Che errore ti da?

Metti una echo($query); dopo la query così puoi vedere cosa stai chiedendo realmente al DB

SELECT * from z3_user WHERE username = '' AND password = ''

Non riconosciuto

a quanto pare non riceve i dati che inserisco

risposto 11 anni fa
z3ro
z3ro
1
X 0 X

Nel form usi dei campi input con nomi diversi dai nomi che usi per le chiavi dell'array $_POST.

Leggi qui come prelevare i dati da un form:

http://www.phpnews.it/content/view/252/107/

risposto 11 anni fa
Gianni Tomasicchio
X 0 X

Nel form usi dei campi input con nomi diversi dai nomi che usi per le chiavi dell'array $_POST.

Leggi qui come prelevare i dati da un form:

http://www.phpnews.it/content/view/252/107/

Ok! Ora sembra funzionare...è arrivato il momento di proseguire con la programmazione... vediamo se riesco a fare qualcosa ;D

Per quanto riguarda l'md5() ho dato uno sguardo in internet e credo di aver più o meno capito la sintassi e come/dove si usa ma non ho capito se la chiave di criptazione la devo creare io oppure se semplicemente mettendo md5($pass) mi cripta automaticamente la password... Ah.. e poi, quando recupera i dati dal database, per decriptarli come faccio ?

risposto 11 anni fa
z3ro
z3ro
1
X 0 X

$password_criptata = md5($password_in_chiaro);

è tutto li, non serve nient'altro.

md5 cripta ma non può essere decriptato, ecco perché non serve una chiave, non esiste!  :)

Nel DB devi salvare l'md5 della password, nel log-in devi prima fare l'md5 della password e poi confrontare il risultato con la password criptata del DB.

 :bye:

risposto 11 anni fa
Gianni Tomasicchio
X 0 X

$password_criptata = md5($password_in_chiaro);

è tutto li, non serve nient'altro.

md5 cripta ma non può essere decriptato, ecco perché non serve una chiave, non esiste!  :)

Nel DB devi salvare l'md5 della password, nel log-in devi prima fare l'md5 della password e poi confrontare il risultato con la password criptata del DB.

 :bye:

Ok! Funziona tutto, la password nel database viene criptata ma dopo, nel login, non riesce a "decriptarla"

<?php
session_start();
include ("inc/config.php");
if (trim($user) == "" OR trim($pass) == "")
{
header("Refresh:3 ; login.php");
echo "I campi devono essere riempiti! Attendi il caricamento o clicca <a href=\"login.php\">qui</a>";
} else {
$user = addslashes(stripslashes($user));
$pass = addslashes(stripslashes($pass));
$user = str_replace("<", "&lt;", $user);
$pass = str_replace(">", "&gt;", $pass);

// Connessione al database
$db = mysql_connect($db_host, $db_user, $db_password);
if ($db == FALSE)
die ("Errore nella connessione. Verificare i parametri nel file config.php");
mysql_select_db($db_name, $db)
or die ("Errore nella selezione del database. Verificare i parametri nel file config.php");

   if (!get_magic_quotes_gpc())
   {
         $user= addslashes($_POST['user']);
         $pass= addslashes($_POST['pass']);
   }
   else
   {
         $user= $_POST['user'];
         $pass= $_POST['pass'];
   }
   $crypt_pass = md5($pass);
   $query = "SELECT * from z3_user WHERE username = '$user' AND password = '$crypt_pass'";
   $risultato = mysql_query($query);
   $num_righe = mysql_num_rows($risultato);
   if($num_righe)
   {
   // wow! l'utente è stato riconosciuto
   echo ("Riconosciuto");
   }
   else
   {
   // nome utente o password errati
   echo ("Non riconosciuto");
   }
}
mysql_close($db);
?>

Seguendo quello che mi hai detto pensavo fosse giusto così... ho sbagliato qualcosa nella sintassi?

risposto 11 anni fa
z3ro
z3ro
1
X 0 X

l'md5 di qualunque stringa è composto da 32 caratteri. Verifica quindi che il database abbia la colonna "password" di tipo varchar 32. Verifica inoltre che nel DB ci sia la password criptata, non quella in chiaro.

risposto 11 anni fa
Gianni Tomasicchio
X 0 X
l'md5 di qualunque stringa è composto da 32 caratteri. Verifica quindi che il database abbia la colonna "password" di tipo varchar 32. Verifica inoltre che nel DB ci sia la password criptata, non quella in chiaro.

la password era un VARCHAR (16)! Nel database la password è criptata e ora, posso finalmente dire che FUNZIONA TUTTOOOOOOOOO!!!!!!!!!!!!!!!!!!

Ovviamente all'interno delle pagine ho messo un ringraziamento a te (se mi dai la conferma inserisco anche il tuo indirizzo e-mail...oppure se ti basta ho messo l'url del sito e "Gianni"...

A questo punto credo di aver imparato cose nuove sul php... e ora, non mi resta che provare a fare la registrazione per admin  ;D ;D ;D ;D

Quindi dovete solo aspettare che vi riempia ancora di domande (e non credo ci metterò molto) :bye:

risposto 11 anni fa
z3ro
z3ro
1
X 0 X

Ciao a tutti. Risollevo questo topic perché dovrei creare una cosa simile in un sito. Al momento della creazione del db però ho riscontrato questo errore:

#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 1

Se imposto il collation invece mi restituisce questo:

#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci' at line 1

Ho cercato sul manuale ma l'errore #1064 è spiegato in questo modo:

Error: 1064 SQLSTATE: 42000 (ER_PARSE_ERROR)

Message: %s near '%s' at line %d

Ho cercato ER_PARSE_ERROR ma non ho trovato nulla che spieghi veramente il problema.

Accetto volentieri consigli.

Molte grazie.

 :)

risposto 10 anni fa
Piero83
X 0 X

ho letto di sfuggita il tutto, ma non sarebbe il caso di mettere un campo per i permessi direttamente nella tabella utenti in modo da recuperarli già all'atto del login (e quinid non fare una query successiva)?

risposto 10 anni fa
LonelyWolf
X 0 X

Ho risolto....il problema è che non avevo inserito il nome del db ::)

risposto 10 anni fa
Piero83
X 0 X

Salve!

Qualcuno sarebbe così genitle e paziente da suggerirmi il problema con questa istruzione $num_righe = mysql_num_rows($risultato);??

PHP legge tutto correttamente fino a questo comando segnalandomi che:

Warning: mysql_num_rows(): supplied argument is not a valid MySQL result resource in path...file.php on line n

E' la stessa istruzione postata da z3ro poco sopra e anche il codice della mia pagina è lo stesso ???

Grazie anticipate.

 :)

risposto 10 anni fa
Piero83
X 0 X

Dovrebbe essere un problema con la query, prova a stampartela a video, la provi direttamente in mysql e vedi cosa ti restituisce...

Se non è quello prova a postare un po' di codice.

ciao

Lore

risposto 10 anni fa
Lore
Lore
1
X 0 X

c'era un errore nel nome della tabella selezionata nella query  O0

Cavolo me ne accorgo sempre dopo che ho postato.

Sorry!

risposto 10 anni fa
Piero83
X 0 X

Ciao ragazzi,

approfitto ancora di questo thread per chiedervi una cosa.

Ho provato il codice proposto da z3ro ed in locale sembra funzionare. Al momento del login infatti riconosce user e pw e mi mostra la pagina desiderata.

Provandolo in remoto invece riscontro questo errore:

Warning: mysql_connect() [function.mysql-connect]: Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2) in /web/htdocs/www.pippo.it/home/result.php on line 35

Da quello che ho capito un socket è una "porta" che funge da collegamento tra il locale e il remoto, inviando e ricevendo istruzioni. Ho capito male?? Devo forse settare qualcosa??

Grazie tante.

 :bye:

risposto 10 anni fa
Piero83
X 0 X

Nessuna dritta?? :o

risposto 10 anni fa
Piero83
X 0 X

A parte che conviene aprire sempe una nuova discussione, ma comunque ... tu hai chiesto di aprire il database remoto dal tuo script in locale? Perché dall'errore sembrerebbe questo.

risposto 10 anni fa
Marco Grazia
X 0 X
Effettua l'accesso o registrati per rispondere a questa domanda