Самый быстрый способ проверить наличие существующей записи перед вставкой [mysql_errno ()] - PullRequest
0 голосов
/ 18 января 2012

Мой вопрос будет использовать электронную почту в качестве примера, но это может относиться ко всему.


Обычно перед регистрацией нового пользователя (включая вставку его / ее электронной почты) я проверяю, существует ли его / ее электронная почта в БД, примерно так:

$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 указывают на класс ошибки:

Class = '00' указываетsuccess.

Class = '01' обозначает предупреждение.

Class = '02' обозначает «не найдено». Это относится к контексту курсоров и используется для контроля того, что происходит, когдакурсор достигает конца набора данных.Это условие также возникает для операторов SELECT ... INTO var_list, которые не получают строк.

Class> '02' указывает на исключение.

Ответы [ 2 ]

5 голосов
/ 18 января 2012

Используйте

INSERT IGNORE INTO Users VALUES(...);

с уникальным ключом в поле электронной почты, затем проверьте количество строк с помощью mysql_affered_rows ();

Это приведет к одному запросу к БД и исключитсостояние гонки временного окна между SELECT и INSERT

0 голосов
/ 18 января 2012

Я считаю, что COUNT - один из самых быстрых методов. Также помните, что при выполнении ваших запросов, если вы только хотите проверить его существование, не делайте

SELECT *

Вместо этого укажите конкретное поле

SELECT id

То есть вы не получаете столько данных. В случае использования COUNT:

SELECT COUNT(id) FROM Users WHERE email = 'emailaddress'

См. Ниже ссылку о том, как использовать COUNT в наборе результатов

http://www.tizag.com/mysqlTutorial/mysqlcount.php

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...