$ .ajax()发送GET和POST请求,但未发送数据

时间:2013-04-28 18:44:06

标签: jquery ajax

我正在尝试发出ajax请求来检查数据库中是否已存在用户名,但我从中获得了一个奇怪的行为。这是我的剧本:

$("#username").blur(function()
    {
        $.ajax({
            type: "POST",
            url: "check_username.php",
            data:
            {
                username: $("#username").val()
            },
            success: function()
            {
                $("#username_taken").load("check_username.php").show();
            },   
        });
        return false;
    });

和我的php:

<?php

    if (($connection = mysql_connect("database", "user", "pass")) === false)
    {
        die('Could not connect: ' . mysql_error());
    }

    if ((mysql_select_db("database", $connection)) === false)
    {
        die ("Could not select database : " . mysql_error());
    }

    if ($_SERVER["REQUEST_METHOD"] == "POST")
    {
        $username = mysql_real_escape_string($_POST["username"]);
        $check = mysql_query("SELECT username FROM users WHERE username = '$username'");
        $check_num_rows = mysql_num_rows($check);
        if ($check_num_rows == 1)
        {
            echo "Username already exists.";
            return false;
        }
    }
?>

当我查看网络选项卡时,我看到两个请求被发送,一个GET和一个POST,具有相同的信息,我不明白为什么。当我有

时,我的代码根本不起作用

if ($_SERVER["REQUEST_METHOD"] == "POST")

但如果我尝试

if ($_SERVER["REQUEST_METHOD"] == "GET")

它有效,我有一个错误:

Notice: Undefined index: username in check_username.php on line 20

Line 20: $username = mysql_real_escape_string($_POST["username"]);

这是在请求中的数据中传递的,所以我不知道为什么它不能识别它。我真的不明白这有什么问题,因为我在那个脚本中有另一个ajax看起来很像那个,它完美地工作......

有什么想法? 谢谢!

1 个答案:

答案 0 :(得分:0)

load()是以下的快捷方式:

$.ajax({
    type: 'GET',
   ....etc
});

所以你首先发送一个POST请求,并且在那个POST请求的成功处理程序中你正在使用load(),这与完全相同但是有一个GET请求,所以你要调用它PHP文件两次,这就是你看到POST和GET请求的原因。

以下是你应该如何做的事情:

$("#username").on('blur', function() {
    $.ajax({
        type: "POST",
        url : "check_username.php",
        data: { username: this.value }
    }).done(function(data) {
           $("#username_taken").html(data).show();
    });
});

您应该考虑使用PDO,因为旧的mysql_*函数已被弃用且不安全。