php - AJAX 调用在没有明显原因的情况下破坏 session

标签 php javascript ajax session

我知道这看起来像是一个老生常谈的问题,但请阅读整篇文章,我被这个难住了。

我的一个页面上有一个 AJAX 调用,它是一个动态消息系统:

function validateMessage(){

  var recipient = document.getElementById("send_to").value;
  var subject = document.getElementById("popup_subject").value;
  var message = document.getElementById("popup_message").value;

  var parameters="message="+message+"&recipient="+recipient+"&subject="+subject;

   if (window.XMLHttpRequest)
    {// code for IE7+, Firefox, Chrome, Opera, Safari
    xmlhttp=new XMLHttpRequest();
   }
   else
   {// code for IE6, IE5
    xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
   }

   xmlhttp.onreadystatechange=function()
  {
  if (xmlhttp.readyState==4 && xmlhttp.status==200)
    {
        document.getElementById("error_mess").innerHTML = xmlhttp.responseText;
    }
  }

  xmlhttp.open("POST","include/send_message.php",false);
  xmlhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded")
  xmlhttp.send(parameters);

  }

它作为同步实现是有原因的,这不是这里的问题。我尝试切换到异步,但问题仍然存在。

这是 send_message.php 文件,它只是抓取 POST 变量并将它们保存到数据库中:

<?php
session_start();
include('db.php');
dbConnect();

$message=$_POST['message'];
$subject=$_POST['subject'];
$recipient=$_POST['recipient'];

$result=mysql_query("select * from korisnici where username='$recipient' ") or die(mysql_error());
$row=mysql_fetch_array($result);
$num=mysql_num_rows($result);

if($recipient=="Poruka za..." || $subject=="Naslov..." || $message=="Poruka" || $recipient=="" || $subject=="" || $message=="")
    echo "<p style='color:red;'>Morate popuniti sva polja.</p>";
elseif($num==0)
    echo "<p style='color:red;'>Korisnik ne postoji.</p>";
else{
    $prima=$row['id_user'];
    $salje=$_SESSION['id_user'];
    mysql_query("insert into poruke (salje, prima, naslov, poruka)
        values ('$salje', '$prima', '$subject', '$message') ") or die(mysql_error());
    echo "<p style='color:green;'>Poruka uspješno poslata!</p>";
}

?>

但是,当我尝试保存 $_SESSION['id_user'] 变量(作为发送者)时,我发现了一个问题 - 结果是每次运行此 AJAX 调用时 session 都被破坏了!因此,在 session_start() 之后立即执行 print_r($_SESSION) 会打印一个空数组。

session 在原始页面本身上处于事件状态,刷新该页面可使 session 保持事件状态。只有当我单击按钮进行 AJAX 调用时, session 才会消失。有人可以发现问题吗?

最佳答案

请检查表单的开始和结束,非常重要的是请检查您是否已将按钮设置为 onclick 并返回 false。如果没有,它将重定向并在那里不给您任何 session 。

关于php - AJAX 调用在没有明显原因的情况下破坏 session ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13501520/

相关文章:

php - mysql_fetch_array 不会呈现 SQL 查询的期望值

javascript - 将 UL 添加到 LI(不将 LI 添加到 UL)

返回 AJAX 响应的 JavaScript 函数(没有 jQuery)?

javascript - 由于 csrf 保护,codeigniter 3 403(禁止)中的 XMLHttpRequest() POST 调用

javascript - JS矩阵乘法问题

javascript - Ajax - 处理正确的数组以传递给 PHP

php - 使用 WSSE 的身份验证提供程序

c# - 无法使用 C# Web 服务在 PHP 中将 stdClass 转换为 String

PHP 输出缓冲检查?

javascript - Vue.js - 刷新时使用当前的 localStorage 更新数组