【问题标题】:PHP Session won't workPHP 会话不起作用
【发布时间】:2014-07-09 12:14:19
【问题描述】:

好的,我正在尝试在这里创建一个简单的登录,但我的登录代码以及介绍页无法正常工作。尝试调整 SESSION 的代码,但没有成功。

这是我 login.php 的代码:

<?php require_once("includes/connection.php"); ?>
<?php include("includes/header.php"); ?>


<?php

if(isset($_POST["login"])){

if(!empty($_POST['username']) && !empty($_POST['password'])) {
    $username=$_POST['username'];
    $password=$_POST['password'];


    $query=mysql_query("SELECT * FROM usertbl WHERE username='".$username."' AND password='".$password."'");


    $numrows=mysql_num_rows($query);
    if($numrows!=0)
    {
    while($row=mysql_fetch_assoc($query))
    {
    $dbusername=$row['username'];
    $dbpassword=$row['password'];
    }

    if($username == $dbusername && $password == $dbpassword)
    {
    session_start();
    $_SESSION['session_username']=$username;

    /* Redirect browser */
    header("Location: intropage.php");
    }
    } else {
    $message = "Invalid username or password!";
    }

} else {
    $message = "All fields are required!";
}
}
?>




    <div class="container mlogin">
            <div id="login">
    <h1>LOGIN</h1>
<form name="loginform" id="loginform" action="" method="POST">
    <p>
        <label for="user_login">Username<br />
        <input type="text" name="username" id="username" class="input" value="" size="20" /></label>
    </p>
    <p>
        <label for="user_pass">Password<br />
        <input type="password" name="password" id="password" class="input" value="" size="20" /></label>
    </p>
        <p class="submit">
        <input type="submit" name="login" class="button" value="Log In" />
    </p>
        <p class="regtext">No account yet? <a href="register.php" >Register Here</a>!</p>
</form>

    </div>

    </div>


    <?php include("includes/footer.php"); ?>
    <?php if (!empty($message)) {echo "<p class=\"error\">" . "MESSAGE: ". $message . "</p>";} ?>

然后这里是我的 intropage.php 的代码,我在其中重定向页面。

<?php 
session_start();
if(!isset($_SESSION["session_username"])){
    header("location:login.php");
} else {
?>


<?php include("includes/header.php"); ?>

    <h2>Welcome, <?php echo $_SESSION['session_username'];?>! </h2>
    <p><a href="logout.php">Logout</a> Here!</p>




<?php
}
?>

有什么帮助吗?只是想让这项工作正常进行,或者如果您可以进行任何调整,以便我可以找到我犯错的地方。非常感谢!

