【问题标题】:AJAX call from jQuery UI dialog来自 jQuery UI 对话框的 AJAX 调用
【发布时间】:2014-01-31 01:15:52
【问题描述】:

我正在开发一个用户登录系统,使用 jQuery UI 模式对话框在我的 html 和 PHP 脚本之间进行交互。最近,我将所有用户功能移到了一个 PHP 文件中,之前我在标题标记中拥有它们。

如果有人输入有效的用户名/密码,我就能够使登录功能正常工作,但现在我试图考虑其他可能性,即有人输入了有效的用户名但密码不正确,或者他们输入了用户名不存在的。

我遇到的问题是 Dialog 脚本上的 AJAX 调用。我想将登录表单提交到同一页面 user.php,然后登录用户或返回错误消息,该消息将在同一对话框中填充 div。

现在,我的代码将返回一条错误消息,但它也会返回用户表单的副本。不太确定我在这里做错了什么......
任何意见将不胜感激。

编辑:决定继续发布整个 user.php,因为根据一个答案进行更改会使该文件添加的 html 完全消失。我现在猜测可能有几件事我做错了:

    <html>
    <span id="user">
            <ul>
                <?php
                    //if user is logged in, show name and Log Out option, else show Log In and Sign Up options
                    if(isset($_COOKIE["user"])) {
                        setSessionUserData($_COOKIE["user"]);
                        echo "<li>Logged in as {$_SESSION["username"]}</li>";
                        echo "<li>&nbsp;|&nbsp;</li>";
                        echo "<li><a href='#' id='logout_link'>Log Out</a></li>";
                    } else {
                        echo "<li><a href='#' id='login_link'>Log In</a></li>";
                        echo "<li>&nbsp;|&nbsp;</li>";
                        echo "<li><a href='#'>Sign up</a></li>";
                    }
                ?>
            </ul>
    </span>

    <div id="login_dialog" title="Existing User">
        <form id="login_form">
            <fieldset>
                <label for="userid">Username</label>
                <input type="text" name="username" id="username" />
                <label for="pw">Password</label>
                <input type="password" name="pw" id="pw" />
            </fieldset>
        </form>
        <span class = "error"></span>
    </div>
    <div id="logout_dialog" title="Log Out">
        <p><span class="ui-icon ui-icon-alert alert-icon"></span>Are you sure you want to log out?</p>
    </div>

    <script>
    $(function() {
        var username = $("#username"),
        password = $("#pw"),
        loginFields = $([]).add(username).add(password);

        $("#login_link").click(function() {
            $("#login_dialog").dialog("open"); 
        });

        $("#logout_link").click(function() {
            $("#logout_dialog").dialog("open");
        });

        $("#login_dialog").dialog({
            autoOpen: false,
            height: 200,
            width: 250,
            resizeable: false,
            modal: true,
            buttons: {
                Submit: function() {
                    $.post("auth.php",
                            {
                            username: $("#username").val(),
                            password: $("#pw").val()
                            },
                            function(result) {
                                if(result=='success'){
                                      window.location='Practice.php';
                                }
                                else {
                                    $(".error").html(result);
                                }
                            }
                          )
                    },
                Cancel: function(){
                    $(this).dialog("close");
                }                
            },
            close: function() {
                loginFields.val("");
            }
        });

        $("#logout_dialog").dialog({
            autoOpen: false,
            modal: true,
            height: 150,
            resizeable: false,
            buttons: {
                Okay: function() {
                    window.location = "logout.php";
                },
                Cancel: function() {
                    $(this).dialog("close");
                }
            }
        });

    });
</script>
</html>

<?php

function setSessionUserData($cookie) {
    $con = connect();

    $query = "SELECT * FROM practice_user WHERE userid = '$cookie'";
    $result = mysqli_query($con, $query);
    $userData = mysqli_fetch_array($result);

    $_SESSION["username"] = $userData["username"];
    $_SESSION["fname"] = $userData["first_name"];
    $_SESSION["lname"] = $userData["last_name"];
}

?>

...和 ​​PHP:

if($_SERVER["REQUEST_METHOD"] == "POST") {
$user = test_input($_POST["username"]);
$pass = test_input($_POST["password"]);

//check if correct login
if (chkLogin($user, $pass)) {
    $id = getUser($user, $pass);
    setUserCookie($id);
    header("Location: Practice.php");
}
//check if username exists but incorrect password entered
else if (chkUser($user)) {
    echo "Username and password do not match";
}
//Or else return that username doesn't exist
else {
    echo "Username does not exist";
}

}

我的代码中还有其他函数可以处理验证等。
如果我需要发布这些,请告诉我。

【问题讨论】:

  • “返回用户表单的副本”是什么意思?看起来此 PHP 代码只是发出重定向或回显字符串。我没有看到任何其他潜在的输出。此处未显示的代码中是否还有其他输出?我不太清楚这里发生了什么。
  • 在您的 php 中,您在成功时执行重定向,为什么不直接返回成功并在 javascript 中执行重定向?
  • 这个特定文件中有很多代码。我在这里发布的内容仅涉及登录功能。其余的是验证函数和其他功能(注销、创建帐户等)的代码。我认为问题在于我如何在 PHP 中处理事情。我确实希望它在成功时重定向...我可能没有正确执行 AJAX...或 PHP。我不太确定:/

标签: php jquery ajax


【解决方案1】:

你可以试试这个,

你不能在ajax调用php文件本身重定向页面,所以重定向部分移到了javascript端。

jQuery,

    $("#login_dialog").dialog({
            autoOpen: false,
            height: 200,
            width: 250,
            resizeable: false,
            modal: true,
            buttons: {
                Submit: function() {
                    $.post("auth.php",
                            {
                            username: $("#username").val(),
                            password: $("#pw").val()
                            },
                            function(result) {
                                if(result=='success'){
                                    window.location='Practice.php';
                                }else{
                                   $(".error").html(result);
                                   }
                               }
                          )
                    },
                Cancel: function(){
                    $(this).dialog("close");
                }                
            },
            close: function() {
                loginFields.val("");
            }
        });

创建一个名为auth.php的新页面,包含你的依赖php函数。

   <?php

    if($_SERVER["REQUEST_METHOD"] == "POST") {
    $user = test_input($_POST["username"]);
    $pass = test_input($_POST["password"]);

    //check if correct login
    if (chkLogin($user, $pass)) {
        $id = getUser($user, $pass);
        setUserCookie($id);
        echo "success";
    }
    //check if username exists but incorrect password entered
    else if (chkUser($user)) {
        echo "Username and password do not match";
    }
    //Or else return that username doesn't exist
    else {
        echo "Username does not exist";
    }
}
?>

【讨论】:

  • 修复了一堆函数放置的问题,现在错误消息可以正常工作,但是cookie和重定向的设置没有发生。知道为什么会这样吗?
  • 更正:设置 cookie 有效。现在一切正常,除了成功的重定向......现在我的头撞在众所周知的墙上,试图弄清楚为什么这不起作用......
  • function(result) { console.log(result); 能否更新控制台日志中的结果值!
  • 控制台返回的都是Uncaught ReferenceError: header is not defined
  • 您使用了我的 auth.php 答案吗?不要在 auth.php 中使用标头
【解决方案2】:

如果您根本不想进行重定向,并且您认为由于 ajax 响应附加到 $('.error') 容器而出错。

这可能对你有帮助

 Submit: function() {
                $.post("user.php",
                        {
                        username: $("#username").val(),
                        password: $("#pw").val()
                        },
                        function(result) {
                            if(result=='success'){
                              $("#login_dialog").append(result);
                              setTimeout(function(){
                                  $("#login_dialog").dialog("close");
                              },800);
                            }else{
                              $('.error').html(result);
                            }
                        }
                      )
                },

这会将结果附加到对话框中并在 800 毫秒后关闭它

【讨论】:

  • 这样做产生了同样的结果。
【解决方案3】:

在几次尝试让 Krish R 的方法工作后,通过对单独的 php 页面代码进行 AJAX 调用并通过 window.location 成功重定向,我发现 window.location 在成功AJAX 调用。我最终发现this answer 与使用window.location.assign(data) 的类似问题相反,并且效果很好。

虽然我不明白为什么需要这种不同的方法,但它确实可以解决重定向问题。感谢所有回复的人。我正在检查 Krish R 的答案是否被接受,因为它是最接近解决方案的答案。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-03
    • 1970-01-01
    相关资源
    最近更新 更多