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

时间:2017-05-29 22:28:12

标签: php html session

我目前面临着php会话的问题。我一直在寻找答案,但我担心我的问题太具体了......

问题如下:我正在构建一个只显示一页index.html的网站。此页面包含div #container,每当我通过route()函数选择工具栏中的选项卡时,其内容都会被替换。它有效this way:

一旦Mustache呈现了json数组«articles»,templates.html页面就会包含要替换到页面中的所有信息。 这是相应的#tpl-articles(我删除了不必要的部分)

现在,有一个«登录»标签,它将信息发送到«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);
?>

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

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

2 个答案:

答案 0 :(得分:0)

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

请参阅thisthisthis回答。

祝你好运。

答案 1 :(得分:0)

问题在于:

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));