【问题标题】:echo don`t show when use unset global variables使用未设置的全局变量时不显示回显
【发布时间】:2015-11-18 11:26:35
【问题描述】:

我已经在配置页面、$_SESSION['logged_out'] = 1; 和索引页面上启动了一个会话:

if(isset($_SESSION['logged_out']))
{
     echo "You have been logged out !";
     unset($_SESSION['logged_out']);
}

但回声不工作,就像未设置在他面前。我不明白为什么,请帮助我。 编辑: 配置页面:

<?php
ini_set('display_errors',1); 
error_reporting(E_ALL);
ob_start();
session_start();
include 'connection.php';
include 'functions.php';

$logged_in = 0;
if(isset($_SESSION['username']) && isset($_SESSION['password']))
{
    $username = sec($link, $_SESSION['username']);
    $password = sec($link, $_SESSION['password']);
    $udata = get_row($link, "SELECT * FROM accounts WHERE Username= '$username' && Password= MD5('$password')");
    if(isset($udata['ID']))
    {
        $logged_in = 1;
        if(isset($_GET['logout']))
        {
            unset($_SESSION['username']);
            unset($_SESSION['password']);
            $_SESSION['logged_out'] = "1";
            mysqli_query($link, "UPDATE accounts SET rpgon = '0' WHERE Username = '$username'");
            header('location: index.php');
        }
    }
} ?>

索引页:

if(isset($_SESSION['logged_out']))
{
    echo "You have been logged out !";  
    unset($_SESSION['logged_out']);
}?>

就是这样……

【问题讨论】:

  • 当你说var_dump($_SESSION)时你会得到什么?你在那儿看到logged_out 吗?
  • 无论如何,我会反转那里的逻辑以拥有一个 var logged_in 并检查它是否仍然存在。
  • 任何东西显示吗?您是否在日志中收到任何错误?
  • 我没有任何错误,错误报告已激活。
  • 你没有显示足够的代码让任何人知道真正发生了什么。显示所有相关代码。就像您包含 config.php 并且包含的​​文件中有 start_session() 一样。

标签: php session echo unset


【解决方案1】:

如果echo 没有显示任何内容,是因为if 条件被评估为false。这意味着$_SESSION['logged_out'] 未设置。

【讨论】:

  • 变量已设置,如果删除该未设置运行完美,但我想重新设置该变量.....并且不能按我想要的方式工作。我只想显示该消息一次。
【解决方案2】:

您必须在使用$_SESSION 的每个页面上start_session()。事实上,如果您在网站的任何地方使用 $_SESSION,最好在您的所有页面上启动它。

所以在第一个&lt;?php 之后添加start_session() 以确保它始终为所有页面启动

<php
start_session();

 . . .

if(isset($_SESSION['logged_out']))
{
     echo "You have been logged out !";
     unset($_SESSION['logged_out']);
}

在提供额外信息后添加

我认为这可能是你的问题之一

$udata = get_row($link, 
                 "SELECT * FROM accounts 
                  WHERE Username= '$username' 
                     && Password= MD5('$password')"
                 );

&amp;&amp; 应该是AND,那么这个查询应该返回一个结果。你真的应该像这样检查所有查询命令的结果状态:

<?php
ini_set('display_errors',1); 
error_reporting(E_ALL);
session_start();

ob_start();

include 'connection.php';
include 'functions.php';

$logged_in = 0;
if(isset($_SESSION['username']) && isset($_SESSION['password']))
{
    $username = sec($link, $_SESSION['username']);
    $password = sec($link, $_SESSION['password']);
    $udata = get_row($link, "SELECT * FROM accounts 
                             WHERE Username= '$username'
                               AND Password= MD5('$password')"
                     );

    // this would have shown the error in the sql query
    // if it had been here before
    if ( ! $udate ) {
        echo mysqli_error($link);
        exit;
    }


    // now this if will be executed
    // although this if is probably no longer required
    if(isset($udata['ID']))
    {
        $logged_in = 1;
        if(isset($_GET['logout']))
        {
            unset($_SESSION['username']);
            unset($_SESSION['password']);
            $_SESSION['logged_out'] = "1";
            mysqli_query($link, "UPDATE accounts SET rpgon = '0' WHERE Username = '$username'");
            header('location: index.php');

            // you should also follow a header() call with an exit;
            exit;
        }
    }
} 
?>

【讨论】:

  • 我在 config.php 中有这个配置页面,我在每个页面中都使用它,比如包含。
  • 为什么投反对票。在 OP 告诉我们他使用了 start_session() 之前,我回答了这个问题。建议通过一切方式删除,但投反对票?
  • 看看有没有帮助
  • 我不明白该看什么?
  • 非常感谢,你很好,它的作品!所以那个出口是问题还是?
猜你喜欢
  • 2015-11-11
  • 1970-01-01
  • 2018-08-05
  • 1970-01-01
  • 2012-05-14
  • 1970-01-01
  • 2021-10-21
  • 1970-01-01
相关资源
最近更新 更多