我迫切需要帮助来解决这个问题 - 坚持了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
无效..提前感谢!
答案 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
为什么不在更短的代码中测试会话,测试代码?