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:
 
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
 
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
 
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.
 
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.
 
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.
 
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:
Capito, direi quindi che con la funzione where e l'aggiunta della variabile presa dal form possiamo chiudere il thread. Grazie a tutti,
 
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)) {
//....
?>
 
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.
 
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ì.
 
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