我有一个名为login.php的脚本,它接受通过表单提供的用户信息,并检查输入的登录信息是否有效。如果信息无效,则调用以下代码:
$GLOBALS['user_login_fail'] = true;
header('Location: ../index.php'); //this displays index.html
在index.html中,如果用户输入了无效的登录信息,则显示一条错误消息:
<?php
if($GLOBALS['user_login_fail'] == true)
{
echo '<div> Login credentials could not be verified </div>';
}
else
{
echo "no error";
}
?>
然而,被重定向后,我得到一个错误:注意:未定义的索引:user_login_fail。这是怎么了?
我想你把全局变量和会话变量搞混了。
全局变量在当前作用域中无处不在,但是浏览器重定向会创建一个新的作用域。会话变量在浏览器重定向中持续存在。
试试这个:
session_start();
$_SESSION['user_login_fail'] = true;
和
session_start();
if(isset($_SESSION['user_login_fail']) && $_SESSION['user_login_fail']) {
echo '<div> Login credentials could not be verified </div>';
} else {
echo "no error";
}
似乎(如前所述)您在php中将$_GLOBALS
与$_SESSION
混淆了。我直接告诉你: $_GLOBALS
在php中是不好的做法。
为什么全局变量不好
当人们在其他语言中谈论全局变量时,它的含义与PHP中的含义有所不同。这是因为变量在PHP中并不是全局的。典型PHP程序的作用域是一个HTTP请求。会话变量实际上比PHP的"全局"变量范围更广,因为它们通常包含许多HTTP请求。
- Google搜索:"为什么php全局变量是坏的"
- 为什么全局状态是魔鬼,以及如何避免使用
- SO:全局变量在PHP被认为是不好的做法吗?如果是,为什么?
基本上你想使用$_SESSIONS
。可以这样做:
作为验证部分:
session_start();
$_SESSION['user_login_fail'] = true;
header("Location: index.php");
作为 index.php
session_start();
if(isset($_SESSION['user_login_fail']) && $_SESSION['user_login_fail'] == TRUE) {
echo '<div> Login credentials could not be verified </div>';
} else {
echo "no error";
}