2012-11-21 29 views
6

我知道它看起来像一个平庸的问题,但请阅读整个事情,我被这个难住。AJAX调用破坏没有明显原因的会话

我有我的网页上的一个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呼叫时,会话才会消失。有人可以发现这个问题吗?

+1

我不认为问题是在可见代码中。这里没有什么应该销毁会话变量。 –

+0

我也很确定。那可能是什么原因呢?以前从未发生过我。除了我发布的内容外,其他代码都没有涉及。原始页面(调用是由该页面创建的)甚至没有提及除页面开始处的session_start()之外的任何会话内容。 – jovan

+0

我以前见过这样的问题,而且问题是配置错误的PHP服务器。由于会话使用cookies,我也看到了与浏览器相关的类似问题。您可能想要下载并试用不同的浏览器。它也可能是其他地方的一些代码的问题。根据我在这里看到的,无法真正说出。 –

回答

0

这里的解决方案,通过我的托管服务提供商,他的技术支持团队,给我:

设置suhosin.session.encrypt =关在/ home /用户名/的public_html

设置suPHP_ConfigPath /家/用户名/ public_html在.htaccess中。

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

+0

我面临同样的问题。但我无法像你说的那样解决它。我是否在使用我的应用程序的文件夹的.htaccess中同时使用这两行?我的意思是'设置suhosin.session.encrypt = Off'和'设置suPHP_ConfigPath /文件夹/ ...'。我尝试了第一个设置,并给我服务器错误,可能是语法错误? – mavili

+0

第二行进入.htaccess。至于第一个,我真的不记得,但我相信我在专用服务器上通过WHM进行设置。我相信它也可以通过SSH进行设置,但我不知道要编辑哪个文件。 – jovan

0

请检查表格的开始和结束,非常重要,请检查您是否已将按钮设为onclick并返回false。如果不是,那么它将重定向并且不会在那里进行会话。