我正确使用会话吗?

时间:2016-07-24 08:07:50

标签: php session

我正确使用会话吗?或者这样做很糟糕?有没有更好的方法来使用会话来保护Web应用程序

这是我的PHP代码

$conn = new PDO("mysql:host=$host;dbname=$dbname",$username, $password, array(PDO::ATTR_ERRMODE => PDO::ERRMODE_WARNING));
    $stmt = $conn->prepare("CALL sp_login(?,?)");
    $stmt->bindParam(1, $_username, PDO::PARAM_STR, 30); 
    $stmt->bindParam(2, $_password, PDO::PARAM_STR, 30);
    $stmt->execute();
    $row = $stmt->fetch(PDO::FETCH_ASSOC);
    if($row){
        $_SESSION['Login_username'] = $_username;
        header("location: index.php");
        exit;
    }

这是检查会话的代码

if(isset($_SESSION['Login_username'])) {

    return true;
}
else{
    header("location: login.php");
        exit;
}

我已经在某个地方读到了保存数据库会话的好主意。

我要将它保存到数据库中。我怎么会这样做? 成功登录后,我想将会话插入数据库吗?

我将如何在数据库中使用已保存的会话?

有人说它有更好的this方式,有些人说它更好that方式。而现在我很困惑。

3 个答案:

答案 0 :(得分:1)

PHP将会话保存到文件中,您可以使用session-save-path函数(或该页面上提到的设置)找到该目录。

您正在使用会话,因为您在使用session_start()之前始终致电$_SESSION

只需将$_SESSION视为普通数组,即PHP为每个用户自动填充。实际上可以应用任何内容,例如unsetisset ...

也可以将会话保存到数据库中,因为许多框架都提供了这样的功能。他们中的一些人推出了自己的实现只是为了更好地处理它,但有些人正在使用默认的PHP提供程序。

正如Jay C的回答所提到的,当你有一个在多个节点上运行的分布式应用程序时,你将会话保存到数据库中。虽然这也可以使用共享文件系统来处理(只是在所有节点上共享所提到的路径)。

无论如何,要了解如何实现自己的会话处理程序,请参阅PHP documentations

要查找php提供的默认处理程序,请查找"已注册的存储处理程序"在phpinfo()的输出中。

如果您只是听到将数据库保存到数据库中是一个更好的主意,那么您可能不需要它。相信我,将会话保存到数据库中会引发许多在使用文件系统时不会遇到的问题。数据库在负载下处理起来很棘手,在数据库中使用会话可以轻松地将数据库置于负载之下。除非你完全确定你想要它,否则不要这样做。

答案 1 :(得分:0)

如果您有多个服务器和跨服务器登录脚本或类似的东西,那么您需要在数据库中存储会话的唯一原因。

答案 2 :(得分:-2)

您一次问过太多不同的问题。

我是否正确使用会话?是。

这样做是不是很糟糕?没有。

有没有更好的方法来使用会话来保护网络应用程序?并非真的。

我要将它保存到数据库中。我怎么会这样做?但是你想要。

成功登录后,我想将会话插入数据库吗?否。

我将如何在数据库中使用已保存的会话?您可以使用$ _SESSION和session_start()完全按照您的方式使用它。

如果要在数据库中存储会话,请查看" session_set_save_handler"和" SessionHandlerInterface"在PHP文档中。这些规定了PHP如何加载和保存会话数据,它们与$ _SESSION var的使用方式无关 - 无论会话数据的存储方式和位置如何,这都是相同的。