PHP隐形重定向无法正常工作

时间:2018-04-01 13:28:32

标签: php redirect include

我已经获得了这个小片段功能,可以在不更改网址的情况下将访问者重定向到我的恶作剧页面:

function april_fools($session_id_string)
{
    if(!isset($_SESSION['session_id']) || $_SESSION['session_id'] != $session_id_string)
    {
        $_SESSION['session_id'] = $session_id_string;
        include("./april_fools/" . $date_array[2] . ".php");
        exit();
    }
}

它应该做的是,它实际上包括恶作剧页面内容并执行它,然后在继续之前退出程序(不评估下一个代码)。不幸的是,这似乎不起作用:(它依赖于一年中的特定日期。愚人节的日期和会话标识符由此代码段驱动:

$date_string = date("d-m-Y");
$date_array = explode("-", $date_string);

$session_id = base64_encode($visitor_ip . '/' . $_SERVER['HTTP_USER_AGENT'] . '/' . $date_string)
session_start();

实际的"重定向"是通过调用上一个函数来完成的:

if($date_array[0] == 1 && $date_array[1] == 4)
{
    april_fools($session_id);
}

但该功能并不想工作,所以"重定向"没有发生。有关如何让它运作的任何想法吗?最好使用日期驱动的PHP ...

编辑:解决方案是明确的cookie。与实际代码无关。

2 个答案:

答案 0 :(得分:1)

$date_array变量超出april_fools()功能的范围。您需要使用global导入它。

function april_fools($session_id_string)
{
    global $date_array;
    if(!isset($_SESSION['session_id']) || $_SESSION['session_id'] != $session_id_string)
    {
        $_SESSION['session_id'] = $session_id_string;
        include("./april_fools/" . $date_array[2] . ".php");
        exit();
    }
}

如果你的调用代码在另一个方法中,则需要将年份($date_array[2])作为参数传递。

或者如Niet the Dark Absol所述,无论范围如何,都将其作为参数传递给此函数。

答案 1 :(得分:1)

虽然@rollstuhlfahrer击中它的鼻子,但我会做的有点不同:

function april_fools($session_id_string){
  if(date('m') == 4 && date('d') == 1){
    if(!isset($_SESSION['session_id']) || $_SESSION['session_id'] != $session_id_string){
      $_SESSION['session_id'] = $session_id_string;
      include("./april_fools/" . date('Y') . ".php");
      exit();
    } else {
      echo 'Session already exists, Nothing to do..';
    }
  }
}

它是一个可变范围问题,如果您启用了error_reporting()

,您将会知道什么