首页 > 解决方案 > 如何在每次提取中使用相同的 PHP 会话?

问题描述

我正在尝试使用 fetch 在 Javascript 中进行简单的身份验证,以将凭据发布到该文件内的 PHP 文件(login.php),它只是进行身份验证并将一些值添加到 $_SESSION 并在收到响应后立即调用另一个 get fetch 到( sessioninfo.php) 并且这个 php 文件只是返回 $_SESSION 用于测试目的,但我收到了一个空数组,即使我已经在 (sessioninfo.php) 和 (login.php) 中调用了 session_start()。

我尝试使用 axios 和 console.log 响应,每个响应都显示不同的 PHP 会话 ID,我认为这是 $_SESSION 为空的原因。

fetch("http://localhost/login.php/", {
    method: 'POST',
    body: JSON.stringify({username: 'test', password: 'test'})    
})
.then(res => res.json())
.then(data => {
    fetch("http://localhost/sessioninfo.php")
    .then(res => res.json())
    .then(data => console.log(data));
});

编辑:

登录.php

<?php
session_start();
header("Content-Type: application/json");
require_once "../../pdo.php";

/**
 * @var PDO $pdo
 */

$data = json_decode(file_get_contents('php://input'), true);
$sql = "SELECT user_id from users WHERE username=:uname AND password=:pwd";
header("Content-Type: application/json");
$isInit = isset($data['username']) && isset($data['password']);
if($isInit) {
    $stmt = $pdo->prepare(
        $sql);
    $stmt->execute(array(
        ':uname' => $data['username'],
        ':pwd' => $data['password']
    ));
    $row = $stmt->fetch(PDO::FETCH_ASSOC);
    
    if($row != false) {
        $sessionHash = hash('md5', $data['username'].$data['password'].$row['user_id']);
        $_SESSION['ca'] = $sessionHash;
        $_SESSION['user_id'] = $row['user_id'];
        $response = array('isAuth' => true, 'user_id' => $row['user_id'], 'ca' => $sessionHash, 'session' => $_SESSION);
        echo json_encode($response);
    }
    else {
        $response = array('isAuth' => false);
        echo json_encode($response);
    }
}
else {
    $response = array('message' => 'Missing input');
    echo json_encode($response);
}

我认为 login.php 没有问题,因为我用正确的用户名和密码对其进行了测试,并返回了正确的响应

会话信息.php

<?php
session_start();

echo json_encode($_SESSION);

标签: javascriptphpsessionfetch

解决方案


推荐阅读