【问题标题】:Ajax and MySql inserting, checking and retrievingAjax 和 MySql 的插入、检查和检索
【发布时间】:2012-08-30 14:24:26
【问题描述】:

我有两个数据库表,guestlist 和出席率

在一个 HTML 页面上,我有一个 window.onload 脚本,我想通过 AJAX 检查来宾列表。如果 url 查询中的 firstname AND lastname 出现在 guestlist 表中,则加载该页面。如果没有,请加载错误消息。

页面正确加载后,名字和姓氏会预先填充在两个输入字段中。用户完成表单的其余部分并单击提交,将他们的名字和姓氏插入到出勤表中。

如果名字和姓氏已经出现在出勤表中,则加载错误消息。如果名字和姓氏没有出现在出勤表中,请将表单信息提交到出勤表。

谈到 Ajax,我不是其中的佼佼者。这是我目前拥有的代码:

HTML

<body>
<div id="formDiv">
<form id="partyForm" name="party" action="party_insert" method="post">
<h1>Welcome to The Party</h1>
    <input name="first_name" id="firstname" class="input" type="text" maxlength="99" placeholder="First Name"><br/>
    <input name="last_name" id="lastname" class="input" type="text" maxlength="99" placeholder="Last Name"><br/>
    <input name="costume" id="costume" class="input" type="text" maxlength="999" placeholder="What are you supposed to be?"><br/>
    <div id="buttonDiv">
        <a class="button" id="submit" style="cursor:pointer;">SUBMIT</a>
    </div>
</form>
</div>

<script>
window.onload = function () {
    var fname_init = decodeURIComponent(getUrlVars()["fname"]);
    var lname_init = decodeURIComponent(getUrlVars()["lname"]);

    if(fname_init !== "undefined" && lname_init !== "undefined"){
        var newString = 'fname='+encodeURIComponent(fname_init)+'&lname='+encodeURIComponent(lname_init);
        $.ajax({
            type: "GET",
            url: "guestList.php",
            data: newString,
            success: function(){
                alert("ON THE LIST");
                $('#firstname').val(fname_init);
                $('#lastname').val(lname_init);
            },
            error: function(){
                alert("NOT ON THE LIST");
                window.location = 'error1.html?fname='+encodeURIComponent(fname_init)+'lname='+encodeURIComponent(lname_init);
            }
        })
    }
}

$("#submit").click(function() {
    validate();
});

function submit(){
    var fname = $("#firstname").val();
    var lname = $("#lastname").val();
    var cost = $("#costume").val();
    var dataString = 'fname='+encodeURIComponent(fname)+'&lname='+encodeURIComponent(lname)+'&cost='+encodeURIComponent(cost);
    $.ajax({  
        type: "POST",  
        url: "partyEntry.php",  
        data: dataString,  
        success: function() {  
            alert("ENJOY THE PARTY");
            clearForms();
        }
    });
}

function validate(){
    if ($("#firstname").val() == ""){
        alert("Please Enter your First Name");
    } else {
        if ($("#lastname").val() == ""){
            alert("Please Enter your Last Name");
        }else{
            if ($("#costume").val() == ""){
                alert("You have to have a costume to be eligible for this raffle");
            }else{
                submit();
            }
        }
    }
}

function clearForms() {
    $('#partyForm')[0].reset();

}

function getUrlVars()
{
    var vars = [], hash;
    var hashes = window.location.href.slice(window.location.href.indexOf('?') + 1).split('&');
    for(var i = 0; i < hashes.length; i++)
    {
        hash = hashes[i].split('=');
        vars.push(hash[0]);
        vars[hash[0]] = hash[1];
    }
    return vars;
}

</script>
</body>

guestList.php

<?php

    $host = "localhost";
    $user = "root";
    $password = "";
    $database = "party";

    $link = mysql_connect($host, $user, $password);
    mysql_select_db($database);

    //SURVEY INFORMATION
    $fname = mysql_real_escape_string($_REQUEST['fname']);
    $lname = mysql_real_escape_string($_REQUEST['lname']);

    $checkClient  = "SELECT * FROM guestlist WHERE first_name = ".$fname." AND last_name = ".$lname;
    mysql_query($checkClient) or die(mysql_error());

    mysql_close($link);

