【问题标题】:POST variable from jquery redirecting but is not set来自 jquery 重定向但未设置的 POST 变量
【发布时间】:2018-03-28 10:22:24
【问题描述】:

我最近问了一个问题,关于将 POST 变量从 jquery 发送到另一个 php 页面,重定向到该页面,对发送的信息执行一些操作,然后重定向到原始页面。

jQuery post method and directory confusion

我正在就几乎完全相同的代码寻求帮助,因为评论它的人只回答了我的一半问题并将其标记为重复。虽然它确实有帮助,但并没有解决问题。

我已根据之前尝试解决此问题的建议进行了编辑。如您所见,在此示例中点击保存按钮将带您到第一个重定向 changePage.inc.php,但不会发生第二个重定向,这应该带您到 secondPage.php。

名为 index.php 的文件

<?php
    session_start();
?>

<!DOCTYPE html>
<html>
<script src="https://code.jquery.com/jquery-3.2.1.min.js"
    integrity="sha256-hwg4gsxgFZhOsEEamdOYGBf13FyQuiTwlAQgxVSNgt4="
    crossorigin="anonymous">
</script>
<script>
    $(document).ready(function(){
        $('#saveForm').submit(function(event){
            event.preventDefault();
            var message = "";

            var changeText = function(){
                message = "You wrote: " + $('#text').val();
            };

            var send = function(){
                if(message !== ""){
                    $.post("includes/changePage.inc.php", {message: message});
                    window.location.href = "includes/changePage.inc.php";
                }
            };

            changeText();
            send();
        });
    });
</script>
<body>
<textArea id="text"></textArea>
<form id="saveForm" action="includes/saveEssay.inc.php" method="POST">
  <button type="submit" id="saveButton">Save!</button>    
</form>
</body>
</html>

名为 changePage.inc.php 的文件(在名为 includes 的文件夹中)

<?php

session_start();

if(isset($_POST['message'])){
    header("Location: ../secondPage.php");
}

exit();

名为 secondPage.php 的文件

<?php
    echo 'Hello World';
?>

【问题讨论】:

  • changePage.inc.php 的代码在哪里?
  • 我很抱歉,应该是 changePage.inc.php 而不是 changeDirectory.inc.php。我将进行编辑。
  • 请问,为什么要在提交之前以任何方式“格式化”信息?您可以在目标页面中执行此操作,例如changePage.inc.php。这样你就可以完全避免 jquery 部分。
  • 那么secondPage.phpincludes/saveEssay.inc.php 一样吗?你没有提到includes/saveEssay.inc.phpanywhere。
  • 您在这两个问题中的解释都令人困惑,因为您指的是自己的解决方案,这似乎不是一个顺利的解决方案。所以,如果你想要一个可靠的解决方案,请接受我的建议:忘记 jquery,忘记 php。只需用文字描述您的确切问题和您想要完成的工作流程。但在您的描述中尽可能使用页面名称,而不是像the page from the php file within the includes folder, so I do not want to use jquery to redirect 这样的名称。谢谢。

标签: php jquery redirect post isset


【解决方案1】:

jQuery $.post() 方法被称为asynchronous 调用。这意味着当$.post() 尝试执行时,它之后的任何代码行都会尝试执行。

请注意,您将在 $.post() 之后立即进行重定向。这意味着当$.post() 尝试运行时,您正在重定向到includes/changePage.inc.php,这可能会阻止PHP 重定向到../secondPage.php 的运行。这就是我们所说的race condition,其中两个事件同时运行,其中一个可以先于另一个完成,而无法保持事件同步。

据我所知,您真正想做的是将数据处理移交给 PHP,然后在完成后,您希望重定向到给定页面。

如果我对此正确无误,请删除 window.location.href = "includes/changePage.inc.php"; 行,否则您总是会遇到这种竞争条件的问题。在 PHP 中处理重定向——它应该独立工作。如果您在 PHP 中直接重定向时遇到问题,那么您可以通过 jQuery 进行重定向:

你的 jQuery POST

$.post("includes/changePage.inc.php", {message: message}, function(data) {
    var obj = $.parseJSON(data);
    window.location.href = obj.redirect_url;
});

通过 PHP 返回什么

echo json_encode(array('redirect_url'=>'includes/secondPage.php'));

如果这不能满足您的需求,那么您需要真正坐下来更好地解释您的用例和意图。如果你不能很好地解释它以准确传达你想要什么,那么你可能没有完全掌握你需要解决的问题。

【讨论】:

    猜你喜欢
    • 2014-05-10
    • 2013-04-15
    • 1970-01-01
    • 2016-05-08
    • 1970-01-01
    • 1970-01-01
    • 2014-08-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多