Question

I am developing a web application where I need to create user accounts; the user-id is the e-mail address of the user. User-ids and passwords are stored in a MySQL database.

To create the account, the user goes to a registration page, and enters his/her e-mail address and a password. If the e-mail address is not already in the database, then a new account is created. These are TWO database operations - first to check if the e-mail address is already in the database, and if not, then second to create a new user record with this new e-mail address.

This TWO step process leaves open the possibility that two accounts with same e-mail address could be created. So my question is: How to make this an atomic operation to remove this possibility.

I'm using PHP and MySQL.

Edit: Don't understand why this question has been put on hold. Programmers building web applications encounter this problem without fail, the problem is asking for a fail-safe algorithm and deals with common tools PHP & MySQL. Furthermore, an attempted solution has been explained which clearly does not work.

Était-ce utile?

La solution

First, create a unique constraint on that column, to ensure that it'll never have more than one record with the same email address. If the application tries to insert a duplicate record, the insert query will fail.

Second, you'll probably want to use MySQL's INSERT IGNORE to suppress the error when the application attempts to insert a duplicate record. Then you can do the two queries in the opposite order: first do the INSERT IGNORE to create a record if there wasn't one already, and then SELECT whatever info you need based on the email address. If there was already a record for the same email address, the INSERT IGNORE will do nothing and the SELECT will find that pre-existing record.

Autres conseils

use UNIQUE in mysql. That will stop it from happening but you will get an error if you try. Then in the PHP you'll need something to search the existing. you can do something as simple as this:

SELECT 1 FROM users WHERE username = 'blah@blah.com';

if the 1 is there then you'd have a user that already exists and you wouldn't wanna try to add that person.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top