【问题标题】:php sessions are not being savedphp会话没有被保存
【发布时间】:2014-04-14 00:48:13
【问题描述】:

我为文字墙道歉,但我一直在努力解决这个问题,所以我会尝试提供尽可能多的信息。 我不太确定我遇到的问题是否与用户会话有关(我是 PHP 新手),但在我看来就是这样。

我要求用户在ask_login.php中输入他的登录信息(id和密码)进入系统:

<div class="login_box">
        <h1>Login</h1>
        <form method="POST" action="login.php">
        <p><input type="text" name="username" placeholder="UserID"></p>
        <p><input type="password" name="password" placeholder="Password"></p>
        <input type="submit" name="submit" value="Login"></p>
        </form>
</div>

如果在数据库中找到登录详细信息(ID 和密码),用户将登录到他的用户门户 (login.php),在那里他可以查看他的详细信息、考试日期等。 . 我的问题是每当我登录时,如果我单击详细信息按钮以检查用户详细信息,它会将我重定向到我的 ask_login.php 页面,再次询问我的登录详细信息,说我没有输入任何 ID/密码详细信息。 我尝试删除检查登录表单是否提交为空白的代码,它最终开始工作,我能够单击“详细信息”按钮或任何其他按钮,而不会重定向到 ask_login.php。 但是现在当我单击“详细信息”按钮时,我的“欢迎,用户名”行没有显示用户名,这让我认为它与 php 会话有关。此外,我进行的任何查询都不会显示结果。

这是我的 login.php 代码:

<?php
session_start();


$username = $_POST['username'];
$password = $_POST['password'];

if($username && $password) {
  $conn_error = 'Could not connect.';
  $mysql_db = '------';
  if(!mysql_connect('localhost', '------', '') || !mysql_select_db($mysql_db)) {
  die($conn_error);
}
  $query = mysql_query("SELECT * FROM users WHERE id='$username' AND password='$password'");

    $numrows = mysql_num_rows($query);

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

          if($username==$dbusername && $password==$dbpassword) {
            //echo "You are logged in!";
            @$_SESSION['id'] = $username;
          }
          else {
            echo "<script>alert('Username/Password are incorrect');</script>";
            echo "<script language='javascript'>window.location = 'ask_login.php';</script>";
            die();
            //die("Wrong username/password!");
          }
      }
        else {
            echo "<script>alert('User doesn't exist.');</script>";
            echo "<script language='javascript'>window.location = 'ask_login.php';</script>";
            die();
           //die("That user doesn't exist!");
         }
}

    else if(empty($username) || empty($password)) {
   echo "<script>alert('You didn't enter an ID/Password');</script>";
    echo "<script language='javascript'>window.location = 'ask_login.php';</script>";
    die();
    //die("Please enter an ID and password!");
}

?>



<!DOCTYPE HTML>

<html>
<head>
    <title>Logged in | FCUL</title>
    <link rel="stylesheet" href="css/stylesheet_loggedin.css" type="text/css"/>
    <meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
        <link rel="shortcut icon" href="img/vitor-20130904-favicon.ico"/>
</head>


<body>

            <div id="header">
                <br/>
                    <a href="index.php"><img src="/img/fcul_cent_logo_001.png" width="510" height="70"/></a>
            </div>


<div id="loggedinas">
<br/>

Welcome, 
<?php 
$result = mysql_query("SELECT nome FROM users WHERE id='$username'");
while($row = mysql_fetch_assoc($result)) {
    echo $row["nome"];
} 
?> 

( <?php echo $username;  ?> ) 
 <br/>


 <div id="logout">
 <a href="logout.php"><font size="2"><u>[Logout]</u></a></font></a>
</div>

<hr/>
</div>



 <?php
//FETCH USER'S BI
    if(isset($_POST['username'] )) {

    $ID = $_REQUEST['username'];

  $query = "SELECT bi FROM users WHERE id='$ID'";

      //if query is successful
    if($query_run = mysql_query($query)) {

      //if it returns 0 rows
    if(mysql_num_rows($query_run)==NULL) {
    echo "<script>alert('Unexpected Error 004');</script>";
    echo "<script language='javascript'>window.location = 'index.php';</script>";
    }

      while($query_row = mysql_fetch_assoc($query_run)) {
      $bi = $query_row['bi'];
      //echo $bi;
      }
  } 
}

?>



<br/>
<center>
<div id="buttons">

<form method="POST" action="login.php">
   <input type="submit" name="details" value="details">
    </form>

