2012-11-21 28 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。如果不是,那麼它將重定向並且不會在那裏進行會話。