跨脚本传递全局变量的问题


Issue passing global variables across scripts

我有一个名为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";
}