Форум программистов, компьютерный форум, киберфорум
PHP: базы данных
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
0 / 0 / 0
Регистрация: 22.12.2016
Сообщений: 8

Запрет повторного нажатия на ссылку активации в e-mail

21.02.2017, 15:28. Показов 1066. Ответов 3
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте! Не могу никак понять в какую сторону копать. Есть форма:
Кликните здесь для просмотра всего текста
HTML5
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
<form class="BRMeet" action="form.php" method="post" name="BRMeet">
<fieldset><legend>Personal Information:</legend>
<label for="scieTitle"><span class="rd fz14">*</span> Scientific Title:</label><input type="text" name="scieTitle" id="scieTitle"><!-- required-->
<label for="fName"><span class="rd fz14">*</span> First Name:</label><input type="text" name="fName" id="fName"><!-- required-->
<label for="lName"><span class="rd fz14">*</span> Last Name:</label><input type="text" name="lName" id="lName"><!-- required-->
<label for="mobPh"><span class="rd fz14">*</span> Mobile phone (with country prefix):</label><input type="tel" name="mobPh" id="mobPh"><!-- required-->
<label for="eMail"><span class="rd fz14">*</span> E-mail:</label><input type="text" name="eMail" id="eMail"><!--email required-->
</fieldset>
<fieldset><legend>Information about Organization:</legend>
<label for="orgName"><span class="rd fz14">*</span> Organization:</label><input type="text" name="orgName" id="orgName"><!-- required-->
<label for="depName"><span class="rd fz14">*</span> Department:</label><input type="text" name="depName" id="depName"><!-- required-->
<label for="posName"><span class="rd fz14">*</span> Position in&nbsp;Department:</label><input type="text" name="posName" id="posName"><!-- required-->
<label for="orgPh"><span class="rd fz14">*</span> Phone (with country prefix):</label><input type="tel" name="orgPh" id="orgPh"><!-- required-->
<label for="orgFax">Fax (with country prefix):</label><input type="tel" name="orgFax" id="orgFax">
<label for="orgSite">Website:</label><input type="url" name="orgSite" id="orgSite">
<label for="orgStreet"><span class="rd fz14">*</span> Street/Number:</label><input type="text" name="orgStreet" id="orgStreet"><!-- required-->
<label for="orgCity"><span class="rd fz14">*</span> Town/City:</label><input type="text" name="orgCity" id="orgCity"><!-- required-->
<label for="orgCode"><span class="rd fz14">*</span> Postal/ZIP Code:</label><input type="text" name="orgCode" id="orgCode"><!-- required-->
<label for="orgCountry"><span class="rd fz14">*</span> Country:</label><input type="text" name="orgCountry" id="orgCountry"><!-- required-->
</fieldset>
<fieldset><legend>Comments (if necessary):</legend>
<label for="cmmnts">Your Comments:</label><textarea name="cmmnts" id="cmmnts"></textarea>
</fieldset>
<fieldset style="text-align:center;"><legend>Actions with Form:</legend>
<input type="submit" value="Submit Form"><input type="reset" value="Clear Form">
</fieldset>
</form>

После ее заполнения и нажатия submit данные заносятся в БД и одновременно пользователю уходит сообщение с активационной ссылкой. (файл form.php)
Кликните здесь для просмотра всего текста
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
<?
include 'db.php';
$db_scieTitle = $_REQUEST['scieTitle'];
$db_fName = $_REQUEST['fName'];
$db_lName = $_REQUEST['lName'];
$db_regDate = date("Y-m-d H:i:s");
$db_mobPh = $_REQUEST['mobPh'];
$db_eMail = $_REQUEST['eMail'];
$db_orgName = $_REQUEST['orgName'];
$db_depName = $_REQUEST['depName'];
$db_posName = $_REQUEST['posName'];
$db_orgPh = $_REQUEST['orgPh'];
$db_orgFax = $_REQUEST['orgFax'];
$db_orgSite = $_REQUEST['orgSite'];
$db_orgStreet = $_REQUEST['orgStreet'];
$db_orgCity = $_REQUEST['orgCity'];
$db_orgCode = $_REQUEST['orgCode'];
$db_orgCountry = $_REQUEST['orgCountry'];
$db_cmmnts = $_REQUEST['cmmnts'];
 
