Login che prende un valore sbagliato

Paperino78

Utente Attivo
30 Giu 2012
409
0
16
Milano
Nella pagina di login come in tutte le pagine di questo tipo prendo i valori dal form così
PHP:
$username	=	$mysqli->real_escape_string(trim($_POST['username']));
$password	=	$mysqli->real_escape_string(trim($_POST['password']));
li confronto con quelli nel db
PHP:
	if($result = $mysqli->query("SELECT user_id,username,password,password_crypt FROM utenti")){
			//Se riesco a collegarmi con il database proseguo
			while ($row = $result->fetch_assoc())

			{
				$db_username 		= $row['username'];
				$db_password_crypt 	= $row['password_crypt'];
				$db_id				= $row['user_id'];
			}
			// Controllo se i dati inseriti corrispondono a quelli nel database
			if (($db_password_crypt == $password_crypt) && ($db_username == $username)) {
				$_SESSION['username'] 	= $username;
				$_SESSION['user_id']	= $db_id;
				//Se i dati coincidono loggo l'utente e gli do i benvenuto
la password la crypto e faccio un confronto con quella nel db.

Il problema è questo, i dati che utilizzo sono già inseriti nel db quindi ho la certezza che il login debba avvenire, il fatto è che nonostante inserisca l'username corretto lui mi restituisce un altro username, ed ovviamente login rifiutato! Cioè il var_dump() di username mi restituisce l'username che ho messo nel form, mentre il var_dump() dell'username prelevato dal db mi da un username diverso.
Mi sapreste dire se il codice che ho postato è corretto? Il db ha al momento 4 user, nel form inserisco l'user tizio e var_dump() mi restituisce l'user caio, almeno var_dump mi dice questo.

Qualcuno mi illumini:hammer::hammer::hammer:
 

Paperino78

Utente Attivo
30 Giu 2012
409
0
16
Milano
Ciao,
Mi serve per recuperare i dati dal form confrontarli con il database è effettuare il login. Il problema è che se non metto where con variabile associata al username che prendo dal form non riesco a effettuare il login
 

borgo italia

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
4 Feb 2008
16.046
150
63
PR
www.borgo-italia.it
ciao
perche fai tutto quell'ambaradan?
PHP:
<?php
//........
$username    =    $mysqli->real_escape_string(trim($_POST['username']));
$password    =    $mysqli->real_escape_string(trim($_POST['password'])); //devi criptarla
$result = $mysqli->query("SELECT user_id,username,password,password_crypt FROM utenti WHERE username='$username' ANDA password_crypt=$password'");
$esiste = $result->num_rows;
if($esiste ==1){
	$row = $result->fetch_assoc();
	$_SESSION['username']=$row[];
    $_SESSION['user_id']=$row[];
	echo "ciao ".$_SESSION['username'];
	//e rimandi dove vuoi
}else{
	echo "non sei registrato";
	//e rimandi dove vuoi
}
//...
?>
poi una cosa: metti nel db anche la password in chiaro? se si è un assurdo ed inutile che tu la cripti
 

Paperino78

Utente Attivo
30 Giu 2012
409
0
16
Milano
Ciao borgo,
Tutto sto ambaradam perché non conosco bene php, quindi vado per logica ed ovviamente il codice risulta lungo non pulito e non ottimizzato. D'altronde tutto quello che ho fatto l'ho realizzato senza studi, ma autodidatta.
Non riesco a farmi entrare in mente il meccanico degli array e del fetch (). Inoltre come hai visto utilizzo un altro metodo per gestire i dati da db. Il problema se lo è veramente è che tu inserisci la funzione where con la variabile username mentre io non volevo o pensavo di usarla. Infatti adesso che ho messo username dopo where tutto funziona.
 

otto9due

Utente Attivo
22 Feb 2014
591
25
28
Ciao borgo,
Tutto sto ambaradam perché non conosco bene php, quindi vado per logica ed ovviamente il codice risulta lungo non pulito e non ottimizzato. D'altronde tutto quello che ho fatto l'ho realizzato senza studi, ma autodidatta.
Non riesco a farmi entrare in mente il meccanico degli array e del fetch (). Inoltre come hai visto utilizzo un altro metodo per gestire i dati da db. Il problema se lo è veramente è che tu inserisci la funzione where con la variabile username mentre io non volevo o pensavo di usarla. Infatti adesso che ho messo username dopo where tutto funziona.

Spero di aiutarti a fare chiarezza:

Questa query qui non fa altro che dire:
PHP:
$result = $mysqli->query("SELECT user_id,username,password,password_crypt FROM utenti WHERE username='$username' AND password_crypt=$password'");

Seleziona (user_id,username,password,password_crypt) dalla tabella (utenti) WHERE sta per "dove" quindi andiamo a cercare una corrispondenza, ovvero quindi: dove il valore contenuto nel campo username del db (useusername='$username') è uguale al valore della tua variabile e lo stesso per la pass ( password_crypt=$password' )

Where in pratica serve a specificare meglio la ricerca es dovessi cercare in un elenco di nomi il nome "Andrea"
avresti scritto:
PHP:
$result = $mysqli->query("SELECT nome,cognome,data_di_nascita,esempio FROM utenti WHERE nome='Andrea'");

Per quanto riguarda il fetch_assoc(), anche a me i primi periodi, ed alcune volte anche ora mi crea un pò di confisione uhauha, ma ho capito questo, mi correggano se sbaglio i master ;)
In pratica: restituisce il successivo risultato ( ne prende uno solo, ma si dice che restituisce il successivo perchè se crei un ciclo, ovviamente restituisce sempre il risultato successivo ad ogni ripetizione del ciclo, se usato da solo come in questo caso no ) sotto forma di un array avente come chiavi i "nomi dei campi" recuperati e come valori i rispettivi valori. In caso l’iterazione sia terminata viene restituito NULL;

Se non ti è chiara qualcosa dimmi pure.
 

Paperino78

Utente Attivo
30 Giu 2012
409
0
16
Milano
Il codice mi è tutto chiaro, solo che ci possono essere diversi modi di scriverlo. Il risultato lo ottengo lo stesso infatti faccio il login. Poi non sapevo del ultimo record nel fetch assoc. Quindi dovrò mettere sempre il where? Oppure c'è un altro modo per farlo? Per non ottenere l'ultimo record.
 

otto9due

Utente Attivo
22 Feb 2014
591
25
28
Dipende sempre dai dati che vuoi estrapolare dal db, where, come like come altri, ti aiutano a selezionare i risultati voluti. Per intenderci, se non avessi messo il where avresti trovato ( nel mio esempio per praticità ) tutti i nomi, i cognomi ecc. Ma a te magari servivano solo quelli dove (where quindi) il nome era Andrea.

Ps: in questo caso usi fetch senza ciclo perchè si presume che utente con quell'user e quella pass ce ne sia solo 1. Quindi se trova la corrispondenza ti logga :)

Per non ottenere l'ultimo record, ma tutti quelli disponibili es tutti gli utenti che si chiamano Andrea, dovrai fare un ciclo (quindi ripetere tante volte fetch fino a quando i risultati finiscono ed il ciclo si ferma) .. Anche qui puoi scegliere, in base alle necessità tra uno dei vari cicli disponibili.

Saluti.
G.G.
 
Ultima modifica:

Paperino78

Utente Attivo
30 Giu 2012
409
0
16
Milano
Capito, direi quindi che con la funzione where e l'aggiunta della variabile presa dal form possiamo chiudere il thread. Grazie a tutti,
 

borgo italia

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
4 Feb 2008
16.046
150
63
PR
www.borgo-italia.it
ciao
prendiamo il tuo while
PHP:
<?php
//.....
while ($row = $result->fetch_assoc()){
	$db_username = $row['username'];
	$db_password_crypt = $row['password_crypt'];
	$db_id = $row['user_id'];
} 
//.....
?>
cosa succede, mettiamo per esempio che tu abbia tre record
legge il primo e mette i valori in $db_username, $db_password_crypt, $db_id
legge il secondo e li mette in $db_username, $db_password_crypt, $db_id, sovrascrivendo i valori precedenti
legge il terzo e li mette in $db_username, $db_password_crypt, $db_id, sovrascrivendo i valori precedenti
quindi all'uscita del while ti ritovo solo con i valori del terzo record
se proprio vuoi usare quel sistema (tanto per complicarti la vita) devi fare
PHP:
<?php
//.....
while ($row = $result->fetch_assoc()){
	$db_username[] = $row['username'];
	$db_password_crypt[] = $row['password_crypt'];
	$db_id[] = $row['user_id'];
} 
//.....
?>
poi per la verifica
PHP:
<?php
if (in_array($password_crypt,$db_password_crypt) && in_array($username, $db_username)) {
//....
?>
 

Paperino78

Utente Attivo
30 Giu 2012
409
0
16
Milano
Ovviamente non voglio complicarmi la vita, solo che ci vorrebbe qualcuno che mi spiegasse queste cose, proprio perché autodidatta. Facendo così uno come me sbaglierebbe sempre non sapendo perché. Purtroppo tempo per applicarmi non ne ho, quindi mi affido a voi del forum.

Nel tu esempio esplicativo è chiaro che se volessi usare il mio metodo dovrei usare un array che al.solo pensiero mi vien mal di testa.
Grazie a tutti e due. Farò tesoro dei consigli.
 

Paperino78

Utente Attivo
30 Giu 2012
409
0
16
Milano
Dimenticavo, la password la metto in chiaro nel db per poterla recuperare in caso l'utente la smarrisse. Magari è una cavolata ma visto che non posso fare l'operazione inversa e quindi decriptarla, ho pensato di risolvere così.
 

otto9due

Utente Attivo
22 Feb 2014
591
25
28
Ovviamente no, se la smarrisce gli dai la possibilità di crearne una nuova ma quella vecchia non puó essere recuperata.. Nel db la pass dev'essere criptata e il confronto deve avvenire sempre tra pass criptate allo stesso modo


Saluti.
G.G.
 
Discussioni simili
Autore Titolo Forum Risposte Data
S sessione di login che non dura nullaaa Supporto Mr.Webmaster 0
asevenx login con registrazione e cookie che salva i dati con sistema "ricordami" PHP 3
tanaka login che indirizza gli utenti verso pagine diverse in base alla password immessa PHP 4
N Vba Maschera di login MS Access 1
Shyson Codice wp-login non funziona PHP 2
L Problemi con il login PHP 2
L login e session PHP 4
A Problema login con Safari PHP 14
R Reinderizzamento dopo login PHP 2
C finestra popup dopo login PHP 2
L login con solo un codice PHP 3
Web93 PROBLEMA SITO WEB WORDPRESS - LOGIN DASHBOARD Programmazione 3
M Login Autenticazione Sviluppo app per Android 0
M Effettuare Login con dati Json Sviluppo app per Android 0
S [PHP] Stampa a video Nome e Cognome in seguito a login PHP 1
M [PHP] header (location..) non funzionante dopo login PHP 3
L [PHP] Visualizzare utente dopo login PHP 0
L [PHP] login con password_verify PHP 3
A HTML issues with creating a register and login page + general questions HTML e CSS 1
L [PHP] login con varie entrate PHP 3
L [PHP] login con password_verify - password_hash PHP 5
M [PHP] Problemi con il riconoscimento login. PHP 21
F [PHP] Login senza database PHP 3
F [php] sicurezza password form login PHP 2
M [PHP] Metodo migliore per fare login a un DB Mysql PHP 1
F Problema con pagine login in PHP PHP 2
Y [PHP] Errore di login dopo aver inserito Codice AdSense PHP 0
M [PHP] Problemi con login facebook PHP 0
Shyson [WordPress] Nascondere link del Login WordPress 2
W [PHP] Login sicuro al web Service SOAP PHP 20
P [PHP] Limitare login ad un solo utente per volta PHP 12
L [PHP] login e protezione pagine con session PHP 3
L [PHP] login con la classe medoo.in PHP 5
I [PHP] [Javascript] login da smartphone a web PHP 3
P [PHP] Reindirizzamento post Login PHP 3
I [PHP] login con sessione singola PHP 1
AkenStyle Login per gioco online Database 6
bubino8 [WordPress] [PHP] Login diretto da bottone WordPress 4
D [PHP] Login Multiutente con pagina privata PHP 5
D problemi login php 5.6 mysql PHP 1
I [PHP] Login Facebook SDK returned an error: No URL set! PHP 0
G PHP Login PHP 1
Laskot Login php e redirect PHP 1
K [PHP] Unica sessione login forum/sito PHP 1
bubino8 [WordPress] Login a WP da bottone WordPress 0
bubino8 [PHP] Login Automatico PHP 1
R Filtro login tramite mac-address su apache2 SSL Apache 1
M [PHP] Sessione Login PHP 15
C [PHP] Aprire la pagina dopo aver fatto il login PHP 1
fabry1986 [PHP] login PHP 2

Discussioni simili