2012-04-10 186 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; 
}