在每个可能的页面上调用该函数,它类似于主函数,它检查用户是否是logedin,因此它在任何事情之前执行。它只是检查用户是否是logedin或设置了cookie,如果它是logedin或者有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放在函数外面它可以完美地工作,但是即使用户没有logedin也会启动会话。
答案 0 :(得分: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();
这会强制设置会话变量。
答案 1 :(得分: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
这很有效。
至少这是我从解释中理解的。