2013-07-08 72 views
0

我有這個jquery Ajax函數在網頁中登錄。

url="<?php echo Yii::app()->createUrl("security/login") ?>" 

       $.ajax({      
        type:"POST", 
        url:url, 
        data:{}, 
        success: function (jsonResponse) { 
         var json=JSON.parse(jsonResponse); 

         if(json.result == "SUCCESS") 
         { 
          <?php $_SESSION['LOGGED_USER']="USER"; ?> 
         } 

        }, 
        error: function (jqXHR, textStatus, errorThrown) { 
          console.log(errorThrown); 
        }  
       }); 

在我的看法佈局我有這個

session_start(); 

if(isset($_SESSION['LOGGED_USER'])) 
{ 
    print_r("LOGGED"); 
} 
else 
{ 
    print_r("NOT LOGGED"); 
} 

當我首次到頁面中輸入它打印「沒有登錄」,但似乎它會自動設置會話,這樣,當我重新加載頁面打印「LOGGED」。

如何在我的ajax請求中正確設置會話?

非常感謝你:)

+0

請注意,'if(json.result ==「SUCCESS」) {?php $ _SESSION ['LOGGED_USER'] =「USER」; ?> }'設置$ _SESSION ['LOGGED_USER']在那個ajax請求成功之前。因此,第一次看到「NOT LOGGED」,但是您登錄並設置了$ _SESSION ['LOGGED_USER']。然後刷新頁面並查看「LOGGED」。希望原因是明確的:) – Fallen

+0

@穆罕默德赫德耶特:呃...不。根據服務器的配置方式以及腳本的位置,PHP部分會導致語法錯誤或運行腳本加載的時間。 – cHao

+0

謝謝大家的回答,我的腳本讓我的控制器設置了會話變量,它完美地工作。 :) –

回答

0

這似乎是一個很多人都感到困惑的客戶端服務器VS當談到阿賈克斯。讓我看看我是否可以清除:

  • 您的JS運行在瀏覽器(客戶端)。 PHP在服務器上運行。這兩種語言可以在完全不同的機器上運行;他們不共享相同的變量或任何東西。他們不直接對話,或者甚至對彼此都瞭解甚麼。他們唯一的溝通方式是通過HTTP請求。 (好吧,也有WebSockets ...但這有點高級了。)

  • JS和PHP通常不會同時運行。根據你的設置和腳本的存在位置,有兩件事情正在發生,在這種情況下,任何一件都不是你想要的。

    • JS是在某種類型的文件中,服務器不提供給PHP。當瀏覽器看到它時,PHP代碼仍然存在於文件中,並且當JS嘗試運行時會導致語法錯誤。可能在你做Ajax帖子之前。

    • JS處於某種類型的文件中,服務器確實向提供了源。 PHP解釋器忠實地瀏覽該文件,找到其中的所有PHP代碼,並解析並運行它。其中的PHP代碼在服務器上運行,甚至可能在頁面被髮送到瀏覽器之前運行。 (並且由於PHP不會說JS,甚至不在意它生成的是有效的HTML還是JS ...頁面中的任何非PHP代碼都是不相關的。)無論如何,在瀏覽器運行腳本時上面,它看起來像這樣:

      ... 
           success: function (jsonResponse) { 
            var json=JSON.parse(jsonResponse); 
      
            if(json.result == "SUCCESS") 
            { 
             } 
      
           }, 
      ... 
      

    ,因爲PHP已經通過了文件並解釋有關設置$_SESSION['LOGGED_USER']位。如果用戶有一個活動的會話,或者沒有登錄,那麼LOGGED_USER變量將被設置爲瀏覽器請求該頁面的第二個變量。

處理security/login請求的PHP腳本需要設置會話變量。你的JS無法做到這一點,因爲會話數據完全是服務器端的,並且你不能讓瀏覽器馬上啓動,並告訴服務器運行任意PHP代碼而不會造成巨大的安全漏洞。 (想象一下,如果瀏覽器可能會說「嘿,PHP,運行這個」會發生什麼,我所要做的就是彈出一個JS控制檯,看看你是如何做的......至少,我或者,如果你真的想要的話,你可以創建另一個頁面,JS發佈到,這將設置會話數據,可以在控制檯中寫一行JS來設置該變量是否我登錄或不)。 。這似乎是一種浪費,但是......安全地做起來可能相當困難。 (如果PHP不知道你已經登錄,你將不得不重新進行身份驗證。)除非由於某種原因,我不會考慮它,security/login不能被修改。

+0

非常感謝您的先生,這是一個非常好的解釋,我感謝您的努力寫作:) –