Проверка формы на актуальность.
Столкнулся с ситуацией когда на форме нажимают на сабмит дабл кликом, причем быстро, то данные на форме отправляется два раза, в общем-то нормальное явления, но) Получается так что скрипт обработки формы запускается с минимальной разницей во времени, и тут происходит следующее:
- т.к. сессия хранится в базе, а актуальность формы зависит от сессии и проверочных данных формы, в обоих случаях форма считается актуальной.
- интереснее, происходит проверка (SELECT) емайл и телефона на наличии в базе, затем инсерт, в итоге в базе две записи.
Что посоветуете?
т.е.
insert 1 //ok
insert 1 //error
insert null //ok
insert null //ok <==
2) сделай субмит формы на js
3) используй блокировки таблици
4(1+)) если делать как в 1) варианте твой скрипт при двойной обработке вернет вторую ошибку ( if ! Insert отработает ) поетому можешь добавить поле sid к своей табличке и хранить sid пользователя создавшего запись. соответственно при удалении сессии удалять sid из записей.
имхо надо както идентифицировать пользователя в таблице. Вдруг он потом захочет мыло или телефон поменять? Покажи структуру таблици.
Я лучше покажу как происходит проверка и регистрация:
Код:
if(mysql_num_rows(Query('SELECT 1 FROM `'.PREFIX.'module_public_users` WHERE `e_mail` = \''.$array_vars['e_mail'].'\' LIMIT 1'))){
$error=array('e_mail'=>1);
$error_txt = message_notice('Пользователь с таким E-Mail уже есть в системе',true);
return;
}
elseif(mysql_num_rows(Query('SELECT 1 FROM `'.PREFIX.'module_public_users` WHERE `phone_num`=\''.$phone_num.'\' LIMIT 1'))){
$error=array('phone'=>1);
$error_txt = message_notice('Пользователь с таким телефоном уже есть в системе',true);
return;
}
if(!Insert(PREFIX."module_public_users",array(....
$error=array('e_mail'=>1);
$error_txt = message_notice('Пользователь с таким E-Mail уже есть в системе',true);
return;
}
elseif(mysql_num_rows(Query('SELECT 1 FROM `'.PREFIX.'module_public_users` WHERE `phone_num`=\''.$phone_num.'\' LIMIT 1'))){
$error=array('phone'=>1);
$error_txt = message_notice('Пользователь с таким телефоном уже есть в системе',true);
return;
}
if(!Insert(PREFIX."module_public_users",array(....
мб при создании сид указывать? И если сид одинаковый выводить сообщение об успешном добавлении?
Цитата: arrjj
мб при создании сид указывать? И если сид одинаковый выводить сообщение об успешном добавлении?
Не совсем понятно как реализовать? Суть такова когда выполняются оба запроса (SELECT email, phone), то в этот момент записи в таблице нет. Получается так что они работают практически синхронно.
Спасибо. 2 уже сделано, а остальное будем думать)