PHP会话从一个脚本到另一个脚本忘记了



我目前面临PHP会话问题。我一直在寻找答案,但恐怕我的问题太具体了...

问题是:我正在建立一个仅显示一个页面index.html的网站。此页面包含一个Div #Container,每次我通过路由((函数在工具栏中选择一个选项卡时,其内容都会被替换。它这样工作:

templates.html页面包含所有要替换到页面上的信息,一旦小胡子渲染了JSON数组«atrays»。这是相应的#tpl-Article(我删除了不必要的部分(

现在,有一个"登录"选项卡,它将信息发送到«connexion.php»脚本。此脚本设置$ _Session ['user_id']和$ _session ['user_surname']。我的问题是:如果我在另一个选项卡上 - 说«默认»一个(在同一index.html页面上( - 我的load_articles.php不知道上述$ _Session变量:/

这是«connexion.php»代码:

<?php
header('Cache-Control: no-cache, must-revalidate');
header('Expires: Mon, 01 Jul 1980 05:00:00 GMT');
header('Content-type: application/json; charset=utf-8');
header('Access-Control-Allow-Origin:*');
session_name('MODAL'); 
session_start();
ini_set('session.use_cookies', 0);
ini_set('session.use_only_cookies', 0);
ini_set('session.use_trans_sid', 1);
$msgJson = array();
$msg = array('session_id' => session_id());
array_push($msgJson, $msg);
// info from the «log in» tab
$email = strip_tags($_POST['email']);
$password = strip_tags($_POST['password']);

require('database.php');
$dbh = Database::connect();
$query  = "SELECT * FROM `users` WHERE `email`=? AND `password`=?";
$sth = $dbh->prepare($query);
$sth->execute(array($email,sha1($password)));
$tab = $sth->fetchAll(PDO::FETCH_ASSOC);
if (count($tab) == 1) {
    $_SESSION['user-id'] = $email;
    $_SESSION['user_surname'] = $tab[0][surname];
    $msg = array('success' => $_SESSION['user_surname']);
} 
else {
    $msg = array('error' => 'Fail');
}
array_push($msgJson, $msg);
echo json_encode($msgJson);
?>

这是Load_articles.php,不知道$ _Session变量:

<?php
header('Cache-Control: no-cache, must-revalidate');
header('Expires: Mon, 01 Jul 1980 05:00:00 GMT');
header('Content-type: application/json; charset=utf-8');
header('Access-Control-Allow-Origin:*'); 
session_name('MODAL');
session_start();
require 'database.php';
$dbh = Database::connect();
if ( !isset($_SESSION['user-id’])){
    $query = 'something';
    $sth = $dbh->prepare($query);
    $sth->execute();
    $result = $sth->fetchAll(PDO::FETCH_ASSOC); 
}
else {
    $query = 'something_else';
    $sth = $dbh->prepare($query);
    $sth->execute(array(
            $_SESSION['user-id'],
            $_SESSION['user-id']
            ));
    $result = $sth->fetchAll(PDO::FETCH_ASSOC);
}
echo json_encode($result);
?>

有人会碰巧理解为什么这些会话变量似乎消失了吗?我究竟做错了什么 ?是否应该先从php代码指定session_start((生成index.html页面?这对我来说将是一个巨大的问题...

事先感谢您的帮助和耐心,我是初学者:/

您的session功能应放在页面中的第一行上。因此,带上session_start(),会话在页面顶部功能,例如在所有其他header代码上。

请参阅此答案。

祝你好运。

问题在这里:

header('Cache-Control: no-cache, must-revalidate');
header('Expires: Mon, 01 Jul 1980 05:00:00 GMT');
header('Content-type: application/json; charset=utf-8');

只需删除它们即可。

php代码未在浏览器上缓存,以担心告诉浏览器必须自动预期



奖金:

尝试此代码

<?php
ini_set('display_errors', 1);
error_reporting(E_ALL);
session_start();
header('Access-Control-Allow-Origin:*'); 
require 'database.php';
$dbh = Database::connect();
function responseJSON($data, $exit = true) {
  header('Content-type: application/json');
  echo json_encode($data);
  if($exit) exit(0);
}  
$userId = isset($_SESSION['user-id']) ? $_SESSION['user-id'] : null;
if($userId) {
   $query = 'something_else';
   $sth = $dbh->prepare($query);
   $sth->execute([$userId, $userId]);
   responseJSON($sth->fetchAll(PDO::FETCH_ASSOC));
}

$query = 'something';
$sth = $dbh->prepare($query);
$sth->execute();
responseJSON($sth->fetchAll(PDO::FETCH_ASSOC));

最新更新