【问题标题】:Why sessions are not working in home directory of website为什么会话在网站的主目录中不起作用
【发布时间】:2021-03-17 04:00:07
【问题描述】:

在我的网站中,登录后正在设置会话,但它们不在主目录的文件中工作,而是在 /admin 等其他目录中工作。

可能是我的 robots.txt 文件有问题。 这是 robots.txt 文件的代码-

User-agent: *
Disallow: /cgi-bin/
Disallow: /admin/
Disallow: /*?*

我的导航栏代码 -

<nav class="navbar navbar-expand-lg navbar-dark bg-dark">
    <a class="navbar-brand" href=""><?php echo website_name; ?></a>
    <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarSupportedContent" aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="Toggle navigation">
        <span class="navbar-toggler-icon"></span>
    </button>

    <div class="collapse navbar-collapse" id="navbarSupportedContent">
        <ul class="navbar-nav mr-auto">
            <li class="nav-item ">
                <a class="nav-link" href="<?php echo location; ?>">Home </a>
            </li>

            <li class="nav-item ">
                <a class="nav-link" href="dashboard.php">Dashboard</a>
            </li>

            <li class="nav-item">
                <a class="nav-link " href="about-us.php" >About Us</a>
            </li>

            <li class="nav-item">
                <a class="nav-link " href="contact-feedback.php" >Contact Us / Feedback</a>
            </li>
            
            <li class="nav-item">
                <a class="nav-link " href="privacy-policy.php" >Privacy Policy</a>
            </li>
            
            <?php
            
            session_start();
            
            if (isset($_SESSION['loggined'])){
                
            echo '<li class="nav-item">
                <a class="nav-link " href="wins.php">My Wins</a>
            </li>';
            
            }
            
            ?>
            
            <?php
            
            if (isset($_SESSION['admin'])) {
                echo '
                
            <li class="nav-item">
                <a class="nav-link " href="admin/Web_ManageMent" >Admin Panel</a>
            </li>
            
                ';
            }
            
            ?>
        </ul>

        <?php
    
        if (!isset($_SESSION['loggined']) ) {
            echo '
    <div class="row">
        <button class="btn btn-sm btn-primary mx-3 my-2" data-toggle="modal" data-target="#loginModal"  id="loginBtn">Login</button>
        <button id="signupBtn" class="btn btn-sm btn-primary my-2" data-toggle="modal" data-target="#signupModal" >Sign Up
        </button>
    </div>
    ';

        } else {
            echo '
                <hr>
        <span class="text-white">Welcome , '.$_SESSION['name'].'</span>
        <br>
        <button class="btn btn-sm btn-primary mx-3 my-2"><a class="text-white" href="registration/logout.php">Log Out</a></button>
        
      
     ';
     
        }
   
        ?>
    
    </div>
</nav>


<?php

include("modals/signup.php");
include("modals/login.php");
?>

我在 login.php 中设置会话的地方

$_SESSION["loggined"] = true;
    $_SESSION["username"] = $username;
    $_SESSION["name"] = $row['display_name'];
    $_SESSION['id'] = $row['user_id'];
    
    
    header("location: dashboard.php");

/admin 中的导航栏 - Navigation Bar

主目录文件中的导航栏 - Navigation Bar

所以会话不在主目录中工作

【问题讨论】:

  • 我们需要知道会话从哪里开始。在哪个文件中。
  • @GiacomoM 让我包含它

标签: php session session-cookies session-variables


【解决方案1】:

您的robots.txt 文件与PHP 完全无关。 纯粹是关于如何告诉有道德的机器人要索引哪些文件。

PHP 中会话“不工作”的常见问题是由于未调用 session_start();

请将以下代码添加到它们不起作用的页面顶部:

if (session_status() === PHP_SESSION_NONE) {
    session_start();
}

说实话?自从我输入 session_start() 以来已经 11 年多了。为什么?因为,如果你在 2021 年用 PHP 裸编码,那你就做错了。

拜托,拜托,学习 Laravel 或任何现代框架。您、您的项目、您的同事、整个世界都会变得更好。

我每天都编写 PHP 代码,从大概 2010 年开始,我几乎没有直接使用过 $_SESSION[]。这就像在 JavaScript 中编写 document.getElementById('foo');。也请不要这样做;-)

附:您可以考虑学习如何设计无状态 PHP 应用程序,依靠前端 AJAX 存储状态,通过 localStorage.getItem('key'),使用 JWT 令牌 (tymon/jwt-auth) 作为身份验证系统。

实际上,这就是过去 5 年我们一直在滚动的方式。

请阅读这篇文章:

Goodbye PHP Sessions, Hello JSON Web Tokens

【讨论】:

  • 所以我们不应该使用会话吗? d
  • 你觉得 js 中的 document.getElementById('foo') 哪个更好?
  • @GiacomoM,至少是 jQuery 的$('#foo')。现代 JS 有很多方法来处理这个问题。就像,在 ReactJS 中,你会做 &lt;button onclick={this.handleSubmit}&gt;Register&lt;/button&gt;.
  • @CreativeAkshara,对于遗留 PHP 应用程序(在 2014 年之前构建),我想说,很好,会话可能是一个不错的拐杖,因为你可能也陷入了许多其他不良做法,特别是缺乏作曲家支持。在现代 PHP 中?没门。了解如何制作无状态应用并利用 PHP 的强大功能。
  • 我非常愿意为您或任何人指明正确的方向。 twitter.com/hopeseekr
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-27
  • 2013-01-28
  • 2017-07-03
  • 1970-01-01
  • 2012-09-23
  • 1970-01-01
相关资源
最近更新 更多