PHP在激活电子邮件地址后设置用户密码



>我正在尝试实现此流程:

  1. 用户使用电子邮件地址注册
  2. 用户收到带有验证链接的电子邮件
  3. 用户点击指向要求设置密码的页面的链接
  4. 用户设置密码

这是我到目前为止的代码:

$email = $_GET['email'];
$verification_code = $_GET['verification_code'];
$validation_message = "";
$self = htmlspecialchars($_SERVER["PHP_SELF"]);
if(isset($_POST['submit'])) {
    if ($_POST['password'] == "") {
        $validation_message = "Please enter a password";
        echo "<form id='verify-email-form' action='$self' method='post'><h1 id='set-password-input' class='h1-splash h1-password'>Choose a password</h1><input type='hidden' name='email' value='$email'><input type='hidden' name='verification_code' value='$verification_code'><input type='password' name='password' class='text-input' placeholder='Password'><button type='submit' name='submit' id='submit-input-splash'>Go!</button></form><p id='validation-message'>$validation_message</p>";
    }
    else {
        echo $_POST['email'];
        echo $_POST['password'];
    }
}
else {
    require 'connect.php';
    $sql = "SELECT * FROM users WHERE email='$email' AND verification_code='$verification_code' AND active='0'";
    $result = $con->query($sql);
    if ($result->num_rows > 0) {
        echo "<form id='verify-email-form' action='$self' method='post'><h1 id='set-password-input' class='h1-splash h1-password'>Choose a password</h1><input type='hidden' name='email' value='$email'><input type='password' name='password' class='text-input' placeholder='Password'><button type='submit' name='submit' id='submit-input-splash'>Go!</button></form><p id='validation-message'>$validation_message</p>";
    }
    else {
        echo "Invalid activation code.";
    }
}
?>

网址采用以下格式:www.example.com/activate.php?email=name@example.com+verification_code=1234567890

我偶然发现用户按下提交而不在密码字段中输入任何内容。它会将页面重新加载到activate.php但 URL 中没有变量,因此如果用户随后键入密码,则无法提交电子邮件地址。

是否有解决方法,或者更好的结构化方法?

您正在将这些变量作为 POST 发送并尝试将它们读取为 GET: $_GET['verification_code'];

只需将表单方法更改为 GET 或将变量读取为 POST。