Zabránění opětovné registrace

elza
Člen | 7
+
0
-

Zdravím pánové,
potřebovala bych jako začátečník radu.

Jak nejlépe si poradit s tím, aby uživatel který se již někdy dávno registroval ale snaží se zaregistrovat znovu tím stejným emailem, po odeslání registračního formuláře, neproběhlo ukládání stejných dat do databáze a zobrazila se chybová hláška že email byl již zaregistrován?

Děkuji

Petr Parolek
Člen | 455
+
+1
-

Ahoj, např. takto: https://github.com/…rManager.php#L74 a v databázi mít mít unikátní klíč na e-mail.

Kamil Valenta
Člen | 758
+
+2
-

Jedna možnost je zachytávat výjimku unikátního klíče, jak bylo již uvedeno.

Druhá možnost je před insertem udělat select, zda email již v tabulce není. Druhé řešení sice stojí režii selectu a locku, ale zase nevyžírá ID z autoincrementu.

elza
Člen | 7
+
0
-

Kamil Valenta napsal(a):

Jedna možnost je zachytávat výjimku unikátního klíče, jak bylo již uvedeno.

Druhá možnost je před insertem udělat select, zda email již v tabulce není. Druhé řešení sice stojí režii selectu a locku, ale zase nevyžírá ID z autoincrementu.

jak by takový select s podmínkou měl vypadat ?
děkuju

elza
Člen | 7
+
0
-

elza napsal(a):

Kamil Valenta napsal(a):

Jedna možnost je zachytávat výjimku unikátního klíče, jak bylo již uvedeno.

Druhá možnost je před insertem udělat select, zda email již v tabulce není. Druhé řešení sice stojí režii selectu a locku, ale zase nevyžírá ID z autoincrementu.

jak by takový select s podmínkou měl vypadat ?
děkuju

respektive Select mám jen netuším jak mám formulovat podmínku.

$this->connection->query(‚SELECT email FROM users WHERE email = ?‘, $values);

Kamil Valenta
Člen | 758
+
0
-

elza napsal(a):

$this->connection->query(‚SELECT email FROM users WHERE email = ?‘, $values);

Předpokládám, že email nebude ve $values jako takové, ale že $values je ArrayHash z Form.
Tedy

$this->connection->query('SELECT email FROM users WHERE email = ?', $values->email);

Select a insert by měl probíhat pod zámkem, aby mezi selectem a insertem neproběhl z jiného vlákna insert požadovaného emailu.
https://www.mysqltutorial.org/…ble-locking/

Nebo nezamykat a po selectu zachytávat výjimku na duplicitní email (což neeliminuje „vyžířání“ ID, ale hodně sníží šanci, že k němu dojde).