2016-04-03 3 views
0

Добрый вечер.Вставить то же самое время, это возможно?

У меня есть сомнения относительно включения в базу данных. Общим примером является учетная запись пользователя, в которой имена пользователей должны быть уникальными.

В следующей логике:

  • Пользователь вводит данные в форму.
  • Данные собираются с помощью $ _POST (или другим способом)
  • Перед сохранением данных проверяется, если имя пользователя уже зарегистрировано
  • Если нет, сохранить запись, если она есть, она информирует пользователя о том, что имя пользователя, которое уже существует.

Пример:

<?php 
$username = $_POST['username']; 
$query = "SELECT * FROM `user_tbl` WHERE `username` = '{$username}'"; 
$result = mysql_query($query); 
if (mysql_num_rows ($result) > 1) { 
    /* Username already exists */ 
    echo 'Username already exists'; 
} else { 
    /* Username doesn't exist */ 
    /* a certain time is elapsed after checking */ 
    /* .. insert query */ 
} 

Мой вопрос, в системе с большим объемом запросов, вполне возможно, что между временем, чтобы проверить, существует ли уже имя пользователя и включения (если пользователь имя не существует), другой пользователь может сделать одно и то же действие за одно и то же время?

UPDATE

Я знаю о проблеме безопасности, используйте этот код (копию и прошлый), чтобы объяснить вопрос о возможности двух пользователей сделать то же самое в то же время. По вопросу об уникальном индексе я знаю, как это работает, может быть, я не был ясен в этом вопросе, это было только для того, чтобы увидеть, существует ли возможность «одновременных команд». Спасибо за ответы.

+2

Ваш код не готов для системы с большим объемом запросов. Нет проверки, нет санитарии, и вы используете устаревшее расширение mysql. – user2182349

+1

вы получили бы взломанные или потерянные данные, возможно, в течение 1 дня с таким кодом. Поставьте подтверждение и не используйте расширение, которое отклонено. –

+0

Резервное копирование должно установить уникальное поле имени пользователя –

ответ

1

Помимо уже размещены правильные замечания, решение этой проблемы является использование транзакций & уникальный индекс:

Уникальный индекс гарантирует, что значение может существовать только один раз.

В вашем случае индекс может быть:

CREATE UNIQUE INDEX idx_nn_1 ON user_tbl(username); 

Таким образом, пользователь может существовать только один раз. Если два человека вводят одно и то же имя пользователя одновременно, одна из вставок не будет выполнена. Эта неудача вам нужно поймать и обработать.

+1

Наряду с «использованием транзакций» сделайте его «SELECT ... FOR UPDATE», который заблокирует разрыв индекса, где имя пользователя будет идти, блокируя вторую попытку выбрать ту же несуществующую строку до тех пор, пока первая транзакция не завершится или не вернется, что делает фактическое вставное столкновение практически невозможным. –

Смежные вопросы