【问题标题】:code can't refer to Sessions I set before (PHP 7.2)代码不能引用我之前设置的会话(PHP 7.2)
【发布时间】:2019-08-21 01:52:34
【问题描述】:

我正在使用会话将成功或错误消息发送到下一个站点,在该站点我使用包含 php 文件来显示该消息。

由于某种原因,message.php 文件无法引用我之前设置的会话。

例如:登录脚本根据登录是否成功设置会话。然后它会将您重定向到下一页,在这里我使用message.php 作为我拥有的每个站点的包含。这应该在之前设置会话时在每个站点上显示一条消息。

<?php
session_start();

if (isset($_SESSION['msgType']) AND isset($_SESSION['msgMessage'])) {
  if ($_SESSION['msgType'] != "" AND $_SESSION['msgMessage'] != "") {

    if ($_SESSION['msgType'] == "error") {
      ?>
      <div class="alert alert-danger alert-dismissible fade show" role="alert">
        <strong>Fehler!</strong> <?php echo $_SESSION['msgMessage']; ?>
        <button type="button" class="close" data-dismiss="alert" aria-label="Close">
          <span aria-hidden="true">&times;</span>
        </button>
      </div>
      <?php
    } elseif ($_SESSION['msgType'] == "warning") {
      ?>
      <div class="alert alert-warning alert-dismissible fade show" role="alert">
        <strong>Warnung!</strong> <?php echo $_SESSION['msgMessage']; ?>
        <button type="button" class="close" data-dismiss="alert" aria-label="Close">
          <span aria-hidden="true">&times;</span>
        </button>
      </div>
      <?php
    } elseif ($_SESSION['msgType'] == "success") {
      ?>
      <div class="alert alert-success alert-dismissible fade show" role="alert">
        <strong>Erfolg!</strong> <?php echo $_SESSION['msgMessage']; ?>
        <button type="button" class="close" data-dismiss="alert" aria-label="Close">
          <span aria-hidden="true">&times;</span>
        </button>
      </div>
      <?php
    }
  }
}

$_SESSION['msgType'] = "";
$_SESSION['msgMessage'] = "";
?>
<?php
session_start();

$_SESSION['msgType'] = "success";
$_SESSION['msgMessage'] = "some message";

?> <script> window.location = "some URL"; </script> <?php
exit;

第一个代码是 message.php 文件,其中会话在消息中被翻译。 第二个代码是一段登录脚本。在哪里设置会话并且您会被重定向。

由于任何原因,根本不会显示任何消息。你能看出我的代码有什么问题吗?

另外,如果有人能告诉我,为什么我不能使用header('Location: URL') 进行重定向而必须使用&lt;script&gt; window.location = "some URL"; &lt;/script&gt;,请告诉我。

【问题讨论】:

  • !empty($var) 等价于isset($var) &amp;&amp; $var != ""。但是,both not 等同于 not distinct 运算符 !==0 != ""false"0" != ""true0 !== ""true。另请参阅 PHP 7 空合并运算符 ??

标签: php html session php-7


【解决方案1】:

可以,使用 header('location : your_url')

<?php
ini_set('session.save_path',realpath(dirname($_SERVER['DOCUMENT_ROOT']) . '/../session')); //PUT THIS ON THE TOP
session_start();

试试看

【讨论】:

  • 我之前使用过 header('Location: URL') 但它没有用。我读到你不能在任何类型的输出后使用 header() 。设置会话算作输出吗?
  • 什么都没有。我只是得到一个没有任何错误消息的简单白页
  • 在使用 header() 重定向到另一个页面后,您能否在页面上检查会话是否正在存储值?你为什么要在这里检查两次相同的东西if (isset($_SESSION['msgType']) AND isset($_SESSION['msgMessage'])) { if ($_SESSION['msgType'] != "" AND $_SESSION['msgMessage'] != "") { ??? isset 足以检查和使用 && 而不是 AND 看看这里stackoverflow.com/a/2803374/5928015
  • 会话根本没有存储任何值。
【解决方案2】:

默认的 PHP 会话处理是通过标头使用 cookie。尝试设置 Location 标头时出现错误的事实表明输出已经完成。

确保您的脚本在第一个字符处以&lt;?php 开头,之前没有任何空格。还要确保您的编辑器没有在文件开头存储BOM(字节顺序标记)。

另请参阅:https://en.wikipedia.org/wiki/Byte_order_mark

【讨论】:

  • 非常感谢。我发现了错误。我在第一行有一个 html 注释,这显然算作输出:)
猜你喜欢
  • 2016-08-11
  • 2014-11-25
  • 1970-01-01
  • 2016-04-08
  • 2017-08-11
  • 2015-12-16
  • 1970-01-01
  • 2016-06-17
  • 1970-01-01
相关资源
最近更新 更多