php - 如何让用户注册后自动登录

标签 php mysql mysqli

我是 PHP 的新手。我想向我的网站添加自动登录部分,以便用户在我的网站上创建帐户后自动登录。有人可以告诉我如何在用户注册后自动登录吗?我不知道应该从哪里开始。我感谢您能给我的所有帮助。太感谢了! :)

这是我的 register.php 脚本:

<?php
 ob_start();
 session_start();
 if( isset($_SESSION['user'])!="" ){
  header("Location: /");
 }
 include_once 'dbconnect.php';

 $error = false;

 if ( isset($_POST['btn-signup']) ) {

  $name = trim($_POST['name']);
  $name = strip_tags($name);
  $name = htmlspecialchars($name);

  $email = trim($_POST['email']);
  $email = strip_tags($email);
  $email = htmlspecialchars($email);

  $pass = trim($_POST['pass']);
  $pass = strip_tags($pass);
  $pass = htmlspecialchars($pass);

  $company = trim($_POST['company']);
  $pcompany = strip_tags($company);
  $company = htmlspecialchars($company);

  if (empty($name)) {
   $error = true;
   $nameError = "Please enter your full name.";
  } else if (strlen($name) < 3) {
   $error = true;
   $nameError = "Name must have atleat 3 characters.";
  } else if (!preg_match("/^[a-zA-Z ]+$/",$name)) {
   $error = true;
   $nameError = "Name must contain alphabets and space.";
  }

  if ( !filter_var($email,FILTER_VALIDATE_EMAIL) ) {
   $error = true;
   $emailError = "Please enter valid email address.";
  } else {
   $query = "SELECT userEmail FROM users WHERE userEmail='$email'";
   $result = mysqli_query($conn,$query);
   $count = mysqli_num_rows($result);
   if($count!=0){
    $error = true;
    $emailError = "Provided Email is already in use.";
   }
  }
  if (empty($pass)){
   $error = true;
   $passError = "Please enter password.";
  } else if(strlen($pass) < 6) {
   $error = true;
   $passError = "Password must have atleast 6 characters.";
  }

  $password = hash('sha256', $pass);

  if( !$error ) {

   $query = "INSERT INTO users(userName,userEmail,userPass,userCompany) VALUES('$name','$email','$password','$company')";
   $res = mysqli_query($conn,$query);

   if ($res) {
    $errTyp = "success";
    $errMSG = "Successfully registered, you may login now";
    unset($name);
    unset($email);
    unset($pass);
    unset($company);
   } else {
    $errTyp = "danger";
    $errMSG = "Something went wrong, try again later..."; 
   } 

  }


 }

 //include your login validation
if(empty($errors)){
   //User->login(); or anything you use for validating logins
}

?>
<!DOCTYPE html>
<html>

<head>
    <meta charset="UTF-8">
    <meta content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no" name="viewport">
    <title>Register | Hexa</title>
    <link rel="icon" href="https://app.myhexa.co/favicon.ico" type="image/x-icon">
    <link href="https://fonts.googleapis.com/css?family=Roboto:400,700&subset=latin,cyrillic-ext" rel="stylesheet" type="text/css">
    <link href="https://fonts.googleapis.com/icon?family=Material+Icons" rel="stylesheet" type="text/css">
    <link href="plugins/bootstrap/css/bootstrap.css" rel="stylesheet">
    <link href="plugins/node-waves/waves.css" rel="stylesheet" />
    <link href="plugins/animate-css/animate.css" rel="stylesheet" />
    <link href="css/login.css" rel="stylesheet">
</head>

