在PHP之间传递$ _SESSION变量值或使用$ GLOBALS来检索存储的变量

时间:2011-04-03 07:35:08

标签: php facebook

我迫切需要帮助来解决这个问题 - 坚持了2天试图谷歌寻求解决方案!

基本上,我正在开发一个facebook flash应用程序。我有一个fbmain.php和index.php,它将检查用户是否登录到facebook。如果是这样,那么它将加载.swf文件,这是我的Flash游戏。我使用$fbme[id]来检索facebook用户的id,以便我可以使用它从数据库中检索玩家的信息来初始化游戏 - 所谓的加载来自之前保存的游戏进程。

为了让保存游戏起作用,我的想法是将facebook用户的id,“$ fbme [id]”存储为$_SESSION变量或$GLOBALS变量,这样当.swf游戏时加载,它将加载“initialize-playerstats.php”,它将从数据库加载玩家的信息。 “initialize-playerstats.php”假设检索存储的变量$_SESSION$GLOBALS并将id与数据库匹配并相应地返回结果。但不知何故,似乎没有检索到变量,因此无法从数据库中加载任何数据。

在我的fbmain.php中:

<?php

$fbconfig['appid'] = "XXX";
$fbconfig['api'] = "XXX";
$fbconfig['secret'] = "XXX";

try {
    include_once "facebook.php";
} catch (Exception $o) {
    echo '<pre>';
    print_r($o);
    echo '</pre>';
}
// Create our Application instance.
$facebook = new Facebook(array(
            'appId' => $fbconfig['appid'],
            'secret' => $fbconfig['secret'],
            'cookie' => true,
        ));

$session = $facebook->getSession();
$loginUrl = $facebook->getLoginUrl(
                array(
                    'canvas' => 1,
                    'fbconnect' => 0,
                    'req_perms' => 'email,publish_stream,status_update,user_birthday, user_location,user_work_history'
                )
);

$fbme = null;
if (!$session) {
    echo "<script type='text/javascript'>top.location.href = '$loginUrl';</script>";
    exit;
} else {
    try {
        $uid = $facebook->getUser();
        $fbme = $facebook->api('/me');
    } catch (FacebookApiException $e) {
        echo "<script type='text/javascript'>top.location.href = '$loginUrl';</script>";
        exit;
    }
}

// Session based graph API call.
if ($session) {
    try {
        $uid = $facebook->getUser();
        $fbme = $facebook->api('/me');
    } catch (FacebookApiException $e) {
        d($e);
    }
}

function d($d) {
    echo '<pre>';
    print_r($d);
    echo '</pre>';
}

?>

在我的index.php中:(代码总结为阅读整理)

<?php
//session_start();
include_once "fbmain.php";
$config['baseurl'] = "http://www.xxx.com/xxx/development/index.php";


//method 1, tried to use session variable.. not working.
$_SESSION['fbId'];

//method 2, tried using $GLOBALS..not working
$GLOBALS['fbId']= $fbme[id];

//method 3, tried using this method got somewhere while googling
$GLOBALS['fbId'];
// the defined constant used to reference the global var
define(_SYSTEM_, 'fbId');

class Foo {

    // a method where you'd liked to access the global var
    public function bar() {
        print_r($this->{_SYSTEM_});
    }

    // the magic happens here using php5 overloading
    public function __get($d) {
        return $GLOBALS[$d];
    }

}
            //tried either of this method one at a time
            $_SESSION['fbId'] = $fbme[id];

            $GLOBALS['fbId'] = $fbme[id];

在initialize-playerstats.php中:

<?php

require_once('docs/php/database.php');
include('docs/php/dbinfo.inc.php');

//tried method 1 to retrieve..failed
$fbId = $_SESSION['fbId'];
//tried method 2..failed
$fbId = $GLOBALS['fbId'];

//tried method 3..failed
$foo = new Foo();
$fbId = $foo->bar();

// create new instance of mysqli class and connect to database
$db = new Database($hostname, $username, $password, $database);

$sql = "SELECT * FROM player WHERE fbId= $fbId";
$result = $db->query($sql);

while ($row = $result->fetch_assoc()) {
    $pWood = $row['wood'];
    $pWater = $row['water'];
    $pFood = $row['food'];
    $pLevel = $row['level'];
    $pExp = $row['exp'];
    $cPopulation = $row['cPopulation'];
    $mPopulation = $row['mPopulation'];

    echo "playerStats=$pWood/$pWater/$pFood/$pLevel/$pExp/$cPopulation/$mPopulation";
}
$db->close();
?>

任何人请帮助我..我会真的很感激..无论如何允许变量在php之间传递将有很大帮助。以某种方式使用$_SESSION['']$GLOBALS无效..提前感谢!

3 个答案:

答案 0 :(得分:1)

我知道这个问题已经过时了,但是我在谷歌上找不到任何相关的答案,所以花了一些时间摸不着头脑,直到我意识到我是多么愚蠢。

简答:您没有将会话ID传递给下一页。

答案很长:如果用户浏览器禁用了cookie,那么PHP会话将不会自动从一个页面传递到另一个页面,非常标准的东西,但由于某种原因(包括我自己),我们认为,因为我们在Facebook编程,所以我们不要需要担心任何正确编码的PHP站点背后的更简单的核心原则。

无论如何,始终将您的会话传递到Facebook应用中的下一页。一旦你开始一个会议; SID被定义为您立即使用的常量。

如果您想查看SID包含的内容,请尝试此操作:

print_r(SID);

您需要做的就是将SID附加到您的href

$link = "../index.php?" . SID;

当你在下一页开始一个会话时,你的脚本现在将通过$ _REQUEST从SID中获取会话,就像启用了cookie一样。原始脚本现在适用于index.php

session_start();
include_once "fbmain.php";
$config['baseurl'] = "http://www.xxx.com/xxx/development/index.php";


//method 1, tried to use session variable.. IS working.
$_SESSION['fbId'];

适用于任何多页Facebook应用。我确定还有其他方法,例如检查浏览器中的cookie,虽然这会刷新页面,以便在设置测试cookie后检测是否使用PHP。

如果您想获得有关Cookies的实时信息,那么您需要使用Javascript。

答案 1 :(得分:0)

我实际上有一个类似的问题,我花了两天时间才意识到,只要我的用户被重定向到我在facebook中的应用程序网址,它就会删除所有变量并从那里开始计数。我的意思是,你需要设置一个

if(!isset(yoursessionvariable)){

     $yoursessionvariable = $_GET['whatever']

}

...为了不丢失您传递给脚本的变量(当重定向完成时,您的变量将被设置为空

这是在你去facebook的应用程序之前发送变量(你的网址)的情况。

希望它有助于节省时间!!

答案 2 :(得分:-1)

$ GLOBALS根本不可行。从代码中删除这种方法并坚持使用会话。然后调试它。
至少我看到你的[长而凌乱的] fbmain.php

没有会话开始

为什么不在更短的代码中测试会话,测试代码?