2017-06-09 36 views
0

我遇到了一些來自我老闆的請求。PHP註冊後自動登錄

我使用他的使用創造了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; 
} 

我做回聲$電子郵件; 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搜索,似乎無法看到我的問題的答案。

我看着餅乾,但我不認爲這是我真的需要在這裏。

我的問題是:

我怎樣才能讓這個壞小子開始註冊會議?

我的想法是調用AutoLogin(& $ formvars)是否是正確的想法?

我的AutoLogin函數語法出錯了嗎?

萬一這裏是GetLoginSessionVar():

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

這是我不能連接我的工作文件可惜,但如果你需要任何進一步的代碼片段讓我知道,我一定會馬上編輯它!

+0

首先,您必須最小化代碼並從理論上描述問題。如果需要,稍後發佈代碼。 –

+0

我並不是想在這裏聽起來很刺耳,但我不會再浪費時間了。這些代碼在現場環境中完全不安全。首先是'mysql_' api,然後是MD5。使用預準備的語句和'password_hash()'。 –

+0

@YashParekh嗯,每次我看到這個網站的問題,我看到每個人都抱怨說他們沒有加入代碼。我試圖儘可能地徹底。 – PowerCat

回答

1

但是「會話」(我認爲)沒有啓動或檢查登錄不是 獲取數據。 我的想法是調用AutoLogin(& $ formvars)是否是正確的想法? 我使用AutoLogin函數語法出錯了嗎?

語法沒有問題,否則代碼甚至不會被編譯。不過,我認爲這不是正確的想法。

在嘗試修復問題之前,您需要了解問題所在。 調試代碼。使用xdebug。如果它已安裝且處於活動狀態,則可以使用IDE(例如:Visual Studio Code)輕鬆調試代碼。在懷疑有問題的地方添加斷點。

如果你不想使用xdebug,你可以添加暫時的回聲或var_dumps來檢查代碼的某些區域是否被處理,並檢查一些相關的值。

還啓用所有錯誤報告並使用記錄器。 如果會話在任何輸出後啓動,則應該發出警告。 處理錯誤並拋出異常。

你不需要在AutoLogin(&$formvars)使用&,如果你不改變參數$ 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來保存用戶標識(或電子郵件)並讀取它以檢索用戶數據。

+0

管理全部調試,設法看到一個頁面正在接收所有數據,但數據未被使用。 但我們想出了一種方法來解決它,通過調用另一個頁面來運行該功能。 感謝您的回答! – PowerCat