[英]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.