AJAX调用没有明显原因破坏会话

时间:2012-11-21 20:24:12

标签: 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调用运行时会破坏会话!所以在print_r($_SESSION)打印空数组后立即执行session_start()

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

2 个答案:

答案 0 :(得分:0)

请检查表格的开始和结束,非常重要请检查您是否已将按钮设为onclick并返回false.if然后它将重定向并在那里没有会话。

答案 1 :(得分:0)

以下是我的托管服务提供商的技术支持团队给我的解决方案:

在/ home / username / public_html中设置suhosin.session.encrypt = Off

在.htaccess中设置suPHP_ConfigPath / home / username / public_html。

就是这样,现在有效。此时没有时间调查这些设置,但我希望这可以帮助处于同样情况的人。