2012-11-21 13 views
6

Wiem, że wygląda to banalnie, ale proszę przeczytaj całość, jestem tym zaskoczony.Połączenie AJAX niszczy sesję bez wyraźnego powodu.

Mam wywołanie AJAX na jednej z moich stron, to dynamiczny system wiadomości:

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

    } 

Jest zaimplementowany jako synchroniczne z jakiegoś powodu, że nie jest to problem tutaj. Próbowałem przejść na asynchroniczny i problem pozostaje.

ten plik send_message.php, po prostu chwyta zmienne POST i zapisuje je do bazy danych:

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

?> 

Jednak, kiedy próbuje zapisać zmienną $ _SESSION [ „id_user”] (jak nadawca) Znalazłem problem - okazuje się, że sesja jest niszczona za każdym razem, gdy uruchomione jest wywołanie AJAX! Czynienie print_r($_SESSION) zaraz po session_start() drukuje pustą tablicę.

Sesja jest żywa na oryginalnej stronie, a odświeżenie tej strony utrzymuje sesję przy życiu. Dopiero po kliknięciu przycisku, aby wykonać wywołanie AJAX, sesja znika. Czy ktoś może wykryć problem?

+1

Nie sądzę, że problem jest widoczny w widocznym kodzie. Nic tutaj nie powinno niszczyć zmiennej sesji. –

+0

Jestem tego także pewien. Jaka może być tego przyczyna? Nigdy wcześniej mi się nie zdarzyło. Naprawdę nie ma kodu związanego z tym, co napisałem. Oryginalna strona (z której wywoływane jest wywołanie) nie wspomina o żadnych elementach sesji z wyjątkiem session_start() na początku strony. – jovan

+0

Widziałem już takie problemy, a problemem był źle skonfigurowany serwer PHP. Widziałem również podobne problemy związane z przeglądarką, ponieważ sesje używają plików cookie. Możesz pobrać i wypróbować inną przeglądarkę tylko po to, by mieć pewność. Może to być również problem z jakimś kodem gdzieś indziej. Naprawdę nie mogę powiedzieć z tego, co tu widzę. –

Odpowiedz

0

Oto rozwiązanie, podane mi przez he zespołu pomocy technicznej mojego dostawcę usług hostingowych:

Set suhosin.session.encrypt = Off w/home/nazwa_użytkownika/public_html

Set suPHP_ConfigPath/home/nazwa_użytkownika/public_html w .htaccess.

I to wszystko, działa teraz. Nie ma czasu na zbadanie tych ustawień w tym momencie, ale mam nadzieję, że pomoże to komuś w tej samej sytuacji.

+0

Mam do czynienia z tym samym problemem. Ale nie mogłem tego naprawić, tak jak powiedziałeś. Czy używam obu tych wierszy w .htaccess folderu, w którym mam swoją aplikację? przez oba mam na myśli 'Set suhosin.session.encrypt = Off' i' Set suPHP_ConfigPath/folder/... '. Próbowałem pierwsze ustawienie i daje mi błąd serwera, prawdopodobnie coś nie tak z składni? – mavili

+0

Druga linia przechodzi w .htaccess. Co do pierwszego, szczerze mówiąc, nie pamiętam, ale wierzę, że ustawiłem to przez WHM na moim dedykowanym serwerze. Jestem pewien, że można go również ustawić przez SSH, ale nie wiem, który plik edytować. – jovan

0

proszę sprawdzić formę zaczyna się i kończy i bardzo ważne proszę sprawdzić, czy podałeś przycisk jak onclick z return false.if nie wtedy przekieruje i nie daje tam żadnej sesji.

Powiązane problemy