2012-11-21 8 views
6

Tôi biết nó trông giống như một câu hỏi banal nhưng xin vui lòng đọc toàn bộ điều, tôi stumped bởi điều này.Cuộc gọi AJAX phá hủy phiên không có lý do rõ ràng

Tôi có một cuộc gọi AJAX vào một trong các trang của tôi, đó là một hệ thống tin nhắn động:

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

    } 

Nó thực hiện như đồng bộ vì một lý do, đó không phải là vấn đề ở đây. Tôi đã thử chuyển sang không đồng bộ và vấn đề vẫn còn.

Đây là tập tin send_message.php, nó chỉ lấy các biến POST và lưu chúng vào cơ sở dữ liệu:

<?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>"; 
} 

?> 

Tuy nhiên, khi tôi cố gắng để tiết kiệm $ _SESSION [ 'id_user'] biến (như người gửi) Tôi tìm thấy một vấn đề - nó quay ra phiên đang được tiêu diệt mỗi khi cuộc gọi AJAX này chạy! Vì vậy, hãy thực hiện print_r($_SESSION) ngay sau session_start() in một mảng trống.

Phiên đang hoạt động trên trang gốc, và làm mới trang đó giữ phiên còn sống. Chỉ khi tôi nhấp vào nút để thực hiện cuộc gọi AJAX, phiên sẽ biến mất. Ai đó có thể phát hiện vấn đề?

+1

Tôi không nghĩ rằng sự cố nằm trong mã hiển thị. Không có gì ở đây nên phá hủy biến phiên. –

+0

Tôi cũng khá chắc chắn về điều đó. Điều gì có thể là một nguyên nhân có thể cho điều này, sau đó? Chưa bao giờ xảy ra với tôi trước đây. Có thực sự không có mã liên quan khác hơn những gì tôi đã đăng. Trang gốc (mà cuộc gọi được tạo từ) thậm chí không đề cập đến bất kỳ công cụ phiên nào ngoại trừ session_start() ở đầu trang. – jovan

+0

Tôi đã gặp sự cố như thế này trước đây và sự cố là máy chủ PHP được định cấu hình sai. Tôi cũng đã thấy các sự cố tương tự liên quan đến trình duyệt, vì các phiên sử dụng cookie. Bạn có thể muốn tải xuống và dùng thử một trình duyệt khác để đảm bảo. Nó cũng có thể là một vấn đề với một số mã ở một nơi khác. Có thể không thực sự nói từ những gì tôi thấy ở đây. –

Trả lời

0

Dưới đây là các giải pháp, như được đưa ra đối với tôi bởi ông nhóm hỗ trợ kỹ thuật của nhà cung cấp hosting của tôi:

Set suhosin.session.encrypt = Off trong/home/username/public_html

Set suPHP_ConfigPath/home/tên người dùng/public_html trong .htaccess.

Và đó là nó, hoạt động ngay bây giờ. Không có thời gian để điều tra các cài đặt này vào thời điểm này, nhưng tôi hy vọng điều này sẽ giúp ai đó trong cùng một tình huống.

+0

Tôi đang đối mặt với cùng một vấn đề. Nhưng tôi không thể sửa nó như bạn đã nói. Tôi có sử dụng cả hai dòng này trong .htaccess của thư mục mà tôi có ứng dụng của mình không? bởi cả hai tôi có nghĩa là 'Đặt suhosin.session.encrypt = Off' và' Đặt suPHP_ConfigPath/thư mục/... '. Tôi đã thử cài đặt đầu tiên và cung cấp cho tôi lỗi Máy chủ, có thể đã xảy ra lỗi với cú pháp? – mavili

+0

Dòng thứ hai nằm trong .htaccess. Đối với người đầu tiên, tôi thành thật không thể nhớ nhưng tôi tin rằng tôi đặt nó thông qua WHM trên máy chủ chuyên dụng của tôi. Tôi chắc chắn rằng nó cũng có thể thiết lập nó thông qua SSH, nhưng tôi không biết tập tin để chỉnh sửa. – jovan

0

hãy kiểm tra biểu mẫu bắt đầu và kết thúc và rất quan trọng, vui lòng kiểm tra xem bạn đã đưa ra nút như onclick với return false.if không thì nó sẽ chuyển hướng và cung cấp cho bạn không có phiên đó.