让它有意义。代码未检测到会话处于活动状态

问题描述 投票:0回答:1

这是最奇怪的事情,我不知道为什么它不起作用。在此网页上,只有当用户登录时,它才会显示内容。我使用 Xampp 在本地计算机上对整个内容进行了编程。我将其上传到服务器,因为它似乎工作正常。在实时服务器上,由于某种原因,它没有检测到会话。为了进行故障排除,我回显了 session_status 函数。它说一个会话处于活动状态,但其余代码却没有。我有另一个想法。我从同一级别的不同目录中的整个页面复制了完美运行的代码,并将其复制到此页面。我将其上传到服务器,突然在另一个文件夹中正常工作的整页代码停止工作。所以基本上我已经确定会话正在启动但没有被重要的代码行检测到。我还尝试从在线服务器中删除该文件夹并重新上传,但这并没有解决问题。那么......为什么这个特定文件夹不想让代码正常工作?请注意,我还检查了该特定文件夹中的所有其他文件。没有人愿意承认会话。

这是文件开头的打开代码,用于连接到数据库,检测会话是否正在进行,并根据会话中存储的信息获取其他信息。

<?php
include '../master-pages/db_connect.php';
session_start();
$email = "";
$errors = array();
$user_email = $_SESSION['email'];
$grab_session_info = "SELECT * FROM users WHERE email = '$user_email'";
$run_info = mysqli_query($conn, $grab_session_info);
if($run_info){
        $session_info = mysqli_fetch_assoc($run_info);
        $user_name = $session_info['name'];
        $user_id = $session_info['user_id'];
        $account_type = $session_info['account_type'];
        $status = $session_info['status'];
}
?>

再往下,有一行代码可以检测某人是否登录,并显示一个附加的导航栏,无论上述内容是真是假。

<?php
            if(isset($_SESSION['email']) || !empty($_SESSION['email'])) {
                include '../master-pages/private-nav.php';
            } else {
                
            }
            ?>

如上所述,我已经完成了相当多的故障排除。检查是否确实设置了会话,查看在另一个文件夹中运行良好的代码是否在此目录中运行。重新上传整个文件夹,以防某些东西(由于缺乏更好的词)在上传时损坏。我一无所有,所以我转向这个社区。

php session directory
1个回答
0
投票

您似乎没有为

$_SESSION['email']
赋值。

至于我如何知道正在设置会话。我使用了该功能 session_status() 检查是否正在设置会话。这 输出为 2,表示会话处于活动状态。

会话可以处于活动状态,但至少根据您提供的代码,您无法为

email
会话变量分配值。如果问题如下:

<?php
if(isset($_SESSION['email']) || !empty($_SESSION['email'])) {
    include '../master-pages/private-nav.php';
} else {
    // Do something else
}
?>

那么

isset($_SESSION['email']
很可能返回 false。考虑将
email
会话变量的值设置为
[email protected]
之类的值,然后立即打印该值,如下所示,并告诉我们结果是什么:

session_start();
$_SESSION['email'] = "[email protected]";
if (isset($_SESSION['email']) {
    echo $_SESSION['email'];
}

此外,您的代码对于 SQL 注入是完全开放的:

$grab_session_info = "SELECT * FROM users WHERE email = '$user_email'";
$run_info = mysqli_query($conn, $grab_session_info);

考虑使用

mysqli_bind_params()
函数甚至 PDO。以下是您可以使用绑定参数进行查询的示例:

// Create your query
$sql = 'SELECT * FROM users WHERE email=?;';
/* Create your bind variables--keep in mind,
the mysqli_stmt_bind_param() function CANNOT take raw values,
they MUST be variables so set them beforehand! */
$fetch_data_from_email = '[email protected]';

function selectMyUser($conn, $sql, $param_types, ...$bind_vars) {
    $stmt = mysqli_stmt_init($conn)
        or die('Your error here');
    mysqli_stmt_prepare($stmt, $sql)
        or die('Your error here');
    mysqli_stmt_bind_param($stmt, $param_types ...$bind_vars)
        or die('Your error here');
    mysqli_stmt_execute($stmt)
        or die('Your error here');
    $result = mysqli_stmt_get_result($stmt)
        or die('Your error here');
    mysqli_stmt_close($stmt)
        or die('Your error here');

    return $result;
}

// Retrieve your data and do something with it:

// The following will only pull the first valid record:
$res = selectMyUser($conn, $sql, 's', $fetch_data_from_email);
if ($res->num_rows > 0) {
    // If a record exists
    $record = mysqli_fetch_assoc($res);
    echo $record['user_id'];
} else {
    // If a record doesn't exist
    echo 'Sorry, but a user with the email '.$fetch_data_from_email.' doesn\'t exist.';
}

's'
$param_types
表示相应类型的
$bind_var
string
。例如,
'i'
代表整数。您可以在这里找到更多相关信息。

© www.soinside.com 2019 - 2024. All rights reserved.