<?php
//**print user's BI if he clicks on 'Details' button**
    if($_POST['detalhes']){
    echo '<div id="content">' . $bi . '</div>';
}
?>


</div>
</center>
</body>
</html>

【问题讨论】:

  • 不管这段代码存在什么问题
  • $username 和 $password 的值是什么?无论如何,您应该在表单中使用 id,并注意您的网站很容易注入,因为您没有使用准备好的语句,并且 mysql_* 已被弃用很长时间。
  • 在我看来,一旦你超过 $numrows,我们知道用户名和密码至少匹配 1 行,所以我们可以只使用 $username 和 $password。还要研究 SQL 输入卫生。
  • 请不要使用 javascript 将用户重定向到 ask_login.php 如果 javascript 被禁用,他们可以访问 javascript 重定向下的所有内容。只需使用 header('location: file.php');退出;

标签: php session


【解决方案1】:

第一次将会话插入 $_SESSION['id'] = $username 变量时,您无法访问它。
您只能在 session_start() 的第二次运行时访问它;

试试这个。
1. 制作 login.php
2. 制作welcome.php

尝试将 login.php 仅用于检查的模块分开 登录过程然后如果此条件成功则

<?
if($username==$dbusername && $password==$dbpassword) {
    //echo "You are logged in!";
    $_SESSION['id'] = $username;
    header("location: welcome.php");
}
?>

在welcome.php中

<? 
session_start();
// this is for the checking if user is loged in
if (!$_SESSION['id']) {
 header("location: ask_login.php");
 exit;
}
?>

【讨论】:

  • 我确实做到了,但用户名仍然没有显示,我的查询也没有返回任何内容。我尝试打印会话,它实际上返回了正确的 ID。我不知道为什么它不起作用。
  • 我认为这是问题所在,您单击提交按钮并转到 login.php 当然在 checkdetails 表单中提交没有密码和用户名这就是为什么您总是重定向到 ask_login.php 的消息你们中的一些人没有输入用户名和密码尝试包装这部分代码 if (!$_POST['details']) { if($username && $password) { } }
  • 嘿,只是为了更新你。我设法让它工作。我将登录分成不同的模块:ask_login.php、login.php、main.php。我的问题是我没有在每个页面中正确调用 session_start() 。谢谢。
【解决方案2】:

您没有检查用户是否已登录,因此,在从 ask_login.php 收到您的帖子后,当您单击页面中的任何内容时,$username 和 $userpassword 将为空。

只需在 session_start 之后包装所有代码

if($_SESSION['id'] === false)
{

    //Your code
    $username = $_POST['username'];
    $password = $_POST['password'];

    if($username &&...

}

【讨论】:

    【解决方案3】:

    用这个包装你的代码

    if ($_SESSION['id']){
    //your login checking here
    };
    

    例如

    if ($_SESSION['id']){
    if($username && $password) {
      $conn_error = 'Could not connect.';
      $mysql_db = '------';
      if(!mysql_connect('localhost', '------', '') || !mysql_select_db($mysql_db)) {
      die($conn_error);
    }
      $query = mysql_query("SELECT * FROM users WHERE id='$username' AND password='$password'");
    
        $numrows = mysql_num_rows($query);
    
          if($numrows!== 0) 
          {
              while($row = mysql_fetch_assoc($query))
              {
                $dbusername = $row['id'];
                $dbpassword = $row['password'];
              }
    
              if($username==$dbusername && $password==$dbpassword) {
                //echo "You are logged in!";
                @$_SESSION['id'] = $username;
              }
              else {
                echo "<script>alert('Username/Password are incorrect');</script>";
                echo "<script language='javascript'>window.location = 'ask_login.php';</script>";
                die();
                //die("Wrong username/password!");
              }
          }
            else {
                echo "<script>alert('User doesn't exist.');</script>";
                echo "<script language='javascript'>window.location = 'ask_login.php';</script>";
                die();
               //die("That user doesn't exist!");
             }
    }
    
        else if(empty($username) || empty($password)) {
       echo "<script>alert('You didn't enter an ID/Password');</script>";
        echo "<script language='javascript'>window.location = 'ask_login.php';</script>";
        die();
        //die("Please enter an ID and password!");
    }
    }
    ?>
    

    【讨论】:

      猜你喜欢
      • 2016-06-15
      • 2014-05-26
      • 1970-01-01
      • 2018-09-26
      • 2013-04-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多