【问题标题】:$.ajax Post Request not sending POST data$.ajax Post 请求不发送 POST 数据
【发布时间】:2011-05-22 23:43:30
【问题描述】:

我正在尝试通过使用 ajax 来处理返回并形成对服务器的请求来简化我的登录系统。我想将我的表单数据发布到 PHP 页面,然后如果没有传递正确的参数,则返回 true/false 和“Not Enough Data”。

我的问题是我的 AJAX 请求没有发送我要发送的数据。

这是我的 JavaScript 函数:

function confirm_login()
{
   val_UName = document.login_form.username.value;
   val_Pwd = document.login_form.password.value;

   var result = null;
   var scriptUrl = "login_confirm.php";
   $.ajax({
     url: scriptUrl,
     type: 'post',
     data: ({username : val_UName, password : val_Pwd}),
     dataType: 'html',
     async: false,
     success: function(data) {
         result = data;
     }
   });
   result = result.split('|');
   if(result[1] == 'true')
     window.location = "index.php";
   else
     alert('Could not log you in!\n\n'+result[0]);
}

该函数在表单提交按钮的onclick事件中调用。现在,我使用了 Chrome 中的调试工具,并且我知道 val_UName 和 val_Pwd 正在获取表单值。所以这里和login_confirm.php之间肯定是一个故障

为了完整起见,这里是 login_confirm.php 中发生的事情(我省略了连接到数据库并关闭连接的行):

$username = mysql_real_escape_string($_POST['username']);
$password = mysql_real_escape_string($_POST['password']);

if($username == '' || $password == '')
      echo 'Not Enough Data|';

$login_query = "SELECT * FROM users WHERE u_name = '$username' AND pwd = '$password'";
$result = mysql_query($login_query);
$result_rows = mysql_num_rows($result);

if($result_rows > 0)
{
   session_start();
   $row = mysql_fetch_assoc($result);
   $_SESSION['loggedin'] = true;
   $_SESSION['uname'] = $row['u_name'];
   $_SESSION['uID'] = $row['pkid'];
   $_SESSION['email'] = $row['email'];
   $_SESSION['roleID'] = $row['fk_roleid'];
   echo 'true';
}
else
{
   echo 'false';
}

有人知道这里发生了什么或以前见过类似的事情吗?

PS。我什至尝试过改用 GET,但还是不行……

【问题讨论】:

  • 如果 $username 或 $password 变量为空字符串,我的 PHP 页面只会返回“Not Enough Data”,所以没有。
  • 拿起名为 Fiddler 的工具。它将让您查看所有调用的请求数据和响应数据。在请求数据中看到的任何结果都将确认 PHP 页面正在接收什么。

标签: php javascript jquery ajax post


【解决方案1】:
   result = result.split('|');
   if(result[1] == 'true')
     window.location = "index.php";
   else
     alert('Could not log you in!\n\n'+result[0]);

在回调返回之前运行。

尝试将该逻辑放入成功回调中,或定义一个包含该逻辑的成功函数。

【讨论】:

  • OP 设置async: false,所以实际上它应该可以工作,不是吗?
  • @felix 在这种情况下他真的不应该运行 async false 。我相信 async false 用于将 Ajax 请求排队并按顺序处理它们。否则,回调将被乱序调用。仅在绝对必要时才使用 async false。
  • 是的,我知道它是邪恶的;)但是,我仍然认为它会产生调用后的代码在调用返回后执行的效果。无论如何,我从未使用过 async: false 所以这可能是我不知道的原因;)
【解决方案2】:

ajax 请求下的代码在执行之前不会等待 ajax 请求完成。所以我认为你的 ajax 请求正在运行,但是数据没有任何反应,因为那段代码已经执行了。

我的建议是:

function confirm_login()
{
   val_UName = document.login_form.username.value;
   val_Pwd = document.login_form.password.value;

   var scriptUrl = "login_confirm.php";
   $.ajax({
     url: scriptUrl,
     type: 'post',
     data: ({username : val_UName, password : val_Pwd}),
     dataType: 'html',
     async: false,
     success: function(data) {
         runCode(data);
     }
   });

   function runCode(var result){
      result = result.split('|');
      if(result[1] == 'true')
        window.location = "index.php";
      else
        alert('Could not log you in!\n\n'+result[0]);
      }
   }
}

编辑:函数不应该在另一个函数中,但我认为你可以自己解决这个问题。

【讨论】:

    【解决方案3】:

    不要将数据括在括号中。只需 {} 就足够了。

    【讨论】:

    • 检查 jquery api:api.jquery.com/jQuery.ajax 他们使用括号,他们非常好。
    • 很公平 - 我从未见过。
    • 这对我来说也很奇怪,必须查一下以确保它有效。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-01-11
    • 1970-01-01
    • 2016-08-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-15
    相关资源
    最近更新 更多