簡體   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