【问题讨论】:

  • 那么,您的代码 (login.php) 在中断之前可以运行多长时间?在开发过程中将错误报告添加到文件顶部error_reporting(E_ALL); ini_set('display_errors', 1);,并使用var_dump() 跟踪设置的内容和未设置的内容。
  • 实际上它在登录到 intropage.php 后正确重定向(这很好)但是,如果 SESSION 确实工作正常,它必须留在 intropage.php 上(并保持登录直到注销按钮单击)但是当我按下后退按钮时,它再次将我发送到 login.php,因为我正在登录,所以它应该在 intropage.php 上。
  • 您的 login.php 文件或包括 intropage.php 在内的所有其他文件,需要包含 if(!isset($_SESSION["session_username"]))if(isset($_SESSION["session_username"])){ // do something }else{ // do something else }
  • 能否更具体地说明我将把该代码放在哪里?这样我就可以调整它。谢谢。
  • 看到你的 PHP 包含在你的脚本顶部和session_start() 调用之间的所有这些换行符吗?它们被评估为\n,这意味着您的会话将不会启动,因为它们需要在 anything 发送到浏览器(包括新行)之前启动。

标签: php html css session


【解决方案1】:

您在 intropage.php 中不必要地检查会话用户名
你应该删除代码

 if(!isset($_SESSION["session_username"])){
header("location:login.php");

只从介绍文件开始一次会话,它应该在头文件的第一行。

【讨论】:

    【解决方案2】:

    您需要检查是否使用if(isset($_SESSION["session_username"]))在所有页面中设置了会话名称

    login.php

    <?php
    
    error_reporting(E_ALL); ini_set('display_errors', 1);
    session_start();
    
    ?>
    
    <?php require_once("includes/connection.php"); ?>
    <?php include("includes/header.php"); ?>
    
    <?php
    
    if(isset($_SESSION["session_username"])){
    // echo "Session is set"; // for testing purposes
    header("Location: intropage.php");
    }
    
    else{
    echo "You are not logged in.";
    }
    
    if(isset($_POST["login"])){
    
    if(!empty($_POST['username']) && !empty($_POST['password'])) {
        $username=$_POST['username'];
        $password=$_POST['password'];
    
        $query =mysql_query("SELECT * FROM usertbl WHERE username='".$username."' AND password='".$password."'");
    
        $numrows=mysql_num_rows($query);
        if($numrows!=0)
    
        {
        while($row=mysql_fetch_assoc($query))
        {
        $dbusername=$row['username'];
        $dbpassword=$row['password'];
        }
    
        if($username == $dbusername && $password == $dbpassword)
    
        {
    
    // old placement
    //    session_start();
        $_SESSION['session_username']=$username;
    
        /* Redirect browser */
        header("Location: intropage.php");
        }
        } else {
    //    $message = "Invalid username or password!";
    
    echo  "Invalid username or password!";
        }
    
    } else {
        $message = "All fields are required!";
    }
    }
    ?>
    
    
    
    
        <div class="container mlogin">
                <div id="login">
        <h1>LOGIN</h1>
    <form name="loginform" id="loginform" action="" method="POST">
        <p>
            <label for="user_login">Username<br />
            <input type="text" name="username" id="username" class="input" value="" size="20" /></label>
        </p>
        <p>
            <label for="user_pass">Password<br />
            <input type="password" name="password" id="password" class="input" value="" size="20" /></label>
        </p>
            <p class="submit">
            <input type="submit" name="login" class="button" value="Log In" />
        </p>
            <p class="regtext">No account yet? <a href="register.php" >Register Here</a>!</p>
    </form>
    
        </div>
    
        </div>
    

    脚注:

    您当前的代码对SQL injection 开放。使用prepared statements,或PDO

    mysql_*函数弃用通知:

    http://www.php.net/manual/en/intro.mysql.php

    此扩展自 PHP 5.5.0 起已弃用,不推荐用于编写新代码,因为它将来将被删除。相反,应该使用mysqliPDO_MySQL 扩展名。在选择 MySQL API 时,另请参阅MySQL API Overview 以获得更多帮助。

    这些函数允许您访问 MySQL 数据库服务器。有关 MySQL 的更多信息,请访问 »http://www.mysql.com/

    可以在 »http://dev.mysql.com/doc/ 找到 MySQL 文档。


    密码

    我注意到您可能以纯文本形式存储密码。不建议这样做。

    使用以下方法之一:

    其他链接:

    【讨论】:

      【解决方案3】:

      将您的session_start() 放在页面顶部。

      我刚刚评论了您的代码。它对我有用。只需复制并直接运行此代码即可。

      <?php session_start();
      //require_once("includes/connection.php"); ?>
      <?php //include("includes/header.php"); ?>
      
      
      <?php
      
      if(isset($_POST["login"])){
      
      if(!empty($_POST['username']) && !empty($_POST['password'])) {
          $username=$_POST['username'];
          $password=$_POST['password'];
      
      
         /* $query=mysql_query("SELECT * FROM usertbl WHERE username='".$username."' AND password='".$password."'");
      
      
          $numrows=mysql_num_rows($query);
          if($numrows!=0)
          {
          while($row=mysql_fetch_assoc($query))
          {
          $dbusername=$row['username'];
          $dbpassword=$row['password'];
          }
      
          if($username == $dbusername && $password == $dbpassword)
          {*/
      
          $_SESSION['session_username']=$username;
          print_r($_SESSION);
      
          /* Redirect browser */
         /* header("Location: intropage.php");
          }
          } else {
          $message = "Invalid username or password!";
          }
      */
      } else {
          $message = "All fields are required!";
      }
      }
      ?>
      
      
      
      
          <div class="container mlogin">
                  <div id="login">
          <h1>LOGIN</h1>
      <form name="loginform" id="loginform" action="" method="POST">
          <p>
              <label for="user_login">Username<br />
              <input type="text" name="username" id="username" class="input" value="" size="20" /></label>
          </p>
          <p>
              <label for="user_pass">Password<br />
              <input type="password" name="password" id="password" class="input" value="" size="20" /></label>
          </p>
              <p class="submit">
              <input type="submit" name="login" class="button" value="Log In" />
          </p>
              <p class="regtext">No account yet? <a href="register.php" >Register Here</a>!</p>
      </form>
      
          </div>
      
          </div>
      
      
          <?php include("includes/footer.php"); ?>
          <?php if (!empty($message)) {echo "<p class=\"error\">" . "MESSAGE: ". $message . "</p>";} ?>
      

      【讨论】:

        【解决方案4】:
        <?php
        session_start();
        
        require_once("includes/connection.php");
        include("includes/header.php");
        $message = '';
        
        if(isset($_REQUEST["login"])) {
            if((isset($_POST['username']) && strlen(trim($_POST['username'])) > 0) && (isset($_POST['password']) && strlen(trim($_POST['password'])) > 0)) {
                $username = filter_var($_POST['username'],FILTER_SANITIZE_STRING);
                $password = filter_var($_POST['password'],FILTER_SANITIZE_STRING);
        
                $query = mysql_query("SELECT * FROM usertbl WHERE username='".$username."' AND password='".$password."' LIMIT 1");
        
                if(mysql_num_rows($query) == 1) {
                    $row = mysql_fetch_assoc($query));
        
                    $_SESSION['session_username'] = $row['username'];
        
                    /* Redirect browser */
                    header("Location: intropage.php");
                } else {
                    $message = "Invalid username or password!";
                }
            } else {
                $message = "All fields are required!";
            }
        }
        ?>
        <div class="container mlogin">
            <div id="login">
                <h1>LOGIN</h1>
                <form name="loginform" id="loginform" action="" method="POST">
                <p>
                    <label for="user_login">Username<br />
                        <input type="text" name="username" id="username" class="input" value="" size="20" />
                    </label>
                </p>
                <p>
                    <label for="user_pass">Password<br />
                        <input type="password" name="password" id="password" class="input" value="" size="20" />
                    </label>
                </p>
                <p class="submit">
                    <input type="submit" name="login" class="button" value="Log In" />
                </p>
                <p class="regtext">No account yet? <a href="register.php" >Register Here</a>!</p>
                </form>
            </div>
        </div>
        <?php
        include("includes/footer.php");
        if (!empty($message)) {
        echo "<p class=\"error\">" . "MESSAGE: ". $message . "</p>";
        }
        ?>
        

        这样不行,session_start 需要位于文件顶部才能正常工作。因此,要么将其包含在文件“includes/header.php”(您将其包含在您的登录页面中)的开头,要么包含在您将在所有页面中使用的其他包含文件中。

        【讨论】:

        • 我试图将它包含在一个新的包含文件名“session.php”中,并尝试将它放在 但是它不再显示 login.php。相反,它引导我进入 intropage.php 并给我一个错误“无法加载网页,它有一个循环”
        • 在登录时尝试上面的更新代码,而不是您的代码。
        • 谢谢,尝试在我的代码上复制相同的代码,但即使我已经登录,它仍然会引导我访问 login.php。它必须留在 intropage.php :(
        猜你喜欢
        • 1970-01-01
        • 2013-02-09
        • 2014-02-08
        • 1970-01-01
        • 2020-05-26
        • 2013-11-10
        • 2014-02-13
        • 2015-09-30
        相关资源
        最近更新 更多