【问题标题】:Redirect with PHP on Ajax call在 Ajax 调用上使用 PHP 重定向
【发布时间】:2016-04-20 23:24:44
【问题描述】:

我有一个通过 AJAX 调用提交的表单,该表单正在发送到一个名为 function.php 的 PHP 文件。这就是我的 AJAX 调用的样子:

$.ajax({
    type:  'post',
    cache:  false ,
    url:  'function.php',
    data: noteSequence,
    success: function(data) {
        alert(data);

        <?php
            if (defined('RESTRICTED')) {
                if (!isset($_SESSION['logged'])) {
                    header( 'Location: index.php' );
                    exit();
                }
             }
        ?>
    }
});

在 PHP 文件中,我有这个 if 语句。如果这是真的,我希望页面重定向到index.phpheader() 不起作用。我在 AJAX 成功后尝试了window.location.href = 'index.php';,但无论 PHP 语句是否为真,这都是重定向。目前我正在尝试使用会话来重定向用户,但这不起作用。那么有人可以提供解决方案吗?

PHP 代码:

if ($rows == 1) { 
    $_SESSION['logged'];
}

【问题讨论】:

  • 您可以在function.php 中为您的if ( !isset( $_SESSION['logged'] ) ) 条件设置标志并返回它。如果标志为真,则使用location.replace('index.php')重定向用户。
  • 或者我可以将它粘贴到另一个 php 文件中并要求它?
  • 没有,没必要。只需检查function.php 中的登录状态并将结果传递给 ajax。
  • 请检查我发布的答案。

标签: php jquery ajax redirect


【解决方案1】:

在您的 function.php 中执行您的操作,然后在您发送响应的末尾添加以下行

$login_status = false;
if (defined('RESTRICTED')) {
    if (!isset($_SESSION['logged'])) {
        $login_status = true;
    }
}

$response = array();
$response['login_status'] = $login_status;

echo json_encode($response);

在你的 JS 代码中:

$.ajax({
    type:  'post',
    cache:  false ,
    url:  'function.php',
    data: noteSequence,
    success: function(data) {
        data = JSON.parse(data);
        if(data['login_status']) {
            location.replace("index.php")
        } else {
            //do something else
        }
    }
});

【讨论】:

  • 感谢您的回复,感谢。不幸的是,如果 ($rows == 1) { $_SESSION['logged']; } if (defined('RESTRICTED')) { if (!isset($_SESSION['logged'])) { $login_status = true; } } $response = 数组(); $response['login_status'] = $login_status; echo json_encode($response);
  • 我的 PHP 正在完成它的工作,我得到了这个:{"login_status":true} 我认为我在 ajax 上的 if 语句有问题?
  • success: function(data) 是否返回`{"login_status":true}`?
  • 我很警觉(数据);成功后我得到了什么?
  • 试试这个:data = JSON.parse(data); alert(data['login_status']); 就在它之前console.log(data)。查看您获得的数据的确切格式
【解决方案2】:

如果您期望浏览器重定向,则标头不会影响 ajax 调用的浏览器状态,并且浏览器不会导航标头上的地址。相反,您应该使用客户端方法来重定向浏览器,如下所示,

$.ajax({
    type:  'post',
    cache:  false ,
    url:  'function.php',
    data: noteSequence,
    success: function(data) {
        if (data.notloggedin)
            window.location.href = data.href;
        else
            //Your business
    }
});

编辑:在我的示例代码中,您应该为 ajax 调用正确返回数据,json 结果中需要一个 href 属性。您应该编辑与“数据”相关的 ajax 结果的行为

你需要的 php 代码类似于下面的 function.php 但请注意你应该参数化你对 function.php 的请求,否则它将仅用于检查用户的会话。

<?PHP

header('Content-Type: application/json; charset=utf-8');
$myAjaxResult = array();
$myAjaxResult["notLoggedIn"] = true;
if (defined('RESTRICTED')) {
    if (!isset($_SESSION['logged'])) {
        $myAjaxResult["notLoggedIn"] = true;
    }
    else {
        $myAjaxResult["notLoggedIn"] = false;
    }
}
echo json_encode($myAjaxResult);

?>

【讨论】:

  • 感谢您的回复。 Slighlty 很困惑我将如何设置它,但我知道你的意思。所以在我的php文件中我可以有 $redirect = true ,然后在我的ajax中 if $redirect = true redirect ?
  • 不完全一样,我根据您的情况修改了我的答案。但请注意,这不是您业务的全部答案,只是您业务的检查和重定向部分。
猜你喜欢
  • 2014-07-11
  • 1970-01-01
  • 2014-05-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-08
相关资源
最近更新 更多