【问题标题】:PHP Session variable is empty when it's not emptyPHP Session 变量不为空时为空
【发布时间】:2020-07-15 03:01:41
【问题描述】:

我已经建立了一个登录系统,并且保持登录没有问题。用户ID和用户名都存储为会话变量(并存储在数据库的表中),我可以访问它们以供使用在页面本身的html内就好了。

我有一个包含多个选择题的表格。我在表格中输入的任何答案都正确存储在数据库中,没有问题。但是当我尝试将用户名或 id 放入表中时,它不起作用。

用户名显示在 html 中的survey.php(上面有表单的页面)上,如下所示:

<h2><?php
    echo $_SESSION['userName'];
?></h2>

在我提交表单之前,用户名已正确显示。提交表单后,相同的页面重新加载并且用户名仍然正确显示。我没有被注销。 $_SESSION['userName'] 未被重置且不为空。

下面的代码按原样完美运行,但如果我替换

$locationMC = $_POST['locationMC'];


$locationMC = $_SESSION['userName']; # (the commented out line in the code below)

它会将我重定向到 /survey.php?error=emptyfields,因此当我尝试使用会话变量时没有设置 $locationMC。

用户表和测试表在同一个数据库中。 UserID 设置为主键,但 userName 未编入索引。

有些东西告诉我我在这里遗漏了一些超级基本的东西——我对此真的很陌生——但是在谷歌上搜索了几个小时后,我无法弄清楚问题出在哪里。感谢您的帮助!

<?php
if (isset($_POST['submit'])) {
    
    require 'dbh.inc.php';
    
    $locationMC = $_POST['locationMC'];
    # $locationMC = $_SESSION['userName'];
    $genderMC = $_POST['genderMC'];
    $religionMC = $_POST['religionMC'];
    

    if (empty($locationMC)) {
        header("Location: ../survey.php?error=emptyfields");
        exit();
    }
    else {
        $sql = "INSERT INTO testingtable (locationMC, genderMC, religionMC) VALUES (?, ?, ?)";
        $stmt = mysqli_stmt_init($conn);
        if (!mysqli_stmt_prepare($stmt, $sql)) {
            header("Location: ../survey.php?error=sqlerror");
            exit();
        } else {
            mysqli_stmt_bind_param($stmt, "sss", $locationMC, $genderMC, $religionMC);
            mysqli_stmt_execute($stmt);
            header("Location: ../survey.php");
            exit();
        }
    }
    mysqli_stmt_close($stmt);
    mysqli_close($conn);
}
else {
    header("Location: ../survey.php");
    exit();
}

下面是 dbh.inc.php。它与注册和登录时使用的文件相同。

<?php
$servername = "localhost";
$dBUsername = "root";
$dBPassword = "";
$dBName = "testingdb";

$conn = mysqli_connect($servername, $dBUsername, $dBPassword, $dBName);

if (!$conn) {
    die("Connection failed: ".mysqli_connect_error());
}

【问题讨论】:

  • 你是否将 session_start() 添加到 PHP 文件的顶部?
  • 你怎么知道不是空的。你试过 print_r($_SESSION);
  • @Ainz-sama 是的。
  • @smartdroid 在页面本身上,我做了 print_r($_SESSION);在运行上述脚本之前和之后,它总是有正确的信息(数组([userId] => 42 [userName] => bob33))。在脚本中,我做了 $genderMC = print_r($_SESSION);它添加到数据库中的只有 1。
  • 如果会话已经启动,则不应添加session_start();,否则您将在每次重新加载时重置会话,这将导致会话用户名在重新加载时为空

标签: php


【解决方案1】:

你需要启动请求会话来读取它的内容

将此代码添加到顶部标题中

if(!isset($_SESSION)) session_start();

【讨论】:

  • 我替换了 session_start();与您发布的内容一样,它并没有改变任何东西。它仍然无法正常工作,但谢谢!
  • 你好,亲爱的,在你的页面顶部添加这段代码,并尝试以这种模式输出所有会话信息echo '&lt;pre&gt;'; print_r($_SESSION); echo '&lt;pre&gt;';
  • 每次我加载页面时它都会给我一个数组 ( [userId] => 42 [userName] => bob33 ),这是它应该显示的。
  • 您的解决方案已部分修复。我可以做 $locationMC = print_r($_SESSION, true);它会将 Array ( [userId] => 42 [userName] => bob33 ) 放入数据库中。但如果我这样做 $locationMC = $_SESSION['userName'];它仍然说该值为空(将我重定向到 error=emptyfields)。非常感谢您的帮助!
  • 问题已解决。有一个错字。现在一切正常,所以你的解决方案修复了它。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-03-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-25
相关资源
最近更新 更多