$result = mysql_query("SELECT id FROM participants WHERE email='$db_eMail'");
$myrow = mysql_fetch_array($result);
if (!empty($myrow['id'])) {
exit ('<p class="rd btxt cntr">Sorry!<br/>The&nbsp;e-mail that you fill in&nbsp;the&nbsp;form already exists in&nbsp;the&nbsp;database.<br/>Please, choose another e-mail for&nbsp;registration!</p>');
}
$insert_sql = "INSERT INTO participants (reg_date, scie_title, first_name, last_name, mob_phone, email, organization, department, position, phone, fax, w_site, adress, city, zip_code, country, comment)" . "VALUES('{$db_regDate}', '{$db_scieTitle}', '{$db_fName}', '{$db_lName}', '{$db_mobPh}', '{$db_eMail}', '{$db_orgName}', '{$db_depName}', '{$db_posName}', '{$db_orgPh}', '{$db_orgFax}', '{$db_orgSite}', '{$db_orgStreet}', '{$db_orgCity}', '{$db_orgCode}', '{$db_orgCountry}', '{$db_cmmnts}');";
mysql_query($insert_sql);
echo '<p class="rd btxt cntr">You have successfully completed the&nbsp;form! Check your email! We have sent you an&nbsp;activation link!</p>';
 
$activ = mysql_query("SELECT id FROM participants WHERE email='$db_eMail'");
$id_activ = mysql_fetch_array($activ);
$activation = md5($id_activ['id']);
$subject = "Registration Confirmation";
$message = "Hello, $db_fName! Thank you for filling Registration Form for Participation in 23rd Annual Meeting of the Baltic Sea Region Program on Occupational Health and Safety on XIV OHRNC-2017 site.\nIn order to confirm the entered information, you need to activate your e-mail.\nTo activate your e-mail, click the link: http://congr2017/eng/balt-reg-safe-meet/form/activation.php?email=".$db_eMail."&act=".$activation."\nSincerely, Administration http://congr2017/";//содержание сообщение
mail($db_eMail, $subject, $message, "Content-type:text/plain; Charset=windows-1251\r\n");
?>

файл activation.php
Кликните здесь для просмотра всего текста
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<?
include 'db.php';
if(isset($_GET['act']) AND isset($_GET['email'])) {
$act = $_GET['act'];
$act = stripslashes($act);
$act = htmlspecialchars($act);
 
$db_eMail = $_GET['email'];
$db_eMail = stripslashes($db_eMail);
$db_eMail = htmlspecialchars($db_eMail);
}
else{
exit('<p class="cntr rd">You have entered the&nbsp;page without confirmation code!</p>');
}
$activ = mysql_query("SELECT id FROM participants WHERE email='$db_eMail'"); //извлекаем идентификатор пользователя с данным e-mail
$id_activ = mysql_fetch_array($activ);
$activation = md5($id_activ['id']);
$db_authDate = date("Y-m-d H:i:s");
if ($activation == $act) {//сравниваем полученный из url и сгенерированный код
mysql_query("UPDATE participants SET auth='1', auth_date='$db_authDate', hash='$activation' WHERE email='$db_eMail'");
echo '<p class="cntr">Your e-mail address has been successfully activated on&nbsp;'.$db_authDate.'!<p>';
}
else {
echo '<p class="cntr rd"><span class="btxt">Error!</span> Your account is not activated. Please, try again or&nbsp;contact the&nbsp;site administrator.</p>';
}
?>


Необходимо реализовать вывод ошибки о повторном нажатии ссылки активации из письма, вроде того, как это реализовано на данном сайте.

Понимаю, что надо проверять пустой или не пустой hash, и соответственно выдавать сообщение, но никак не получается, данные все равно обновляются, как будто происходит повторная активация (этого кода нет в activation.php).

Буду очень признательна за все возможные идеи.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
21.02.2017, 15:28
Ответы с готовыми решениями:

Запрет повторного нажатия кнопки при отправки формы
Здравствуйте При отправки формы, пользователь успевает нажать кнопку несколько раз. Нужно - чтобы копка блокировалась в тот момент, когда...

Запрет повторного добавления в Combobox
Создал я комбобокс как сделать так чтобы он повторно не добавлял элемент. А добавил 1 раз в самой программе, но после допускал решение...

Запрет повторного просмотра страницы
нужно чтобы пользователь мог просмотреть страницу сайта только один раз в 24 часа я понимаю что нужно сперва узнать его ip адрес, есть...

3
576 / 514 / 253
Регистрация: 26.09.2010
Сообщений: 2,603
22.02.2017, 01:46
Цитата Сообщение от Marrusa1001 Посмотреть сообщение
Буду очень признательна за все возможные идеи.
надо сделать проверку по таблице в которую пишите активацию participants

