PDA

View Full Version : [PHP] impedire registrazione di 2 nick uguali


red_code
09-05-2006, 12:14
ciao a tutti, sto creando (anzi, già l'ho fatto) un form per registrarsi ad un sito, il mio problema ora è evitare che ci siano nick "doppioni".

mi pare di aver capito di dover usare mysql_num_rows()..

HEEELP!! :read:

cionci
09-05-2006, 12:44
Metti un indice di tipo UNIQUE sullo sername, esegui l'update e dopo controlla il numero di righe inserite con mysql_affected_rows (se è 0 c'è stato un problema nell'inserimento e se hai quel solo indice, oltre ad un campo chiave primaria autoincrementante, allora il problema ès icuramente lo username doppio)...

Altrimenti fai il lock sulla tabella (oppure usa una transazione) fai una select che ti controlla l'esistenza dello username, se mysql_num_rows ritorna 0 allora vai avanti nell'inserimento...

red_code
09-05-2006, 14:21
no compriendo :mbe:

Fenomeno85
09-05-2006, 15:48
Metti un indice di tipo UNIQUE sullo sername, esegui l'update e dopo controlla il numero di righe inserite con mysql_affected_rows (se è 0 c'è stato un problema nell'inserimento e se hai quel solo indice, oltre ad un campo chiave primaria autoincrementante, allora il problema ès icuramente lo username doppio)...

Altrimenti fai il lock sulla tabella (oppure usa una transazione) fai una select che ti controlla l'esistenza dello username, se mysql_num_rows ritorna 0 allora vai avanti nell'inserimento...

se invece fa una select e controlla che esiste??

~§~ Sempre E Solo Lei ~§~

0rph3n
09-05-2006, 16:11
no compriendo :mbe:
allora:
Metti un indice di tipo UNIQUE sullo sername, esegui l'update e dopo controlla il numero di righe inserite con mysql_affected_rows (se è 0 c'è stato un problema nell'inserimento e se hai quel solo indice, oltre ad un campo chiave primaria autoincrementante, allora il problema ès icuramente lo username doppio)...
inserisci un indice relativo al campo username che non permetta l'esistenza di due record contenenti lo stesso valore per il campo username.
Questo implica che se tu tenti di inserire un record che contiene uno username già esistente questo (l'intero record) non venga inserito!
Di conseguenza se dopo un INSERT controlli con la funzione mysql_affected_rows il numero di righe inserite, vedi se appunto il record è stato inserito oppure no e riesci a capire se l'username era già esistente (in tal caso 0 righe verranno inserite e l'output della funzione sarà proprio 0) oppure no e ti comporti di conseguenza!

Altrimenti fai il lock sulla tabella (oppure usa una transazione) fai una select che ti controlla l'esistenza dello username, se mysql_num_rows ritorna 0 allora vai avanti nell'inserimento...
blocchi la tabella durante questa operazione (oppure appunto usi una transazione che se ne occupa da sola), guardi se nella tabella esiste già un record con un campo username contenente un valore uguale a quello che devi immettere (appunto con una SELECT) e se non esiste inserisci (INSERT) il nuovo utente.
Fatto questo sblocchi la tabella (o dai il COMMIT alla transizione).

spero di averti chiarito qualche dubbio, anche se non ne sono sicuro visto che sembri a digiuno totale di database & company

'iao

Fenomeno85
09-05-2006, 17:12
ma non fa prima a fare con la mia soluzione? :D ... e anche come operazioni dul db ... 2 al posto di 3? :D

~§~ Sempre E Solo Lei ~§~

0rph3n
09-05-2006, 18:00
teoricamente si, ma se proprio per sfiga due nuovi utenti (utente1 e utente2) si stanno registrando con lo stesso nick con un lasso di tempo piccolissimo (ma proprio piccolo piccolo) uno dall'altro, se non ha implementato un lock della tabella o non usa le transazioni può capitare che nel lasso di tempo che intercorre tra la SELECT dell'utente1 e la successiva INSERT, l'utente2 faccia in tempo ad eseguire la SELECT non trovando di conseguenza ancora nessun utente già registrato con quel nick e creando casini al momento della sua successifa INSERT!

almeno questo è il prossibile scenario che mi immagino, poi magari cionci aveva consigliato di implementare lock o transazioni per altri motivi!

'iao

cionci
10-05-2006, 11:55
Proprio per quello... In un ambiente concorrente bisogna SEMPRE usare lock o transazioni...

Fenomeno85
10-05-2006, 13:05
giusto non avevo visto questo particolare molto importante

~§~ Sempre E Solo Lei ~§~\