为什么PHP会话本身看起来是空的

为什么PHP会话本身看起来是空的,php,session,upload,fetch,Php,Session,Upload,Fetch,我正在建立一个网站,我有2个页面,一个用于登录,一个用于上传文件 当用户登录时,我将从数据库中获取的该用户的ID设置到$\u SESSION变量中,当用户转到第二个页面时,他可以上传一个文件,并将对该文件的引用和ID存储到数据库中 我的前端btw位于完全不同的域中,因此当用户上载文件时,$\u SESSION变量将为空,我如何解决 PHP检查example.com上的登录页面 <?php session_start(); if (isset($_SERVER['HTTP_ORIGIN'

我正在建立一个网站,我有2个页面,一个用于登录,一个用于上传文件

当用户登录时,我将从数据库中获取的该用户的ID设置到
$\u SESSION
变量中,当用户转到第二个页面时,他可以上传一个文件,并将对该文件的引用和ID存储到数据库中

我的前端btw位于完全不同的域中,因此当用户上载文件时,
$\u SESSION
变量将为空,我如何解决

PHP检查example.com上的登录页面

<?php 
session_start();

if (isset($_SERVER['HTTP_ORIGIN'])) {
    header("Access-Control-Allow-Origin: {$_SERVER['HTTP_ORIGIN']}");
    header('Access-Control-Allow-Credentials: true');
    header('Access-Control-Max-Age: 86400');    // cache for 1 day
}

$a = headers_list();

require "Connessione.php";

$connessione = new Connessione();
$ris = $connessione->getUtente($_POST['id']);

if($risposta['esisteGia'])
{
    $_SESSION['ID'] = $ris[0]['IDUtente'];
    $_SESSION['Tipo'] = $ris[0]['Ruolo'];
}


echo json_encode($risposta);
?>
const esisteGia = () => {
    async function controllaCheEsistaGia() {
      let udid = "123";
      let data = new FormData();
      data.append("id", udid);
      let risposta = await fetch(
        "https://example.com/checkLogin.php",
        {
          method: "POST",
          body: data,
          credentials: "include"
        }
      );

      risposta = await risposta.json();
      console.log(risposta);
    }

    controllaCheEsistaGia();
  };


session_start();
if (isset($_SERVER['HTTP_ORIGIN'])) {
    header("Access-Control-Allow-Origin: {$_SERVER['HTTP_ORIGIN']}");
    header('Access-Control-Allow-Credentials: true');
    header('Access-Control-Max-Age: 86400');    // cache for 1 day
}

if(!isset($_SESSION['ID'])). //Here the session is now empty again
{
    header("Location: {$_SERVER['HTTP_ORIGIN']}/Login");
    die();
}
header('Content-Type: application/json; charset=utf-8');


$filePDF = $_FILES['pdfDaCaricare']['tmp_name']; //Also the $_FILES is not set, and I don't know why

此时将设置
$\u会话

example.com上的uploadFile.php

<?php 
session_start();

if (isset($_SERVER['HTTP_ORIGIN'])) {
    header("Access-Control-Allow-Origin: {$_SERVER['HTTP_ORIGIN']}");
    header('Access-Control-Allow-Credentials: true');
    header('Access-Control-Max-Age: 86400');    // cache for 1 day
}

$a = headers_list();

require "Connessione.php";

$connessione = new Connessione();
$ris = $connessione->getUtente($_POST['id']);

if($risposta['esisteGia'])
{
    $_SESSION['ID'] = $ris[0]['IDUtente'];
    $_SESSION['Tipo'] = $ris[0]['Ruolo'];
}


echo json_encode($risposta);
?>
const esisteGia = () => {
    async function controllaCheEsistaGia() {
      let udid = "123";
      let data = new FormData();
      data.append("id", udid);
      let risposta = await fetch(
        "https://example.com/checkLogin.php",
        {
          method: "POST",
          body: data,
          credentials: "include"
        }
      );

      risposta = await risposta.json();
      console.log(risposta);
    }

    controllaCheEsistaGia();
  };


session_start();
if (isset($_SERVER['HTTP_ORIGIN'])) {
    header("Access-Control-Allow-Origin: {$_SERVER['HTTP_ORIGIN']}");
    header('Access-Control-Allow-Credentials: true');
    header('Access-Control-Max-Age: 86400');    // cache for 1 day
}

if(!isset($_SESSION['ID'])). //Here the session is now empty again
{
    header("Location: {$_SERVER['HTTP_ORIGIN']}/Login");
    die();
}
header('Content-Type: application/json; charset=utf-8');


$filePDF = $_FILES['pdfDaCaricare']['tmp_name']; //Also the $_FILES is not set, and I don't know why

example2.com/uploadFile

const caricaFile = async e => {
    const fd = new FormData();
    fd.append("pdfDaCaricare", file);


    await axios.post(
      "example.com/uploadFile.php"
      fd,
      {
        method: "POST",
        credentials: "include",
        headers: {
          "content-type": "multipart/form-data"
        },
        onUploadProgress: function(progressEvent) {
          let percentCompleted = Math.round(
            (progressEvent.loaded * 100) / progressEvent.total
          );
          document.getElementById("percentuale").innerText = percentCompleted;
        }
      }
    );
  };

即使在localhost中,这也不起作用

会话Cookie仅适用于一个域,因此甚至可能会出现会话问题


可能使用不同的方法来验证您的用户。

我的前端btw位于完全不同的域上,这意味着什么。你是说你登录到一个域并从另一个域上传吗?#决不要使用key
['ID']
进行sessionRiggsFolly:我的后端php文件在一个域上,而HTML、CSS和JS文件在另一个域上。泽利卡:这可能是问题所在吗?@DavideVitiello将其更改为
['myId']
或其他任何内容,您将看到:)@DavideVitiello抱歉,我刚刚在PHP7.3上测试了它,并且它与
['ID']
一起工作,所以这可能不是问题。但通常建议您在会话中定义自己的自定义密钥。并始终选中
isset&!空
并且无法将会话cookie从一个域传递到另一个域?对于子域,通过会话cookie在同一域后面传递其他资源。您可以通过某个存储在后端共享会话,然后通过url或其他方式传递会话id来尝试还原会话。不知道为什么有些人开始否决我的答案,似乎他们不明白。检查你的会话cookie,了解它创建了什么域。可能这篇文章还验证了会话cookie值是否在php中,以便可以恢复会话