@Hahaz

Почему последний символ стирается?

659712f37bf42808682955.png659712f794f55365108447.png
<?php

if ($module == 'register' and $_POST['enter']) {

$_POST['name'] = FormChars($_POST['name']);
$_POST['login'] = FormChars($_POST['login']);
$_POST['email'] = FormChars($_POST['email']);
$_POST['password'] = GenPass(FormChars($_POST['password']), $_POST['login']);

if (!$_POST['login'] or !$_POST['password'] or !$_POST['name'] or !$_POST['email']) MessageSend(1,'Невозможно обработать форму.');

$Row = mysqli_fetch_assoc(mysqli_query($connect, "SELECT `login` FROM `users` WHERE `login` = '$_POST[login]'"));
if($Row['login']) exit('Логин <b>'.$_POST['login'].'</b> уже используется.');

$Row = mysqli_fetch_assoc(mysqli_query($connect, "SELECT `email` FROM `users` WHERE `email` = '$_POST[email]'"));
if($Row['email']) exit('Email <b>'.$_POST['email'].'</b> уже используется.');

mysqli_query($connect, "INSERT INTO `users` (`login`, `password`, `name`, `regdate`, `email`, `avatar`, `country`) VALUES ('$_POST[login]', '$_POST[password]', '$_POST[name]', NOW(), '$_POST[email]', 0, 0)");




$Code = substr(base64_encode($_POST['email']), 0, -1);
mail($_POST['email'], 'Регистрация на Web-platform', 'Ссылка для активации: http://forum/account/activate/code/'.substr($Code, -5) .substr($Code, 0, -5), 'From: Web-platform');
MessageSend(3, 'Регистрация аккаунта успешно завершена, на указанный email адрес <b>'.$_POST['email'].'</b> отправленно письмо о подтверждении регистрации.');
}





else if ($module == 'activate' and $param['code']){
if (!$_SESSION['USER_ACTIVE_EMAIL']){
$Email = base64_decode(substr($param['code'], 5).substr($param['code'], 0, 5));
    if(strpos($Email, '@') !== false){
mysqli_query($connect, "UPDATE `users` SET `active` = 1 WHERE `email` = '$Email'");
$_SESSION['USER_ACTIVE_EMAIL'] = $Email;
MessageSend(3, 'Email <b>'.$Email.'</b> подтвержден.', '/login');
}
else MessageSend(1, 'Email адрес не подтвержден.', '/login');
}
else MessageSend(1, 'Email адрес <b>'.$_SESSION['USER_ACTIVE_EMAIL'].'</b> уже подтвержден', '/login');

}
?>


<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <style>
        .messageBlock{
            text-align: center;
            border: 1px solid #3ed714;
            background-color: #3ed714;
            font-size: 20px;
            padding: 10px;
        }
    </style>
</head>
<body>

</body>
</html>

<?php
include_once 'setting.php';
session_start();
$connect = mysqli_connect(HOST, USER, PASS, DB);


if ($_SERVER['REQUEST_URI'] == '/'){
 $page = 'index';
 $module = 'index';
} else {
 $URL_Path = parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH);
 $URL_Parts = explode('/', trim($URL_Path, ' /'));
 $page = array_shift($URL_Parts);
 $module = array_shift($URL_Parts);

 if(!empty($module)){
    $param = array();
    for($i = 0; $i < count($URL_Parts); $i++){
    $param[$URL_Parts[$i]] = $URL_Parts[++$i];
}
}
}



if ($page === 'index') include('page/index.php');
else if ($page == 'login') include('page/login.php');
else if ($page == 'register') include('page/register.php');
else if ($page == 'account') include('form/account.php');


function MessageSend($p1, $p2, $p3 = ''){
    if($p1 == 1) $p1 = 'Ошибка';
    else if($p1 == 2) $p1 = 'Подсказка';
    else if($p1 == 3) $p1 = 'Информация';
        $_SESSION['message'] = '<div class="messageBlock"><b>'.$p1.'</b>: '.$p2.'</div>';
        if($p3) $_SERVER['HTTP_REFERER'] = $p3;
        exit(header('location: '.$_SERVER['HTTP_REFERER']));
    }
    
    
    function MessageShow(){
    if($_SESSION['message']) $Message = $_SESSION['message'];
    echo $Message;
    $_SESSION['message'] = array();
    }



function FormChars ($p1){
    return nl2br(htmlspecialchars(trim($p1), ENT_QUOTES), false);
}

function GenPass($p1, $p2){
 return md5('qweasd'.md5('321'.$p1.'123').md5('958'.$p2.'534'));
}