<body class="signup-page bg-blue-grey">
    <div class="signup-box">
        <div class="logo">
            <center><img src="img/logo.png" height="50" width="155"></center>
        </div>
        <div class="card">
            <div class="body"> 
                <form id="sign_up" method="POST">
                <div class="msg"><h3 class="col-blue-grey">CREATE ACCOUNT</h3></div><br>

                                <?php
   if ( isset($errMSG) ) {

    ?>
    <span class="fa fa-exclamation-triangle"></span> <?php echo $errMSG; ?>
                </div>
             </div>
                <?php
   }
   ?>



                    <div class="input-group">

                        <span class="input-group-addon">

                            <i class="material-icons">person</i>
                        </span>
                        <div class="form-line">
                            <input type="text" name="name" class="form-control"  placeholder="Name" maxlength="50" value="<?php echo $name ?>" /">
                        </div>
                    </div>
                                                                   <span class="text-danger"><?php echo $nameError; ?></span><br>

                    <div class="input-group">

                        <span class="input-group-addon">
                            <i class="material-icons">email</i>
                        </span>
                        <div class="form-line">
                            <input type="email" name="email" class="form-control"  placeholder="Email Address" maxlength="40" value="<?php echo $email ?>" />
                        </div>
                    </div>
                                                                   <span class="text-danger"><?php echo $emailError; ?></span><br>

                        <div class="input-group">
                        <span class="input-group-addon">
                            <i class="material-icons">people</i>
                        </span>
                        <div class="form-line">
                            <input type="text" name="company" class="form-control"  placeholder="Company" value="<?php echo $company ?>" />
                        </div>
                    </div><br>
                    <div class="input-group">
                        <span class="input-group-addon">
                            <i class="material-icons">lock</i>
                        </span>
                        <div class="form-line">
                            <input type="password" name="password" class="form-control" placeholder="Password"  maxlength="15" id="password" required>
                        </div>
                    </div>
                                                                   <span class="text-danger"><?php echo $passError; ?></span><br>

                    <div class="input-group">
                        <span class="input-group-addon">
                            <i class="material-icons">lock</i>
                        </span>
                        <div class="form-line">
        <input type="password" name="pass" class="form-control" placeholder="Confirm Password" maxlength="15" id="confirm_password" required>
                        </div>
                    </div>
                    <div class="form-group">
                        <input type="checkbox" name="terms" id="terms" class="filled-in chk-col-deep-orange">
                        <label for="terms">I read and agree to the <a href="javascript:void(0);">terms of usage</a>.</label>
                    </div>

                    <button type="submit" class="btn btn-block btn-lg bg-deep-orange waves-effect" name="btn-signup">REGISTER</button>

                    <div class="m-t-25 m-b--5 align-center">
                        <a href="login">Have An Account?</a>
                    </div>
                </form>
            </div>
        </div>
    </div>
    <script src="plugins/jquery/jquery.min.js"></script>
    <script src="plugins/bootstrap/js/bootstrap.js"></script>
    <script src="plugins/node-waves/waves.js"></script>
    <script src="plugins/jquery-validation/jquery.validate.js"></script>
    <script src="plugins/js/admin.js"></script>
    <script>var password = document.getElementById("password")
  , confirm_password = document.getElementById("confirm_password");

function validatePassword(){
  if(password.value != confirm_password.value) {
    confirm_password.setCustomValidity("Passwords Don't Match");
  } else {
    confirm_password.setCustomValidity('');
  }
}

password.onchange = validatePassword;
confirm_password.onkeyup = validatePassword;
</script>
</body>

</html>

<?php ob_end_flush(); ?> 

最佳答案

从您在评论中链接的 JSFiddle 中,您可以在成功登录后设置 session

$_SESSION['user'] = $row['userId'];

这意味着您需要将 $_SESSION['user'] session 设置为完成注册后最后插入的 ID,以实现您所要求的目的。您可以使用mysqli_insert_id()函数获取最后插入的ID。就这样了

if ($res) {
    $errTyp = "success";
    $errMSG = "Successfully registered, you may login now";
    $_SESSION['user'] = mysqli_insert_id($conn); // Sets the session and logs the user in instantly
}

其他信息

  • 您已经在使用支持带有有界变量输入的准备好的语句的 API,您应该利用带有占位符的参数化查询(准备好的语句)来保护您的数据库免受 SQL-injection 的侵害。 ! 开始使用 mysqli::prepare()mysqli_stmt::bind_param() .

  • 您还应该使用 PHP password_* 函数来散列和验证密码,而不是使用 sha512。

  • 此外,您还有 if( isset($_SESSION['user'])!=""){ - 它将 bool 值与空字符串进行比较。应该改为 if (isset($_SESSION['user'])) {

  • exit; 应添加在每个 header("Location: .."); 调用之后,以防止脚本进一步执行。

  • 最后,htmlspecialchars() 等函数用于输出,而不是输入。这些与“转义”或清理数据无关,但用于确保从数据库输出数据时 HTML 有效(进而防止 XSS 攻击)。 密码根本不应该更改 - 只需对它们进行散列 - 因为如果您在散列之前/之后对其使用其他函数,则散列可能会有所不同。

  • strip_tags() 可能适用于其他变量,但我认为它不适合这里(取决于,您应该了解该函数的作用,请阅读 上的手册>strip_tags())。

引用文献

关于php - 如何让用户注册后自动登录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46269072/

相关文章:

mysql - 我应该为用户信息(如出生日期、姓名等)创建 2 个表 : first for usernames and passwords, 和其他表吗?

mysql - 是否可以将 mysql TIMESTAMP 与毫秒进行比较?

mysql - 聊天系统的数据库设计

php - 数据库php类导致 fatal error

php - 从数据库回显数据时使用 PHP 变量

php - 在带有类私有(private)函数的 php 中使用 usort

javascript - 在 php 中从网站 Facebook 共享

javascript - codeigniter ajax 表单验证与提交

php - 如何在MYSQLI中获取ofbject

PHP/MySQL : The right way creating a big website database based