0

该函数在每个可能的页面上都被调用,它类似于 main 函数,它检查用户是否登录,所以它在任何事情之前执行。它只是检查用户是否已登录或设置了 cookie,如果用户已登录或设置了 cookie,它会启动会话并设置 2 个会话。

但是在函数外输出会话它会输出未设置会话,但显示 cookie 和会话。

如果我回显,再解释一下

$_SESSION['user']
$_SESSION['logedin']

它输出

Undefined variable: _SESSION

但如果我这样做

print_r($_COOKIE);

它输出

Array ( [PHPSESSID] => 1rane5lksksp7s4u8p8fh0h194 [user] => fe8dc8f2a7e88746fd8586d489646958 ) 

这意味着会话和cookie都已设置

但是为什么当我请求会话时它会显示未定义的变量,并且它会在第一次刷新网站后注销用户。

是不是因为 session_start 在函数内部,如果 session_start 在函数内部被调用,它只会在该函数满足 else 条件或函数内部的 if 语句时被调用,并且一旦 session_start 被调用,它就会在浏览器或每个页面上调用你需要使用 session_start 来启动会话,而不是您可以使用设置的会话。因为如果我将 session_start 放在函数之外,它可以完美地工作,但即使用户没有登录,会话也会启动。

4

2 回答 2

1

一些东西:

1)它比使用require_once('phpfile.php')更好require('phpfile.php')。如果您多次需要同一个文件,脚本将出现致命错误,导致脚本无法执行。它的作用相同,只是检查该文件之前是否已被需要。

2)它session_start()在功能之外时工作吗?如果是这种情况,请使用它。

3)您实际上是否将会话变量设置为某些东西?

$_SESSION['user']; //this wont do anything...
$_SESSION['user'] = $user; //This will assign the session variable

4)如果它不起作用,请尝试

function userlogin() {
    session_start();
    $_SESSION['user'] = $user;
    $_SESSION['loggedin'] = true;
    session_write_close(); 
} 
session_start();

这强制设置会话变量。

于 2013-10-20T19:19:49.060 回答
0

好的,所以我从比我更了解 php 的人那里得到了更多的解释,这似乎是一个非常合乎逻辑的解释。

正如您要求我发布的代码,它非常大,分成几页,但我会尽力解释。

当用户访问我的网站时,它加载的第一页是 index.php

在 index.php 的第一行代码中,我有调用标题页的代码。

require('header.php');

因此,在第一行代码的 header.php 文件中,我有调用函数页面的代码

require('functions.php');

比函数文件中的第一个是检查用户登录的函数。

function userlogin() {
    if(isset($_POST['login'])){
        session_start();
        $_SESSION['user'];
        $_SESSION['logedin'];
        setcookie(stuff);
        and other stuff
    }

}

而不是在 header.php 的第一行我调用 userlogin() 函数

所以按照这个逻辑,它应该是第一个被调用在网站上执行的代码。至少我是这么想的。但事实并非如此。

为什么?

那么我得到的答案是因为它不是文件中的第一个代码,如果我计算它为用户执行的某些内容或只是服务器端检查,这并不重要。session_start() 必须始终位于代码的第一行。如果我在 session_start() 之间或之前放置一些东西,我需要或包含多少个文件并不重要,它只是不起作用。所以

index.php -----↴
          header.php -----↴
                     functions.php
                          function userlogin() {              line 1
                            if (isset($_POST['login'])){      line 2
                               session_start();               line 3

不会工作。在另一方面:

index.php -----↴
          header.php -----↴
                     functions.php
                               session_start();               line 1

这行得通。

至少这是我从解释中理解的。

于 2013-10-20T14:50:38.357 回答