基于PHP会话的登录系统出现问题

时间:2012-02-23 12:18:05

标签: php html session

所以我试图让一个简单的基于会话的登录工作,我的会话根本没有保存。我尝试了很多东西,但没有任何作用!请帮忙!

编辑:添加了start_session,但它仍然是空的

<?php 
 session_start();
 ?>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">

...

$row = mysql_fetch_row($sql_result);

                            $_SESSION['id']= $row[0];
                            $_SESSION['uname'] = $row[1];
                            $_SESSION['pass'] = $row[2];
                            session_write_close(); <-- now removed, but the session is still empty


                            echo  $row[1] . "Login accepted.<br />";

这是创建会话的代码。考虑了所有行,并且正在调用代码,但会话仍然是空的。

if(empty($_SESSION['uname'])) echo 'empty session';

另外,要注意firebug说会话存储中存储了0个对象。

4 个答案:

答案 0 :(得分:2)

删除session_write_close()

session_write_close()结束会话:

  

结束当前会话并存储会话数据。

$_SESSION的任何后续调用都不会返回任何数据,因为会话已被写入然后关闭。

通常,在执行session_write_close()重定向之前,您不会致电header('Location: http://example.org')。由于您的代码中不是这种情况,因此应将其删除。

确保您正在呼叫session_start()

我假设您在所有脚本的顶部调用session_start()

测试您的会话

要测试您的会话是否正常工作,我建议您实施以下测试脚本:

<?php
session_start();
$_SESSION['test'] = 'Hello';
echo $_SESSION['test'] . ' World!';
// you should get: Hello World!

通过这种方式,您知道会话数组中肯定存在某些内容。在您的示例代码中,您将从数据库中获取数据,这可能会返回空值。

PHP会话和HTML5会话存储混淆

它们不是同一个东西。 PHP的会话存储在服务器上,而浏览器在浏览器中本地存储HTML5会话存储。 HTML5会话存储是仅持续该会话的客户端信息存储。有关详细信息,请参阅w3c specification

PHP的$_SESSION不会被存储或影响HTML5会话存储中的数据。

答案 1 :(得分:1)

来自http://php.net/manual/en/function.session-write-close.php

  

结束当前会话并存储会话数据。

     

会话数据通常在脚本终止后存储   需要调用session_write_close()[...]

您过早关闭会话并存储数据,这显然不允许您为if内的调用保留数据。

您也忘记致电session_start()(或将其包含在您发布的代码中)。

答案 2 :(得分:0)

在开始在PHP会话中存储用户信息之前,必须先启动会话。当您启动会话时,它必须位于代码的最开头,在发送任何HTML或文本之前。

e.g。

<?php
session_start(); // start up your PHP session! 
?>

这段微小的代码将注册用户与服务器的会话,允许您开始保存用户信息并为该用户的会话分配UID(唯一标识号)。

答案 3 :(得分:0)

好的,我明白了。显然,我必须在任何使用会话信息的页面顶部调用start_session(),而不仅仅是创建会话的页面。谢谢大家的帮助。