2011-03-23 94 views
2

我有一個Facebook的iframe應用程序。一旦應用程序授權確認,我從簽名的請求中獲取一些數據並將其放入會話中:在Facebook AJAX請求中維護PHP會話

<?php 
    session_start(); 
    $signed_request = $_REQUEST["signed_request"]; 
    list($encoded_sig, $payload) = explode('.', $signed_request, 2); 
    $data = json_decode(base64_decode(strtr($payload, '-_', '+/')), true); 
    if(empty($data["user_id"])) { 
     echo("<script> top.location.href='$auth_url'</script>"); 
     exit; 
    } 
    $_SESSION['fb_id'] = $data['user_id']; 
?> 

簡單吧?所以現在用戶可以與我的應用進行交互,並且最終的用戶動作觸發AJAX請求。我使用jQuery這個:

$.ajax({ 
    type:'POST', 
    url:'include/handler.php', 
    data:'name=value', 
    success: function(msg) { 
     alert("Success: "+msg); 
    }, 
    error: function(msg) { 
     alert("Fail: "+msg);  
    } 
}); 

所以後來在handler.php,我需要使用以前保存會話值,但會是空的。

<?php 
    session_start(); 
    echo $_SESSION['fb_id']; 
?> 

顯然這些代碼片段是簡化的,但任何人都可以向我解釋這一點嗎?我有一種感覺,我正在做一些愚蠢的事情,但這是漫長的一天。

+0

ajax調用是否使用相同的會話?每次獲得新會話都會顯示爲fb_id變量不是「粘住」的,因爲它是在其他會話中設置的。 – 2011-03-23 18:50:53

+0

我不得不假定他們不是昨晚,最後完全放棄了會議。我已經通過不使用會話解決了該問題,但我仍然很感激爲什麼發生這種情況的解釋。 – shanethehat 2011-03-24 09:35:58

回答

0

原來,這是由我使用的共享主機環境引發的問題。無論出於何種原因,源自AJAX或Flash的請求都使用唯一的會話ID進行處理。修復只是轉移到一個不同的託管服務提供商。

+0

爲了進一步闡明:我不知道奇怪的會話行爲是否由於舊提供程序的設置而導致的,但是使用不同的主機並在本地測試會話數據的預期效果。 – shanethehat 2011-10-14 16:12:41

0

$阿賈克斯({ ..., 緩存:假的, ... }); 如果您使用的是IE,這可能是IE緩存ajax請求的問題。或者,如果facebook圖api請求與ajax請求同時運行,則可能存在一些計時問題。

+0

對不起,這個問題發生在所有的瀏覽器中,並且當不應該有任何api請求激活時,請求是在用戶交互中進行的。 – shanethehat 2011-04-02 10:46:54

0

爲什麼不傳遞給handler.php的Facebook ID?

... 
url:'include/handler.php?fb_id=<?php $_SESSION['fb_id']?>', 

而在handler.php中,檢查會話和傳遞的變量。

+0

目標是通過Ajax請求傳遞除用戶提供的表單數據以外的任何內容。這已經通過採取不同的方法得到糾正,但我仍然歡迎解釋爲什麼$ _SESSION在我的原始示例中是空的。 – shanethehat 2011-04-07 08:15:55