我有一个signup.php页面,其中包含通过facebook按钮登录的内容。页面结构是这样的
<?php
if(!isset($_SESSION['logged_in']))
{
echo '<div id="results">';
echo '<!-- results will be placed here -->';
echo '</div>';
echo '<div id="LoginButton">';
echo '<a href="#" rel="nofollow" class="fblogin-button" onClick="javascript:CallAfterLogin();return false;">Login with Facebook</a>';
echo '</div>';
}
else
{
echo 'Hi '. $_SESSION['user_name'].'! You are Logged in to facebook, <a href="?logout=1">Log Out</a>.';
}
?>
此页面上使用的ajax代码调用另一个页面process_facebook.php并在后端处理数据。 signup.php页面中用于ajax的代码是
<script type="text/javascript">
window.fbAsyncInit = function() {
FB.init({
appId: '<?php echo $appId; ?>',
cookie: true,xfbml: true,
channelUrl: '<?php echo $return_url; ?>channel.php',
oauth: true
});
};
(function() {
var e = document.createElement('script');
e.async = true;e.src = document.location.protocol +'//connect.facebook.net/en_US/all.js';
document.getElementById('fb-root').appendChild(e);}());
function CallAfterLogin(){
FB.login(function(response) {
if (response.status === "connected")
{
LodingAnimate(); //Animate login
FB.api('/me', function(data) {
if(data.email == null)
{
//Facbeook user email is empty, you can check something like this.
alert("You must allow us to access your email id!");
ResetAnimate();
}else{
AjaxResponse();
}
});
}
},
{scope:'<?php echo $fbPermissions; ?>'});
}
//functions
function AjaxResponse()
{
//Load data from the server and place the returned HTML into the matched element using jQuery Load().
$( "#results" ).load( "process_facebook.php" );
}
//Show loading Image
function LodingAnimate()
{
$("#LoginButton").hide(); //hide login button once user authorize the application
$("#results").html('<img src="img/ajax-loader.gif" /> Please Wait Connecting...'); //show loading image while we process user
}
//Reset User button
function ResetAnimate()
{
$("#LoginButton").show(); //Show login button
$("#results").html(''); //reset element html
}
</script>
现在的问题是process_facebook.php页面在后端使用fb数据,然后重定向回signup.php页面并显示process_facebook.php页面打印的数据(可选)。我想要的是,而不是从process_facebook.php页面重定向回signup.php页面并显示其数据,我希望重定向到另一个页面,不仅新数据应该从新页面加载,但网址也应该得到已更改。(即www.example.com/app/signup.php应更改为www.example.com/app/profile.php)
我忘记提及,但我尝试使用header()进行重定向,但它只是获取profile.php页面的数据,但显示了www.example.com/app/signup.php url ..现在问题在于它如果我出于任何原因刷新页面,那么旧的signup.php页面的数据将被加载
答案 0 :(得分:1)
在函数文件中粘贴下面的函数: -
function redirect($url=NULL)
{
if(is_null($url)) $url=curPageURL();
if(headers_sent())
{
echo "<script>window.location='".$url."'</script>";
}
else
{
header("Location:".$url);
}
exit;
}
并调用此函数:
redirect($url);
所以当你从facebook获取数据时,所以在对$ user_profile进行检查后,你可以通过上面的函数重定向用户,这个函数将检查是否已经发送了头,然后它将使用javascript,否则它将使用Header()。< / p>
答案 1 :(得分:0)
在将任何HTML输出到客户端之前,标题需要位于页面顶部。您还可以在服务器进入页面时输出数据&#34;写入&#34; HTML到客户端。
在任何HTML之前,但在打开PHP之后使用它:
header('Location: http://www.example.com/');
答案 2 :(得分:0)
如果我按照正确的方式操作,您就可以使用Facebook进行用户会话,并且您使用的所有Facebook代码都是Javascript,因此您希望使用javascript进行重定向...
document.location = '/profile.php';
这需要在后端调用完成的任何地方完成。
答案 3 :(得分:0)
只需在标题调用后应用die();
。
答案 4 :(得分:0)
正如哈利所说,你肯定会想通过JS来做这件事。
document.location = '/profile.php';
function CallAfterLogin(){
FB.login(function(response) {
if (response.status === "connected")
{
LodingAnimate(); //Animate login
FB.api('/me', function(FBdata) {
if(FBdata.email == null)
{
//Facbeook user email is empty, you can check something like this.
alert("You must allow us to access your email id!");
ResetAnimate();
}else{
//you need to call some php script via ajax here to send these details to your server.
$.post('fbResponseParse.php',FBdata)
// your php should return some sort of an ok, or even a url for you to redirect to.
//if it fails you need to display an error not redirect.
.done(function(data){
//data in this scope is the response from your php script.
if(data.success) document.location = '/profile.php';
else displayError(data.errorMess)
})
}
});
}
},
{scope:'<?php echo $fbPermissions; ?>'});
}
所以你正在做的是使用JS与Facebook交谈。然后根据该响应,您通过AJAX将其发送到您的后端。您的后端应该解析数据,创建会话详细信息,最重要的是,虽然它会向您发送成功(bool)和errorMess(如果适用),然后您使用.done来解析成功/失败并呈现消息。除非facebook的内容成功,否则这将使客户端保持在注册页面上。