Итак, я работаю над сайтом, на котором мы хотим, чтобы пользователи подписались на приватную бета-версию.Когда пользователь нажимает «Отправить» на странице регистрации, код php помещает свое имя, адрес электронной почты и случайно сгенерированный 32-символьный хэш в таблицу в моей базе данных.Затем он отправляет пользователю электронное письмо, содержащее ссылку для проверки, которая включает в себя адрес электронной почты пользователя и хеш для максимальной безопасности.Это выглядит так:
domain.com/b/verify.php?email=sample@sample.com&hash=1a2a3a4a5a6a7a8a9a8a7a6a5a4a3a2a
Когда они щелкают по этой ссылке, она отправляет их на страницу verify.php, которая берет электронную почту и хэш из URL-адреса и проверяет совпадение в ранее упомянутой базе данных.Если есть совпадение, он генерирует другое сообщение.Если совпадений нет, выдается «неверный URL или вы еще не зарегистрировались».Кроме того, таблица базы данных содержит столбец с именем «active», который по умолчанию имеет значение 0, но при щелчке по ссылке изменяется на 1.Код verify.php проверяет, чтобы убедиться, что active установлен в 0, прежде чем отображать сообщение о совпадении, чтобы ссылка могла использоваться только один раз.
Сообщение, отображаемое при совпадении, дает им ссылку на мою страницу регистрации phpbb3., который был изменен.Ссылка выглядит следующим образом:
domain.com/phpbb/ucp.php?mode=register&email=sample@sample.com&hash=1a2a3a4a5a6a7a8a9a8a7a6a5a4a3a2a
Я изменил свой файл ucp.php в корневом каталоге моего форума, чтобы он выглядел так:
case 'register':
// Database info (which I stupidly forgot not to hide prior to this...
if(isset($_GET['email']) && !empty($_GET['email']) AND isset($_GET['hash']) && !empty($_GET['hash'])){
// Verify data
$email = mysql_escape_string($_GET['email']); // Set email variable
$hash = mysql_escape_string($_GET['hash']); // Set hash variable
$search = mysql_query("SELECT email, hash FROM users WHERE email='".$email."' AND hash='".$hash."' AND active='1'") or die(mysql_error());
$match = mysql_num_rows($search);
if($match > 0){
// We have a match, activate the account
mysql_select_db("db2") or die(mysql_error());
if ($user->data['is_registered'] || isset($_REQUEST['not_agreed']))
{
redirect(append_sid("{$phpbb_root_path}index.$phpEx"));
}
$module->load('ucp', 'register');
$module->display($user->lang['REGISTER']);
}else{
// No match -> invalid url or account has already been activated.
mysql_select_db("db2") or die(mysql_error());
if ($user->data['is_registered'] || isset($_REQUEST['not_agreed']))
{
redirect(append_sid("{$phpbb_root_path}index.$phpEx"));
} else {
redirectpage();
}
}
}else{
// No match -> invalid url or account has already been activated.
redirectpage();
}
break;
Этот же код используется при проверке.php страницу, за исключением того, что я изменил ее, так что active не должен быть установлен в 0 для работы.
Все это работает по большей части: страница перенаправляется правильно, если не указан адрес электронной почты или хэш, илиесли это неверно.Единственная проблема заключается в том, что когда пользователь нажимает кнопку «Я согласен» на странице соглашения о регистрации, по какой-то причине в игру вступает редирект.Он не переносит их на следующую страницу, где существует форма регистрации.
Это также произошло, когда я попытался пропустить страницу соглашения о регистрации.Он успешно пропустил его, но после того, как я заполнил регистрационную форму и нажал «Отправить», он снова вызвал мою функцию перенаправления.
Кто-нибудь знает, почему перенаправление происходит при каждом нажатии кнопки отправки?