Мой вопрос будет использовать электронные письма в качестве примера, но это может быть применимо ко всему.
Обычно, прежде чем регистрировать нового пользователя (включая вставку его / ее электронной почты), я проверяю, существует ли его / ее электронная почта в БД примерно так:
$result = mysql_query("SELECT * FROM Users WHERE email = '".mysql_real_escape_string($email)"';"); if(!$result) { die(mysql_error()); } if(mysql_num_rows($result) > 0) { die('<p>Email already in DB. <a....>Recover Email</a></p>'); } else { //insert new user data into Users table }
Так как я бы ограничил поле email
в моей таблице «Пользователи», чтобы быть UNIQUE
любом случае, не было бы быстрее попытаться вставить сначала, и если это не сработает, проверьте ошибку? Что-то вроде этого:
$result = mysql_query(...);//insert new user data into Users table if(!$result) { if(mysql_errno()==$insert_unique_error) { $error = '<p>Email already in DB. <a....>Recover Email</a></p>'; } else { $error = mysql_error(); } die($die_str); }
Проблема в том, что я не знаю, что такое $insert_unique_error
. Это единственные коды ошибок, которые я могу найти :
Первые два символа значения SQLSTATE указывают на класс ошибки:
Класс = '00' указывает на успех.
Класс = '01' указывает на предупреждение.
Класс = '02' означает «не найден». Это актуально в контексте курсоров и используется для управления тем, что происходит, когда курсор достигает конца набора данных. Это условие также возникает для операторов SELECT … INTO var_list, которые не извлекают строки.
Класс> '02' указывает на исключение.
использование
INSERT IGNORE INTO Users VALUES(...);
с уникальным ключом в поле электронной почты, а затем проверить количество строк с помощью mysql_affected_rows ();
Это приведет к одному запросу к БД и исключению условия гонки временного окна между SELECT и INSERT
Я считаю, что COUNT – один из самых быстрых методов. Также помните, когда делаете свои запросы, если вы хотите протестировать его существование, не делайте
SELECT *
Вместо этого укажите конкретное поле
SELECT id
Таким образом, вы не получаете столько данных. В случае использования COUNT:
SELECT COUNT(id) FROM Users WHERE email = 'emailaddress'
См. Ниже ссылку о том, как использовать COUNT в результирующем наборе