2

我的网站上有一个使用 $_SESSION 变量的 PHP 身份验证系统。

表单将用户名和密码提交到文件“login.php”。它是这样处理的:

<?php include '../includes/sessionstart.inc.php'; ?>
<?php ob_start(); ?>

if($_POST){
    $q = mysql_query("SELECT id, company FROM users WHERE username = '".mysql_real_escape_string($_POST['username'])."' AND password = '".md5($_POST['password'])."'");
    if(mysql_num_rows($q) >= 1){
        $f = mysql_fetch_Array($q);
        $_SESSION['company'] = $f['company'];
        $_SESSION['id'] = $f['id'];
        $_SESSION['logedin'] = true;
        session_write_close();

        ob_clean();
        header("Location: index.php");

}

之后,加载 index.php 并检查 'logedin' 是否为真。

<?php include '../includes/sessionstart.inc.php'; ?>
<?php if(!isset($_SESSION['logedin'])) header('Location: login.php'); ?>

在我的生产服务器上,它继续,但在我的 Wampserver 上,它恢复到 login.php。我注意到 Wampserver 的页面加载速度非常慢,这可能与它有关。这就是我包含 session_write_close 的原因,以确保在切换页面之前保存会话数据,但这无济于事。

session_start.inc.php 的内容很简单:

<?php
    session_start();
?>

我曾经在那里有更多的代码,但目前仅此而已。在我开始使用包含文件之前,这个问题也存在。

有人知道我做错了什么吗?为什么 Wampserver 不将我的 SESSION 数据传输到下一个 PHP 文件?

4

7 回答 7

6

WAMP 服务器 2 - 默认情况下未为$_SESSIONvar 设置设置。

PHP.ini 需要以下设置

C:\wamp\bin\apache\apache2.4.2\bin\php.ini
session.cookie_domain =
session.use_cookies = 1
session.save_path = "c:\wamp\tmp"   ;ensure the \ is used not /

会话测试 ——load.php——加载变量$_SESSION

<?PHP
session_start();
$_SESSION['SESS_MEMBER_ID'] = 'stored variable';
session_write_close();
header("location:print.php");
?>

print.php -- 打印 $_SESSION 变量。

<?PHP
session_start();
var_dump($_SESSION);
?>

在浏览器中运行脚本var_dump()应该会产生结果

转到c:\wamp\tmp包含会话数据的文件将出现在此处。

于 2012-11-29T12:47:58.287 回答
2

首先:索引logedin对于跟踪正在登录的用户来说似乎很奇怪。这只是 SO 上的错字,还是真的是代码错字?

其次(取决于所需的行为),尝试另一种方法使页面受登录保护。您的页面应该类似于

<?php
  include 'login.inc.php';

  if(authorized()) {
    // put some more script here, if needed
    ?>
    // put some plain HTML here  
    <?php
  }
?>

在哪里login.inc.php处理会话,cookie。特别是,authorized如果客户端已经登录,该函数应该返回 TRUE。如果客户端没有登录,它应该显示一个带有操作的表单$_SERVER['PHP_SELF']并返回 FALSE。如果您将提交输入命名为login_submit,则可以让login.inc.php处理验证。

这样,您无需将用户引至专门的登录页面,并且在登录后,用户会直接看到所请求的页面。您可以稍微调整一下,以使查询字符串也可以通过登录持久化。

于 2010-01-28T09:44:17.013 回答
1

尝试更换

if($_POST){...}

if( isset($_POST['username']) && isset($_POST['password']) ){...}

...至少出于调试目的。某些不同的设置可能会导致一个非空的 $_POST 数组,它不是预期的。

此外,您的代码似乎在重定向exit()后缺少调用。header()发送 HTTP Location标头不会自动停止您的脚本。

于 2010-01-28T10:39:31.577 回答
1

我在 /localhost 上使用 WAMPSERVER 进行开发时遇到了这个问题。我需要session.use_only_cookies在线或在php.ini设置中更改

session.use_only_cookies = 1

session.use_only_cookies = 0

解释

使用默认的基于 cookie 的会话按预期工作,但我需要一个无 cookie 的解决方案。测试起始页:

<?php
// page1.php

ini_set('session.use_cookies', '0');
session_start();

$_SESSION['time'] = time();

echo '<br /><a href="page2.php?' . SID . '">page 2</a>';
?>

会话数据已成功创建并存储在 WAMPSERVER 临时目录中,例如C:\wamp\tmp\sess_0rkdlonl5uia717rf03d4svs16. 上述代码生成的链接类似于(注意 UID 与会话数据文件名匹配):

page2.php?PHPSESSID=0rkdlonl5uia717rf03d4svs16

但是目标 page2.php 在尝试检索会话数据时为变量“时间”抛出了未定义的错误:

<?php
// page2.php

ini_set('session.use_cookies', '0');
session_start();

echo date('Y m d H:i:s', $_SESSION['time']);

echo '<br /><a href="page1.php?' . SID . '">page 1</a>';
?>

session.use_only_cookies通过在之前的任一脚本中设置FALSE session_start();

ini_set('session.use_only_cookies', '0');

或在全球范围内更改它php.ini

; This option forces PHP to fetch and use a cookie for storing and maintaining
; the session id. We encourage this operation as it's very helpful in combatting
; session hijacking when not specifying and managing your own session id. It is
; not the end all be all of session hijacking defense, but it's a good start.
; http://php.net/session.use-only-cookies
session.use_only_cookies = 0

解决了这个问题。

于 2011-12-07T15:47:11.337 回答
0

经过很长时间,我终于修复了这个错误。

在我的 localhost WAMP 上,在页面加载之间不会保存会话数据,因为会话数据存储在 cookie 中,并且没有为 localhost 设置 cookie 域。

解决方案:

对于所有本地域名,'session.cookie_domain' 应设置为空字符串,不仅对于 'localhost'(但对于本地 IP 地址不应为空):

<?php
ini_set('session.cookie_domain', (strpos($_SERVER['HTTP_HOST'],'.') !== false) ? $_SERVER['HTTP_HOST'] : '');
?>

感谢 Marcin Wiazowski在这里发布它

于 2010-08-25T18:43:01.770 回答
0

面临同样的问题,但它是由

session_regenerate_id(true);

所以我只是从我的代码中删除了它。

于 2014-08-02T13:29:19.467 回答
0

更新到 WAMP 2.5,现在问题解决了!

于 2015-05-19T16:32:36.290 回答