function style(){
echo '* {padding: 0;margin: 0;box-sizing: border-box;}header {display: flex;justify-content: space-between;align-items: center;height: 53px;border-bottom: 1px solid #7C7B7B;}.header-content {display: flex;align-items: center;}.header-content a {margin-right: 20px;font-family: Inter, sans-serif;}.header-name{font-size: 32px;text-decoration: none;color: #333366;font-weight: bold;margin-left: 90px;}.header-text{font-size: 24px;text-decoration: none;color: #0E235A;margin: 0 0 0 120px;}.header-text:hover{color: #ff0000;}.registration {display: flex;align-items: center;}.log-in{padding: 0 10px;color: #000000;text-decoration: none;font-size: 24px;font-family: Inter, sans-serif;margin: 0 20px;}.registration button{border-radius: 0px;border: 0px;width: 94px;height: 36px;font-size: 24px;color: #ffffff;background-color: #000000;margin-right: 90px;font-family: Inter, sans-serif;text-decoration: none;}.button-registration{color: white;text-decoration: none;}.registration button:active{transition: 0.1s;transform: scale(0.8);}.registration button:hover{background-color: rgb(48, 48, 48);color: #ffffff;}';
}
    

?>


<?php
if ($_POST['enter']){
    echo 'Запрос на логин...';
    exit;
}
?>

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Регистрация</title>


    <style>
        <?php style() ?>

.form-block {
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  height: 70vh;
  
}

form {
    border: 1px solid black;
    padding: 30px;
    border-radius: 10px;
    width: 17%;
    height: 75%;
    box-shadow: 8px 8px 8px 0 rgba(0,0,0,0.2); 
}


input{
    width: 100%;
    box-sizing: border-box;
    height: 40px;
    border-radius: 10px;
    border: 1px solid #979797;
    
}


.form-group {
  margin-bottom: 15px;
}

label {
  display: block;
  margin-bottom: 5px;
  font-size: 20px;
  
}

.button-reg{
    border: none;
    border-radius: 20px;
    background-color: #4848EB;
    font-size: 20px;
    font-family: Inter, sans-serif;
    font-weight: bold;
    color: #fff;
}

.pass-text{
    margin: 5px 0 ;
    font-size: 10px;
    color: #737373;
    font-family: Montserrat, sans-serif;
    font-weight: light;
}
    </style>

</head>
<body>
<header>
    <div class="header-content">
        <a href="" class="header-name">Web-platform</a>
        <a href="" class="header-text">guides</a>
        <a href="" class="header-text">create</a>
        <a href="/" class="header-text">forum</a>
    </div>
    <div class="registration">
        <a href="/login" class="log-in">log in</a>
        <a href="/register"><button class="">sign up</button></a>
    </div>
</header>
<?php MessageShow() ?>
<div class="form-block">

    <form action="/account/register" method="POST">
        <div class="input-width">
        <div class="form-group">
            <label for="name">Имя</label>
            <input type="text" id="name" name="name" maxlength="50" pattern="[А-Яа-яЁё]{2,50}" title="не менее 2 и не более 50 символов" required>
        </div>
        <div class="form-group">
            <label for="login">Логин</label>
            <input type="text" id="login" name="login" maxlength="20" pattern="[A-Za-z0-9]{3,20}" title="не менее 3 и не более 20 латынских символов или цифр" required>
        </div>
        <div class="form-group">
            <label for="email">Email</label>
            <input type="email" id="email" name="email" required>
        </div>
        <div class="form-group">
            <label for="password">Пароль</label>
            <input type="password" id="password" name="password" maxlength="25" pattern="[A-Za-z0-9]{8,25}" title="не менее 8 и не более 25 латынских символов или цифр" required>
            <p class="pass-text">Пароли должны содержать не менее восьми символов, включая как минимум 1 букву и 1 цифру.</p>
        </div>
        <br>
        <input type="submit" name="enter" value="Зарегистрироваться" class="button-reg">
        
        
    </form>
    </div>
</div>


</body>
</html>


У меня есть система регистрации через PHP, где пользователи могут зарегистрироваться и получить электронное письмо для активации учётной записи. Однако у меня возникает проблема: последний символ электронной почты обрезается, что приводит к ошибке при подтверждении адреса электронной почты.
  • Вопрос задан
  • 214 просмотров
Пригласить эксперта
Ответы на вопрос 1
olondar
@olondar
Во первых в алфавите base64 присутствуют символы "+" и "/" которые поломают вам строку url, их надо исключить, а при подтверждении почты вернуть обратно.

Во вторых строка base64 должна быть кратна 4. Если не хватает символов в конец строки добавляются знаки "=". Чтобы не тащить их в url, можно их обрезать, а в последствии добавить.

//$Code = substr(base64_encode($_POST['email']), 0, -1);

    $code = rtrim(strtr(base64_encode($_POST['email']), '+/', '-_'), '=');

    $codeUrl = substr($code, -5) . substr($code, 0, -5);

    $url =  "http://forum/account/activate/code/" . $codeUrl;


//$Email = base64_decode(substr($param['code'], 5).substr($param['code'], 0, 5));

    $unCodes = substr($param['code'], 5) . substr($param['code'], 0, 5);

    $email = base64_decode(str_pad(strtr($unCodes, '-_', '+/'), strlen($unCodes) % 4, '='));
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы