【问题标题】:How to access PHP variables after posting and redirecting with AJAX?使用 AJAX 发布和重定向后如何访问 PHP 变量?
【发布时间】:2019-07-16 05:04:26
【问题描述】:

我正在 PHP 中创建一个用户输入用户名的登录页面。如果用户名是有效的,用户将被重定向到另一个页面,在那里他们使用的用户名被打印出来。如果用户名无效,页面会提示他们输入有效的用户名并重新加载页面。

我的问题在于将有效的“用户名”变量从登录页面“发布”到用户被重定向到的页面。

我知道在我的登录页面的表单标签中,我可以输入:

<form action='pageToPostTo.php' method='POST'>

</form>

但是,我的问题是,一旦用户点击提交,这似乎总是重定向到 pageToPostTo.php。结果,如果用户名无效,我不知道如何避免这种重定向。

相反,我使用 jQuery 的“.ready”和“.click”来执行 javascript 代码,在用户单击“提交”时验证用户名是否有效。如果它有效,则调用 Ajax 的“POST”方法。如果无效,则登录页面提示并重新加载。

function isValid(username) {
    return true;
}

$(document).ready(function () {

    $('input#submit').click(function (event) {

        event.preventDefault();

        if(isValid(username.value)) {
            postUser();
        }

        else {
            alert("Invalid Username");
            location.reload();
        }
    });
});

postUser() 如下图:

function postUser() {

    var username = username.value;

    $.ajax({
        url: 'pageToPostTo.php',
        type: 'POST',
        data: {getUsername: username}, // username = "danny"
        success: function(response) {
            alert(response);    // Outputs: "Your username is: danny"
            window.location.href = 'pageToPostTo.php'; // Outputs: "Your username is: Notice: Undefined index: getUsername..."
        }
    });
}
我的 Ajax 帖子对象的“成功”函数中的

“alert(response)”正确评估了 $_POST['getUsername']。这表明我的 Ajax 帖子运行良好。

这是我的问题所在:一旦我重定向到 pageToPostTo.php,$_POST['getUsername'] 就会停止评估,而是返回“通知:未定义索引:getUsername”。

Ajax 的“发布”方法似乎有效,但重定向缺少 Ajax“发布”的内容。

有没有办法在Ajax“post”方法执行后重定向到“pageToPostTo.php”,这样重定向后,我可以用$_POST['getUsername']检索Ajax发布的内容?

如果不是,为什么不呢?我必须有哪些替代方案才能获得相同的功能?

以前我使用 localStorage.setItem("usernameStorage", username.value) 和 localStorage.getItem(...) 在 php 文件之间传输变量。这样做有什么缺点吗?

从我的 loginPage.php 中截取:

<form name="login">
    <p>Username: <input type="text" id="username" ></p>
    <input type="submit" id="submit">
</form>

pageToPostTo.php:

<?php
    $validUser = $_POST['getUsername'];
    echo "Your username is: " . $validUser;
?>

附:验证用户名是否有效的函数必须在 JavaScript 中。

【问题讨论】:

  • 不要在客户端存储用户信息(本地存储、cookie 等)。阅读使用sessions 代替并让PHP 处理所有这些。如果客户端可以控制用户的身份识别,那么任何人都可能只是编辑 cookie 并以任何其他用户的身份登录。
  • 另外,用户名是否有效的检查也应该在后端处理。请记住,任何访问您网站的人都可以操作您的任何 JS 代码。 从不信任来自客户端的数据,这意味着无论你在 JS 中验证多少数据,你也需要在后端进行验证。
  • @MagnusEriksson “后端”是指我需要检查用户名在 php 而不是 JavaScript 中是否有效,因为任何人都可以访问和编辑我的 JavaScript 代码,而在 php 中,验证用户名将无法访问?另外,感谢您的回复。我明白为什么不使用 localstorage/cookies 来存储,并且我将研究会话。
  • 是的。这正是我的意思:-)
  • 它可以使用 php 验证用户名并使用会话!谢谢@MagnusEriksson。

标签: javascript php jquery ajax post


【解决方案1】:

在这种情况下,您只需开始使用已开发的解决方案即可。就像解决方法一样,我建议您在文件之间传输数据时使用$_SESSION 来存储数据。在您的情况下:用户登录后,程序验证,如果成功,将其保存在

$_SESSION['user_id'] = $user_id

之后,您重定向到您的文件:pageToPostTo.php:,首先检查会话中是否存在 user_id,如果不存在 -> 重定向到登录页面,如果存在,将值分配给 $var 并执行您需要的操作这样做。

您必须在同一页面执行您的登录 php,并且仅在验证成功的情况下进行重定向。这是对我的回答的补充。

【讨论】:

  • 只是一个小提示:使用会话不是“解决方法”。在这种情况下,这几乎是标准的做法。 :-)
【解决方案2】:

您可以在 jQuery 中使用表单提交而不是单击按钮。
示例:
这是您的 html 表单:

<form action='pageToPostTo.php' id="action-form" method='POST'></form>

修改后的 JQuery 脚本:

$("#action-form").submit(function(){
  if(!isValid(username.value)) {
    alert("Invalid Username");
    return false;
  }
});

这样,如果用户名是有效的,那么它会自动重定向到'pageToPostTo.php'。无需点击 ajax 请求。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-21
    • 1970-01-01
    • 1970-01-01
    • 2015-10-31
    相关资源
    最近更新 更多