Php Facebook服务器端身份验证-会话变量未赋值

Php Facebook服务器端身份验证-会话变量未赋值,php,facebook,session,login,Php,Facebook,Session,Login,我无法为facebook服务器端登录流中的会话变量分配任何值。。谁能告诉我错误是什么 我曾经得到这样一个错误:headers已经被传递,会话变量无法设置。因此,我在页面开始时设置了启动输出缓冲,并在分配最后一个会话变量后刷新缓冲区。分配似乎不起作用,因为$\u会话['state']和$\u会话['access\u token']具有空值 <?php ob_start(); session_start(); $app_id = "XXXXXXXXXXXXXXXXXXXX";

我无法为facebook服务器端登录流中的会话变量分配任何值。。谁能告诉我错误是什么

我曾经得到这样一个错误:headers已经被传递,会话变量无法设置。因此,我在页面开始时设置了启动输出缓冲,并在分配最后一个会话变量后刷新缓冲区。分配似乎不起作用,因为$\u会话['state']和$\u会话['access\u token']具有空值

   <?php ob_start(); session_start();
    $app_id = "XXXXXXXXXXXXXXXXXXXX";
    $app_secret = "XXXXXXXXXXXXXXXXXXXXXXXXXX";
    $my_url = "http://mydomain.com".$_SERVER['PHP_SELF'];

    $code = $_REQUEST["code"];

    if(empty($code)) 
    {

    $_SESSION['state'] = md5(uniqid(rand(), TRUE)); // CSRF protection

    $dialog_url = "https://www.facebook.com/dialog/oauth?client_id=".$app_id 
."&redirect_uri=".urlencode($my_url)."&state=".$_SESSION['state']."&scope=user_birthday,user_about_me,user_location,user_photos,friends_photos,email,user_website,friends_website,read_friendlists,publish_stream";

    echo("<script> top.location.href='" . $dialog_url . "'</script>");
    ob_end_flush();

    }


   if ($_GET['state'] === $_SESSION['state']) //Ignoring CSRF protection for the moment 
//    since I am unable to assign SESSION variables any value, I actually have this as 
  //  if(200>150)/*
  {


    $token_url = "https://graph.facebook.com/oauth/access_token?"."client_id=".$app_id ."&redirect_uri=" . urlencode($my_url). "&client_secret=".$app_secret."&code=".$code;

    $response = file_get_contents($token_url);

    $params = null;

    parse_str($response, $params);

    $_SESSION["access_ token"] = $params['access_token'];

    ob_end_flush(); // Session Varibale assigned, we can now flush output

    $graph_url = "https://graph.facebook.com/me?access_token=".$params['access_token'] ;

    $user = json_decode(file_get_contents($graph_url), true); 
    }


echo $params['access_token']."is the access token <BR> </BR>"; //this works fine, outputs Access token

echo $_SESSION['access_token']." is the access token" ; //Session Variables are not assigned value since $_SESSION['access_token'] is null

    ?>


对于初学者,为什么要首先使用输出缓冲?嗨,Tommy,谢谢您的评论。如果代码中有空格或行,PHP会发送标题。这些空格会被标识为输出,即使PHP会忽略它们。在输出任何数据之前,需要设置标头,一旦发送标头,就不能再发送标头或设置会话变量。-contdcontd:Output buffering整理内存缓冲区中的所有输出,并仅向客户端发送头,直到解析器遇到ob_end_flush时,将存储在缓冲区中的输出释放给客户端。因此,在ob_start和ob_end_flush之间,我可以在输出行之间设置头和会话变量,同时避免这些行上的错误——“头已发送,无法在行上设置会话变量…”,这是我对输出缓冲的一种使用(或误用)的原始理解,如果我错了,请纠正我。也许我们可以取消“风滚草”徽章