【问题标题】:AJAX Call to PHP File for HTML Form Not WorkingAJAX 对 HTML 表单的 PHP 文件的调用不起作用
【发布时间】:2014-04-17 00:28:31
【问题描述】:

我有一个使用 HTML 创建的登录表单,如下所示:

<div class= "form-header">Login</div>
    <div class= "error-message" id= "login-error-exists"></div>
        <form action= "login.php" method= "POST" onsubmit= "loginCheckIncorrect()">
            <div class= "form-field">
                <div class= "form-text">
                    username:
                </div>
                <input type= "text" class= "login-textbox" id= "login-login-username" name= "loginLoginUsername">
            </div>
            <div class= "form-field">
                <div class= "form-text">
                    password:
                </div>
                <input type= "password" class= "login-textbox" id= "login-login-password" name= "loginLoginPassword">
            </div>
            <input type= "submit" value= "Login" class= "signup-confirm">            
        </form>

如您所见,它是一个简单的表单,通过POST 发送到login.php。提交此表单后,它会调用称为 loginCheckIncorrect() 的 JavaScript(使用 jQuery)函数,如下所示:

function loginCheckIncorrect() {
    "use strict";
    var loginLoginUsername = $("#login-login-username").val(), loginLoginPassword = $("#login-login-password");
    alert("test1");
    $.post('usernameIncorrect.php', {'loginLoginUsername': loginLoginUsername, 'loginLoginPassword': loginLoginPassword}, function (data) {
        $("#login-error-exists").html(data);
        alert("test2");
        event.preventDefault();
        return false;
    });
    alert("test3");
    event.preventDefault();
    return false;
}

如您所见,此函数创建变量来存储在每个文本框中输入的用户名和密码的值。它发出警报(调试),然后使用jQuery.post 函数将变量发送到 PHP 文件,我将在下面显示。然后它(应该)将从 PHP 文件发回的数据回显到我的 HTML 表单中的错误 div 中。

然后它会调用警报(更多调试)并使用event.preventDefault()return false 的组合来(据说)阻止表单提交。这在 post 函数之后重复。

这是我的 PHP 代码:

<?php
header("X-XSS-Protection: 1");

include("connect.php");


$username = mysqli_real_escape_string($con, $_POST["loginLoginUsername"]);
$password = mysqli_real_escape_string($con, $_POST["loginLoginPassword"]);

echo "<script>alert('test');</script>";

$sql = mysqli_query($con, "SELECT * FROM main WHERE username='$username' and password='$password'");
$count = mysqli_num_rows($sql);

if ($count == 1) {
    echo "";
    $_SESSION["username"] = $username;
    $_SESSION["password"] = $password;
} else {
    echo "username and/or password is incorrect.";
}
?>

当我尝试执行此代码时,它显示的唯一警报是test1。有人可以向我解释为什么会这样,更重要的是,我该如何解决?提前致谢。

【问题讨论】:

    标签: javascript php jquery html ajax


    【解决方案1】:

    在浏览器的调试面板中查看您的网络请求,看看它是否发送了您认为的内容,在您的 PHP 中添加一些调试语句,看看什么被命中和没有被命中。

    在这种情况下,我认为您可能在 javascript 中的 alert("test1") 之前缺少 $('login-login-password') 上的 .val()

    【讨论】:

    • 哇,我现在感觉自己像个白痴。令人惊讶的是,一小部分代码会导致整个程序失败。谢谢,伙计。
    • 是的,这就是为什么你要非常仔细地跟踪你的步骤,并寻找任何不寻常的地方——在这种情况下,你会看到loginLoginPassword 在请求中总是空的。正如@epascarello 所指出的,event.preventDefault() 在没有事件对象的情况下将无法工作。 jQuery 传递一个事件对象作为第一个参数,所以只需将其添加到:function loginCheckIncorrect(event)
    • 我不完全明白你的意思。 event.preventDefault() 在没有将事件对象作为参数传递的情况下对我来说工作得很好。事实上,当我添加它时,它导致了一个错误。这是为什么呢?
    • 不知道为什么您会收到错误,而且现在是移动设备,所以我无法调查。但它可能有效,因为return false 做同样的事情(但不推荐)。此外,您的 $.post() 调用将无法取消提交,因为它是异步的,并且在请求返回时,表单将已提交。您可能需要进行更多重组,然后才能按您希望的方式工作。
    • 是的,这正是我现在正在发生的事情。我将如何对其进行重组,以便邮政电话能够为我停止表格?我的下一步是添加一个 if 语句,说明是继续登录到 login.php 还是显示错误消息。我应该把它作为另一个问题发布吗?
    【解决方案2】:

    没有定义event。那将是一个问题,表单将提交。并且回调中的 preventDefault 是没用的,因为函数已经完成了。

    【讨论】:

      【解决方案3】:

      1) php文件的名字是login.php

      2) 您请求发帖的网址是 usernameIncorrect.php

      因此:

      $.post('login.php', {'loginLoginUsername': loginLoginUsername, 'loginLoginPassword': loginLoginPassword}, function (data) {
          $("#login-error-exists").html(data);
          alert("test2");
          event.preventDefault();
          return false;
      });
      

      警报 test1 是唯一出现的,因为帖子失败。 可能有一个失败事件,你会缓存错误。

      试试吧,如果你想测试一下:

      $.post('wrongUrl.php', {'loginLoginUsername': loginLoginUsername, 'loginLoginPassword': loginLoginPassword}, function (data) {
          $("#login-error-exists").html(data);
          alert("test2");
          event.preventDefault();
          return false;
      })
      .fail(function() {
          alert( "error" );
      });
      

      【讨论】:

      • OP 似乎有一个单独的脚本 (usernameIncorrect.php) 检查用户名 before 提交到 login.php
      • “OP 似乎”是主观的。客观地说,关于 php 文件名的唯一信息是“login.php”,因此是我的结论。
      • 很抱歉让赫克托尔感到困惑。我确实有一个名为usernameIncorrect.php 的单独文件;这是我给你看的 PHP 代码。 login.php 在验证用户名在数据库中后发送给它。
      • 哦,贾里德没问题。这些事情发生了:) 我不高兴的是@cincodenada 的反对票。
      • 我尝试取消对您的投票,但现在为时已晚。否决票主要是因为您根据没有得到充分支持并最终出现错误的假设给出了明确的答案。如果答案更具试探性(“你真的有两个单独的 PHP 文件吗?”)我不会投反对票。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-08
      • 2014-02-18
      相关资源
      最近更新 更多