?>

partyEntry.php

<?php

    $host = "localhost";
    $user = "root";
    $password = "";
    $database = "party";

    $link = mysql_connect($host, $user, $password);
    mysql_select_db($database);

    //SURVEY INFORMATION
    $fname = mysql_real_escape_string($_REQUEST['fname']);
    $lname = mysql_real_escape_string($_REQUEST['lname']);
    $cost = mysql_real_escape_string($_REQUEST['cost']);

    $addClient  = "INSERT INTO attendance (first_name, last_name, costume) VALUES ('$fname','$lname', '$cost')";
    mysql_query($addClient) or die(mysql_error());

    mysql_close($link);

?>

我得到的错误是,即使一个名字不在客人名单上,它仍然会显示他们在名单上。所以我在对 guestlist.php 的 Ajax 调用中一定做错了,但我不知道是什么。我在编写 ajax 调用以检查客人是否已被放入出勤表时也遇到问题。

【问题讨论】:

  • 页面死掉并不意味着错误函数被调用。如果连接出现问题,则会调用错误函数。 IE。错误的目标文件名等。您可能应该在成功函数中添加一些逻辑来处理检查用户是否在列表中。
  • 即使您使用die()exit() 终止您的php 脚本,您对guestList.php 的调用也会成功——响应只会是空的。您应该从guestList.php 返回一个值,并在您的回调中检查该值以了解该用户是否存在于来宾列表中。

标签: javascript php jquery mysql ajax


【解决方案1】:

就像我在评论中所说的,您必须从 guestList.php 返回一个值,这样应该可以:

$checkClient  = "SELECT * FROM guestlist 
                 WHERE first_name = ".$fname." AND 
                       last_name = ".$lname;
$result = mysql_query($checkClient);
$count = mysql_num_rows($result);
mysql_close($link);
// output 1 or 0 stating if the user is on the list or not
echo ($count ? 1 : 0);
exit();

然后在你的 ajax 回调中你会做如下检查:

success:function(e) {
   alert((e == 1 ? "User is on list" : "User isn't on list"));

【讨论】:

  • 谢谢...效果很好...我假设我可以为我的问题的第二部分做类似的事情...检查客人是否已经登记...
  • 我猜是这样,您可以将用户数据存储在会话中,将用户标记为已登录或未在数据库中等。您还应该检查以不同格式返回的数据,例如 @987654324 @ 和 html 来自您的脚本。
  • 我希望我可以检查 e == 0,但我收到一条错误消息:mysql_num_rows() 期望参数 1 是资源
  • 您必须在调用mysql_num_rows() 之前检查mysql_query() 是否返回有效资源。如果mysql_query() 返回FALSE,则查询本身有问题。
  • 我想通了。我将 $checkClient 更改为 sprintf() MySql 语句,它运行良好.. 现在我可以检查来宾列表中是否有来宾以及他们是否已经签入。WOOHOO ...没有更多的派对破坏者...技术取胜!
【解决方案2】:

根据 REST 原理,以 HTTP 200 响应 POST 请求意味着资源创建成功。您可以使用 HTTP 400 进行响应,并以 text/html/json/xml 格式提供有关错误的详细信息。

尝试这样做,

添加以下代码,

$query = mysql_query($addClient) or die(mysql_error());

if(mysql_num_rows($query) > 0)
{
     header('HTTP/1.1 500 Internal Server Error');
     echo 'this is an error message';
}

【讨论】:

  • 我认为更好的方法是返回一个值,说明用户是否在列表中。上面的代码将无法知道请求实际失败的原因。
  • 我仍然得到相同的结果,“在列表中”的警报仍然出现。我需要对我的 ajax 类型的 GET 调用进行任何更改吗?
【解决方案3】:

至少您尝试执行无效查询时,php 脚本永远不会抛出错误。查询执行时没有任何错误,因为它的格式很好,因此不会抛出错误,因为您没有从数据库中获取行。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-02-06
    • 1970-01-01
    • 2023-03-09
    • 2011-11-02
    • 1970-01-01
    • 1970-01-01
    • 2019-07-02
    • 2013-06-06
    相关资源
    最近更新 更多