【问题标题】:php - can't retain session values when navigating to another pagephp - 导航到另一个页面时无法保留会话值
【发布时间】:2014-05-09 12:59:40
【问题描述】:

我正在开发一个 php 应用程序,但在保留会话值时遇到了问题。我有两个文件,一个是侧边栏(sidebar.php)和一个主页(home.php)。我在主页上包含了侧边栏。 侧边栏上有登录控件,我可以成功登录。我知道它已成功登录,因为它向我显示了一条消息 Welcome 'username'。但是当我转到主页时,由于会话值被破坏,因此不会显示欢迎的“用户名”部分。而是显示登录表单。这是为什么呢?

这是主页(sidebar.php)

<?php require_once('connections.php'); ?>
<?php
// if the login button is clicked
if (isset($_POST['btnLogin']))
{


$myusername=$_POST['textusername'];
$mypassword=$_POST['textpassword'];

$result=mysql_query("SELECT * FROM users_table WHERE username='$myusername' and password='$mypassword'");

$count=mysql_num_rows($result);

if($count>=1)
{

$_SESSION['username'] = $row["username"] ;
$_SESSION['userid']= $row["ID"];

}
else 
{ 

//Any code here

}

}
?>

<div class="col-md-12 right-aside">  

<?php


if (isset($_SESSION['userid']))
{
echo Welcome : " .  $_SESSION['username'];
echo "  <a href='logout.php'> | Logout</a>";
}

else //if session is not set
{

echo 'Some html for login form';

}

?>
</div> 

以下是首页(home.php)

<?php include("head.php"); ?> 
<body>
<div class="container container-body">
        <div class="row">
          <div class="col-md-9 main-content">
             <div class="row">                               

               <p>Some Text Here</p>

             </div><!-- /.row -->
          </div><!-- /.main-content -->
        <div class="col-md-3">

  <div class="row">
      <?php include 'sidebar.php';?>      
  </div>

 </div>

【问题讨论】:

  • 在将值放入会话之前启动会话(如果尚未启动)并将值放入会话中。
  • 当我这样做时,它显示以下错误。我做到了,但这会在侧栏上引发错误。警告:session_start() [function.session-start]:无法发送会话缓存限制器 - 标头已发送(输出开始于 C:\xampp\htdocs\trialphp\head.php:38)head.php 基本上是 css 和脚本文件,我已将其导入 home.php。它只包含一些 一些 css 和一些脚本
  • 不要习惯使用纯文本密码,.. 首先认为你应该管理的是强哈希/加密(不是 md5,甚至不使用盐)。 mysql_ 已弃用,没有字符串转义,没有 session_start()?
  • 我省略了很多代码,这些代码与我的问题无关,例如查询和加密。但我想了解更多关于加密的信息,我实际使用的是 $mypassword=$_POST['textboxPassword']; $mypassword = stripslashes($mypassword); $mypassword = mysql_real_escape_string($mypassword); $mypassword = md5($mypassword);如果我能做些什么让它变得更好,我会全力以赴:)
  • @Enq,处理密码的正确方法是,(简而言之),当用户注册时,使用 sha1($password) 对密码进行哈希处理,然后将其插入到您的数据库中。然后当用户登录时,获取提交的密码,使用相同的方法(sha1($password))对其进行哈希处理,然后将数据库中的密码与您刚刚哈希处理的密码进行比较。这可以防止任何人知道密码是什么。

标签: php html session


【解决方案1】:

您是在 home.php 中开始会话吗? 您必须在要访问会话变量的每个 php 脚本的第一行调用 session_start()

尝试将其添加到首页。

<?php
session_start();
//Then do your work

那么即使 session_start 在 head.php 或 sidebar.php 中再次被调用,它也会被忽略,因为会话已经开始了。

【讨论】:

  • 我做到了,但这会在侧栏上引发错误。警告:session_start() [function.session-start]:无法发送会话缓存限制器 - 标头已发送(输出开始于 C:\xampp\htdocs\trialphp\head.php:38)head.php 基本上是 css 和脚本文件,我已将其导入 home.php。它只包含一些 一些 css 和一些脚本
  • 您得到的错误意味着在开始会话之前输出已经发送到浏览器。在发送任何输出之前,必须在第一行调用session_start()。查看更新的答案。
  • 谢谢,它成功了。这意味着我必须在每个引用会话值的文件之上编写 session_start(),对吧?
  • 从技术上讲,是的。但更简单的方法是制作一个头文件(例如headers.php)。在 headers.php 中,在第一行调用 session_start()。将所有常用函数放入该文件(如果您有函数),然后将该文件包含在每一页的顶部。这样,如果您必须对会话进行更改,则不必编辑每一页,只需编辑 headers.php 中的一个。
  • 太好了,我有几乎所有页面上都包含的 head.php 文件。所以我会用那个。非常感谢:)
猜你喜欢
  • 1970-01-01
  • 2020-09-02
  • 2013-06-07
  • 2019-03-09
  • 2013-01-28
  • 1970-01-01
  • 2013-09-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多