например

PHP
1
2
3
4
5
6
7
$check = mysql_query("SELECT `auth` FROM `participants` WHERE email='$db_eMail'");
$row_check = mysqli_fetch_array($check);
if ($row_check['auth'] == '1') {
echo "Вы уже активировались!";
}else {
mysql_query("UPDATE participants SET auth='1', auth_date='$db_authDate', hash='$activation' WHERE email='$db_eMail'");
}
0
0 / 0 / 0
Регистрация: 22.12.2016
Сообщений: 8
22.02.2017, 09:14  [ТС]
Виталюска, спасибо, попробую!

Добавлено через 47 минут
Виталюска, еще раз спасибо! Помогло... Если вдруг кому-то нужно, выкладываю готовый activation.php
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
<?
include 'db.php';
if(isset($_GET['act']) AND isset($_GET['email'])) {
$act = $_GET['act'];
$act = stripslashes($act);
$act = htmlspecialchars($act);
 
$db_eMail = $_GET['email'];
$db_eMail = stripslashes($db_eMail);
$db_eMail = htmlspecialchars($db_eMail);
}
else{
exit('<p class="cntr rd">You have entered the&nbsp;page without confirmation code!</p>');
}
$activ = mysql_query("SELECT id FROM participants WHERE email='$db_eMail'"); //извлекаем идентификатор пользователя с данным e-mail
$id_activ = mysql_fetch_array($activ);
$activation = md5($id_activ['id']);
if ($activation == $act) {//сравниваем полученный из url и сгенерированный код
$checkAuth = mysql_query("SELECT auth FROM participants WHERE email='$db_eMail'");
$rowCheckAuth = mysql_fetch_array($checkAuth);
$db_authDate = date("Y-m-d H:i:s");
if ($rowCheckAuth['auth'] == '1') {
$checkAuthDate = mysql_query("SELECT auth_date FROM `participants` WHERE email='$db_eMail'");
$rowCheckAuthDate = mysql_fetch_array($checkAuthDate);
echo '<p class="cntr">You have already activated on&nbsp;'.$rowCheckAuthDate['auth_date'].'! See you at&nbsp;the&nbsp;event.<p>';
}else {
mysql_query("UPDATE participants SET auth='1', auth_date='$db_authDate', hash='$activation' WHERE email='$db_eMail'");
echo '<p class="cntr">Your e-mail address has been successfully activated on&nbsp;'.$db_authDate.'!<p>';
}
}
else {
echo '<p class="cntr rd"><span class="btxt">Error!</span> Your account is not activated. Please, try again or&nbsp;contact the&nbsp;site administrator.</p>';
}
?>
0
576 / 514 / 253
Регистрация: 26.09.2010
Сообщений: 2,603
22.02.2017, 15:55
Цитата Сообщение от Marrusa1001 Посмотреть сообщение
$checkAuth = mysql_query("SELECT auth FROM participants WHERE email='$db_eMail'");
$rowCheckAuth = mysql_fetch_array($checkAuth);
$db_authDate = date("Y-m-d H:i:s");
if ($rowCheckAuth['auth'] == '1') {
$checkAuthDate = mysql_query("SELECT auth_date FROM `participants` WHERE email='$db_eMail'");
$rowCheckAuthDate = mysql_fetch_array($checkAuthDate);
тут второй запрос лишний, можно было использовать только первый
добавив в запрос
PHP
1
$checkAuth = mysql_query("SELECT auth, auth_date FROM participants WHERE email='$db_eMail'");
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
22.02.2017, 15:55
Помогаю со студенческими работами здесь

Запрет повторного входа пользователей
Всем , здравствуйте. Исходные данные: Проект на MVS 2015. Авторизация пользователей работает через SQL. Вопрос: ...

Запрет повторного вызова OnClick
как сделать так что бы свойство OnClick выполнялось только один раз. То есть при втором нажатие оно уже не срабатывало. Реч идет про...

Запрет повторного запуска приложения
Добрый день! Подскажите пож-та как реализовать запрет повторного запуска приложения, если оно уже запущено на компьютере. Например...

Запрет повторного запуска программы
Можете сказать почему он не работает? Вторая копия программы все равно запускается! --- HANDLE Test_Present =...

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


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит: токи, напряжения и их 1 и 2 производные при t = 0;. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru