繁体   English   中英

注册后自动登录PHP

[英]PHP Auto Login after Registration

我上司的要求有一些问题。

我正在使用他创建供使用的http://www.html-form-guide.com/注册表(我附上了链接,以防万一有人想使用或查看它)

因此,我对PHP相当陌生,但是我已经获得了很多疯狂的知识。

这是我的问题-我需要制作此表单,而不是自动登录 (此表单具有电子邮件确认系统)

因此,我设法绕过了电子邮件确认并让用户注册,但似乎无法弄清楚如何获得自动登录。

这是我在代码中跟踪到的内容:

    function RegisterUser()
{
    if(!isset($_POST['submitted']))
    {
       return false;
    }

    $formvars = array();

    if(!$this->ValidateRegistrationSubmission())
    {
        return false;
    }

    $this->CollectRegistrationSubmission($formvars);

    if(!$this->SaveToDatabase($formvars))
    {
        return false;
    }

    /*if(!$this->SendUserConfirmationEmail($formvars))
    {
        return false;
    }*/

    $this->SendAdminIntimationEmail($formvars);

    $this->AutoLogin($formvars);// My call

    return true;
}

这将输入名称,电子邮件和密码 -将它们放入数组,然后将其发送以进行验证和卫生处理。 我在这里放置了一个调用函数。

之后,我需要手动登录:

function Login()
{
    if(empty($_POST['email']))
    {
        $this->HandleError("Email is empty!");
        return false;
    }

    if(empty($_POST['password']))
    {
        $this->HandleError("Password is empty!");
        return false;
    }

    $email = trim($_POST['email']);
    $password = trim($_POST['password']);

    if(!isset($_SESSION)){ session_start(); }
    if(!$this->CheckLoginInDB($email,$password))
    {
        return false;
    }

    $_SESSION[$this->GetLoginSessionVar()] = $email;

    return true;
}

因此,我完成了登录功能的最后一部分,并做了:

    function AutoLogin(&$formvars)
{
    $email = trim($formvars['email']);
    $password = trim($formvars['password']);

    if(!isset($_SESSION)){ session_start(); }       
    if(!$this->CheckLoginInDB($email,$password))
    {
        return false;
    }

    $_SESSION[$this->GetLoginSessionVar()] = $email;

    return true;
}

我做了回声$ email; echo $ password; 出口; 测试,我可以看到出现了电子邮件和密码。 但是“会话”(我认为)没有启动,或者“ 检查登录名”没有获取数据。

    function CheckLogin()
{
     if(!isset($_SESSION)){ session_start(); }

     $sessionvar = $this->GetLoginSessionVar();

     if(empty($_SESSION[$sessionvar]))
     {
        return false;
     }
     return true;
}

现在我看到的是一个CheckLoginInDB,它是:

    function CheckLoginInDB($email,$password)
{
    if(!$this->DBLogin())
    {
        $this->HandleError("Database login failed!");
        return false;
    }          
    $email = $this->SanitizeForSQL($email);
    $pwdmd5 = md5($password);
    $qry = "Select name, email, pagecode, welcome from $this->tablename where email='$email' and password='$pwdmd5' and confirmcode='y'";

    $result = mysql_query($qry,$this->connection);

    if(!$result || mysql_num_rows($result) <= 0)
    {
        $this->HandleError("Error logging in. The email or password does not match");
        return false;
    }

    $row = mysql_fetch_assoc($result);

    $_SESSION['name_of_user']  = $row['name'];
    $_SESSION['email_of_user'] = $row['email'];
    $_SESSION['pagecode_of_user'] = $row['pagecode'];
    $_SESSION['welcome_user'] = $row['welcome'];

    return true;
}

我可以从中收集到的信息只是一个标准的检查数据库,以查看该用户是否存在并返回结果。

我正在搜索stackoverflow,但似乎看不到我的问题的答案。

我调查过Cookie,但我认为这不是我真正需要的。

我的问题是:

如何让这个坏男孩开始注册课程?

我是否想将AutoLogin(&$ formvars)称为正确的主意?

我使用此AutoLogin函数语法出错了吗?

以防万一,这里是GetLoginSessionVar():

    function GetLoginSessionVar()
{
    $retvar = md5($this->rand_key);
    $retvar = 'usr_'.substr($retvar,0,10);
    return $retvar;
}

很遗憾,我无法附加正在处理的文件,但是如果您需要其他代码段,请告诉我,我将立即对其进行编辑!

但是“会话”(我认为)没有启动,或者“检查登录名”没有获取数据。 我是否想将AutoLogin(&$ formvars)称为正确的主意? 我使用此AutoLogin函数语法出错了吗?

语法没什么问题,否则代码甚至不会被编译。 不过,我认为这不是正确的想法。

在尝试解决此问题之前,您需要先了解问题所在。 调试代码。 使用xdebug。 如果已安装并处于活动状态,则可以使用IDE(例如:Visual Studio Code)轻松调试代码。 在怀疑有问题的地方添加断点。

如果您不想使用xdebug,则可以临时添加回显或var_dumps,以检查是否处理了代码的某些区域并检查了一些相关的值。

同时启用所有错误报告并使用记录器。 如果会话在任何输出之后开始,则应该有一些警告。 处理错误并引发异常。

如果您不更改参数$ formvars(只需阅读它),则无需在AutoLogin(&$formvars)使用&。

您无需为所有用户数据设置会话变量。 使用这些函数之外的用户数据创建一些结构(类,数组等),然后进行更改。 AutoLogin应该更新该结构,如下所示:

<?php

if (!$_SESSION) {
    session_start();
}

$currentUser = array();

function getUserFromID($userID)
{
    //TODO implement function
    return $user;
}

function AutoLogin()
{
    global $currentUser;
    if(!empty($_SESSION['userID'])) {
        return false;
    }

    $user = getUserFromID($_SESSION['userID']);
    if (empty($user)) {
        return false;
    }
    $currentUser = $user;
    return true;
}

可能在调用CheckLoginInDB之前未初始化会话(使用var_dump($_SESSION);进行检查)。 仅使用$ _SESSION保存用户ID(或电子邮件)并读取它以检索用户数据。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM