2012-04-10 222 views
29

我剛剛創建完整的登錄並在PHP中註冊了systsem,但是我的問題是我還沒有使用過任何會話。我在PHP中是一個新手,我以前從未使用過會話。我想要做的是,在用戶註冊並填寫登錄表單後,他們仍然保持在同一頁面上。因此,如果會話是logged_in,其他部分將會是其他部分(用戶未登錄,因此顯示登錄表單),將會有一部分會話。任何人都可以告訴我如何開始?在PHP登錄腳本中使用會話和會話變量

+2

「如果你能想象回答您的問題一整本書,你問太多。 「 - [StackOverflow常見問題](http://stackoverflow.com/faq) 爲了澄清,您的問題太寬泛。 – orourkek 2012-04-10 23:30:59

+0

以前沒有發生過。看看[php.net的會話文檔](http://www.php.net/manual/en/book.session.php),這是一個很好的開始:] – orourkek 2012-04-10 23:37:44

+0

也看看這個http:// www。 phpro.org/tutorials/Introduction-To-PHP-Sessions.html – 2012-04-10 23:40:09

回答

65

希望這有助於:)

開始的會議,你需要在頁面頂部的說,這還是你打的會話代碼之前

session_start(); 

把用戶ID在會話跟蹤誰是登錄

$_SESSION['user'] = $user_id; 

檢查是否有人在

if (isset($_SESSION['user'])) { 
    // logged in 
} else { 
    // not logged in 
} 
登錄

查找登錄的用戶ID

$_SESSION['user'] 

所以你的頁面上

<?php 
session_start(); 


if (isset($_SESSION['user'])) { 
?> 
    logged in HTML and code here 
<?php 

} else { 
    ?> 
    Not logged in HTML and code here 
    <?php 
} 
+1

好的,簡單的,可讀的代碼。剛剛完美 – IchHabsDrauf 2017-03-04 11:27:50

8

首先,PHP文件對sessions一些excellent information。其次,您需要一些方法來存儲您網站的每個用戶(例如數據庫)的憑證。不要將密碼存儲爲可讀,未加密的純文本。存儲密碼時,您應該使用PHP的crypt()哈希函數。這意味着如果任何憑證被泄露,密碼不是隨時可用。

大多數登錄系統會散列/加密用戶輸入的密碼,然後將結果與相應用戶名的存儲系統(例如數據庫)中的散列進行比較。如果輸入密碼的散列與存儲的散列匹配,則用戶輸入了正確的密碼。

您可以使用會話變量來存儲有關用戶當前狀態的信息 - 即他們是否已登錄,如果他們是您還可以存儲他們唯一的用戶ID或您需要的任何其他信息。

要啓動PHP會話,您需要致電session_start()。同樣,要摧毀一個會話,它的數據,你需要調用session_destroy()(例如,當用戶註銷):

// Begin the session 
session_start(); 

// Use session variables 
$_SESSION['userid'] = $userid; 

// E.g. find if the user is logged in 
if($_SESSION['userid']) { 
    // Logged in 
} 
else { 
    // Not logged in 
} 

// Destroy the session 
if($log_out) 
    session_destroy(); 

我也建議你看看this。在那裏創建一個簡單的登錄系統有一些很好的,容易遵循的信息。

+0

PHP 5.5引入了[密碼散列函數](http://php.net/manual/en/ref.password.php)(帶有5.3.7兼容性代碼),應該用於密碼散列生成和驗證。這些函數消除了某些程序員在使用'crypt()'或其他PHP通用散列函數時可能產生的安全弱化錯誤。有關爲什麼要使用password_hash()而不是crypt()的詳細信息,請參閱[rfc:password_hash](https://wiki.php.net/rfc/password_hash) – 2015-05-14 20:25:30

+0

答案底部的鏈接(this)已損壞現在。你能爲這個資源提供永久鏈接嗎? – dmcgill50 2016-01-08 16:10:03

4

我總是做OOP並使用這個類來維護會話,所以你可以使用函數is_logged_in來檢查用戶是否登錄,如果沒有,你做你想做的事。

<?php 
class Session 
{ 
private $logged_in=false; 
public $user_id; 

function __construct() { 
    session_start(); 
    $this->check_login(); 
if($this->logged_in) { 
    // actions to take right away if user is logged in 
} else { 
    // actions to take right away if user is not logged in 
} 
} 

public function is_logged_in() { 
    return $this->logged_in; 
} 

public function login($user) { 
// database should find user based on username/password 
if($user){ 
    $this->user_id = $_SESSION['user_id'] = $user->id; 
    $this->logged_in = true; 
    } 
} 

public function logout() { 
unset($_SESSION['user_id']); 
unset($this->user_id); 
$this->logged_in = false; 
} 

private function check_login() { 
if(isset($_SESSION['user_id'])) { 
    $this->user_id = $_SESSION['user_id']; 
    $this->logged_in = true; 
} else { 
    unset($this->user_id); 
    $this->logged_in = false; 
} 
} 

} 

$session = new Session(); 
?> 
+1

謝謝,它是一個很好的開始,但應該擴展你的課堂用戶認證與電子郵件;) – 2017-03-23 13:10:15

17

這裏是使用php的最簡單的會話代碼。 我們正在使用3個文件。

的login.php

<?php session_start(); ?> // session starts with the help of this function 

<?php 

if(isset($_SESSION['use'])) // Checking whether the session is already there or not if 
           // true then header redirect it to the home page directly 
{ 
    header("Location:home.php"); 
} 

if(isset($_POST['login'])) // it checks whether the user clicked login button or not 
{ 
    $user = $_POST['user']; 
    $pass = $_POST['pass']; 

     if($user == "Ank" && $pass == "1234") // username is set to "Ank" and Password 
     {         // is 1234 by default  

      $_SESSION['use']=$user; 


     echo '<script type="text/javascript"> window.open("home.php","_self");</script>';   // On Successful Login redirects to home.php 

     } 

     else 
     { 
      echo "invalid UserName or Password";   
     } 
} 
?> 
<html> 
<head> 

<title> Login Page </title> 

</head> 

<body> 

<form action="" method="post"> 

    <table width="200" border="0"> 
    <tr> 
    <td> UserName</td> 
    <td> <input type="text" name="user" > </td> 
    </tr> 
    <tr> 
    <td> PassWord </td> 
    <td><input type="password" name="pass"></td> 
    </tr> 
    <tr> 
    <td> <input type="submit" name="login" value="LOGIN"></td> 
    <td></td> 
    </tr> 
</table> 
</form> 

</body> 
</html> 

home.php

<?php session_start(); ?> 

<html> 
    <head> 
     <title> Home </title> 
    </head> 
    <body> 
<?php 
     if(!isset($_SESSION['use'])) // If session is not set then redirect to Login Page 
     { 
      header("Location:Login.php"); 
     } 

      echo $_SESSION['use']; 

      echo "Login Success"; 

      echo "<a href='logout.php'> Logout</a> "; 
?> 
</body> 
</html> 

logout.php

<?php 
session_start(); 

    echo "Logout Successfully "; 
    session_destroy(); // function that Destroys Session 
    header("Location: Login.php"); 
?> 
0
//start use session 

$session_start(); 

extract($_POST);   
//extract data from submit post 

if(isset($submit)) 
{ 

if($user=="user" && $pass=="pass") 

{ 

$_SESSION['user']= $user; 

//if correct password and name store in session 

} 
else { 

echo "Invalid user and password"; 

header("Locatin:form.php"); 

} 

if(isset($_SESSION['user'])) 

{ 

//your home page code here 

exit; 
} 
+0

順便說一句,你想散列和鹽密碼就此。然後對輸入進行散列和加鹽以進行比較。 – 2016-12-17 06:07:03

0

你需要在頁面的頂部開始會話,或者你之前呼叫會話代碼

session_start(); 
-2
$session_start(); 

extract($_POST);   
//extract data from submit post 

if(isset($submit)) 
{ 

if($user=="user" && $pass=="pass") 

{ 

$_SESSION['user']= $user; 

//if correct password and name store in session 

} 
else { 

echo "Invalid user and password"; 

header("Locatin:form.php"); 

} 

if(isset($_SESSION['user'])) 

{ 

//your home page code here 

exit; 
}