【问题标题】:empty session value when moving one page to other将一页移动到另一页时为空会话值
【发布时间】:2015-09-29 19:11:29
【问题描述】:

我在访问会话变量值时遇到问题。

我正在创建一个登录页面,这是我设置会话变量的值。

index.php

<?php
session_start();
$result=mysql_query("select * from myuser where id='".$id ."' and password='".$password."'");    
if(mysql_num_rows($result) > 0){
    $user = mysql_fetch_assoc($result);
    $_SESSION['SESS_ID'] = $user['id'];
    $_SESSION['SESS_UNAME'] = $user['username'];
    $_SESSION['SESS_PASS'] = $user['password'];
    header("location:home.php");
    exit();
}
?>

home.php

<?php
session_start();
if(!isset($_SESSION['SESS_ID']) || (trim($_SESSION['SESS_ID'])) == ''){
    header("location:index.php");
    exit();
}
?>

<html>
<body>
    <p>Login Successful</p>
<?php echo $_SESSION['SESS_ID'] ; ?>

</body>
</html>

这里的问题是我在 $_SESSION['SESS_ID'] 中没有值..那么我如何在 home.php 中获取或访问此会话变量的值?

编辑:我对 SQL 的查询是

select * from myuser where id='".$id ."' and password='".$password."'

【问题讨论】:

  • $_SESSION['SESS_ID'] 没有被设置的原因很明显 - mysql_num_rows($result) &gt; 0 并不像你预期的那样正确,它的块永远不会被执行
  • 那我该怎么办大卫??
  • 首先显示您的查询,而不是&lt;!--query written here --&gt;
  • 以及您是否使用相同的 API 进行连接。你还需要一个while 循环。
  • 将错误报告添加到您的打开 PHP 标记之后的文件顶部,例如 &lt;?php error_reporting(E_ALL); ini_set('display_errors', 1);,然后是其余代码,以查看它是否产生任何结果。还要将or die(mysql_error()) 添加到mysql_query()

标签: php mysql session


【解决方案1】:

关于您为什么会遇到此问题的几点说明:

  • 您填充 $_SESSION 数组的值直接来自数据库,但您没有数据库 SQL 查询 - 相反,您有

"!--查询写在这里--"

如果您可以将此占位符替换为返回您的 idusernamepassword 值的查询,那么您的代码应该会按预期执行。

我不确定你的语法是否错误,但这不是我会布置的形状,我自己的形状是:

   $result = mysqli_query($connection, $sql);
    while ($outputrow = mysqli_fetch_array($result)){
       // In here $outputrow is an array of ONE row of your database, so
       // $outputRow['id'] = the id from one row. ordered by the ORDER BY in your SQL query. 
    }
  • 在 SQL 查询中添加 mysqli_error($connection) 子句以检测错误。如:

这里:

  $result=mysqli_query($connection, "<!--query written here -->") or die("error :".mysqli_error($connection));
  • 正如我在这些示例中所使用的那样,请停止使用 MySQL 并至少使用 MySQLi 甚至 PDO。有许多改进和错误修复以及大量关于 SO 过渡的信息。

  • 另外,永远,永远不要将密码作为字符串进行比较,保存到数据库的密码至少应使用 PHP 函数 password_hash() 保存为哈希值。永远不要拨打if($_POST['pwd'] == $row['pwd']){

  • 最后,正如 Fred-ii- 在 cmets 中正确提到的,将错误记录和检查添加到您的脚本中,以便您了解发生了什么:

如:

error_reporting(E_ALL); 
ini_set('display_errors', 1);

将这些添加到您的 PHP 页面的最顶部,它们会向您显示错误和警告,以便您查看哪些功能有效,哪些无效。

编辑:

根据您的编辑,有两个 biq 问题,您的陈述是:

"select * from myuser where id='".$id ."' and password='".$password."'

那么$id$password 的值从何而来?是页面顶部的&lt;?php,如果是这样,这些变量将始终为空,您需要为这些变量应用一个值。

【讨论】:

  • 我会用while替换if循环吗?
  • 是的,使用我在回答中的模板结构格式。
  • 在使用 while 循环后,我的页面没有打开它的唯一加载
  • 您需要一次更改 1 步,如果您复制/粘贴了我的 while 循环,那么您需要确保您的页面版本使用的是 MySQL 而不是 MySQLi
  • 是的,我使用的是正确版本的 mysql,而不是 mysqli,并且没有显示错误,因为页面仅在服务器上加载,如果我使用 if 循环,则页面立即打开,但会话值为空
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-12-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-28
  • 2017-03-02
  • 1970-01-01
相关资源
最近更新 更多