【问题标题】:php mysql not saving data when button clicked and run $.ajax functionphp mysql在单击按钮并运行$ .ajax函数时不保存数据
【发布时间】:2011-11-17 09:26:13
【问题描述】:

我有这个

“fsField”是表单中所有元素的类。因此,每当用户模糊到另一个字段时,它都会使用下面给出的函数 autosave() 提交表单。当用户模糊时它会保存数据,但是当用户单击类“save_secL”的按钮转到下一页时它不会保存。

$('.fsField').bind('blur', function()
 {
autosave();
 }

 });

但是当我使用这段代码时

$('.save_secL').click(function()
{
 var buttonid = this.id;
{

                    var answer = confirm("You have left some questions unanswered. Click OK if you are sure to leave this section? \\n Click CANCEL if you want stay in this section. ");
    if(!answer)
    {
    var spl_items = valid().split(',');
    $(spl_items[0]).focus();

return false;
  }
else
{
        $('#hidden_agree').append('<input id="secLuseragreed" name="secL_user_agreed" value="unanswered" type="hidden" />');
    autosave();
    window.location= buttonid+".php"
        }
    }
    else
    {
    $('#hidden_agree').append('<input id="secLuseragreed" name="secL_user_agreed" value="answered all" type="hidden" />');
    autosave();
    window.location= buttonid+".php"
    }
}
  });

**autosave_secL.php 是将数据保存在数据库中的 php 源。我独立运行它,它确实可以保存数据。 **

function autosave()
{
var secL_partA_ques_1_select = $('[name="secL_partA_ques_1_select"]').val();
var secL_partA_ques_1 = $('[name="secL_partA_ques_1"]:checked').val();
var secL_partA_ques_2_select = $('[name="secL_partA_ques_2_select"]').val();


$.ajax(
    {
    type: "POST",
    url: "autosave_secL.php",
    data: "secL_partA_ques_1_select=" + secL_partA_ques_1_select + "&secL_partA_ques_1=" + secL_partA_ques_1 + "&user_id=<?php echo $row_token[user_id]?>" + "&updated_by=<?php echo $member."-".$key;?>",
        cache: false,
    success: function()
    {    
    $("#timestamp").empty().append('Data Saved Successfully!');
    }

    });

}

**

valid() 是一个验证函数,它检查任何字段是否为空,如果有空字段则返回一个值。**

 function valid()
{

    var items = '';
    $('.fsField').each(function() 
    {

        var thisname = $(this).attr('name')
        if($(this).is('select'))
        {
            if($(this).val()=='')
            {
                var thisid = $(this).attr('id')
                items += "#\"+thisid+\",";
                $('[name=\"'+thisname+'\"]').closest('td').css('background-color', '#B5EAAA');
            }
        }
        else
        {
            $('[name=\"'+thisname+'\"]').closest('td').css('background-color', '');
        }
    });

    return items;
}

有人可以帮忙吗?我现在被困了一天。不明白为什么当用户逐个字段时它会保存,但在单击按钮进行验证时不保存。 用火狐测试。单击按钮(save_secL 类)时,此行显示为红色,旁边有一个叉号。我正在使用 ssl 连接。

POST https://example.com/files/autosave_secL.php   x

这是尝试实施解决方案的修改代码

$('#submit_survey_secL').click(function()
{

    if(valid() !='')
    {
         var answer = confirm("You have left some questions unanswered. Are you sure you want to Submit and go to Section B? ");
         if(!answer)
        {
               var spl_items = valid().split(',');
               $(spl_items[0]).focus();

               return false;
        }
          else
        {
            $('#hidden_agree').append('<input id=\"secLuseragreed\" name=\"secL_user_agreed\" value=\"unanswered\" type=\"hidden\" />');

            autosave(function(){
                window.location= "part1secM.php?token=1&id=4"
            });
        }
    }
    else
    {
        $('#hidden_agree').append('<input id=\"secLuseragreed\" name=\"secL_user_agreed\" value=\"unanswered\" type=\"hidden\" />');

        autosave(function(){
            window.location= "part1secM.php?token=1&id=6"
        });
    }
});


function autosave(callback)
{

    var secL_partL_ques_1_select = $('[name="secL_partL_ques_1_select"]').val();
    var secL_partL_ques_1 = $('[name="secL_partL_ques_1"]:checked').val();
    var secL_partL_ques_2_select = $('[name="secL_partL_ques_2_select"]').val();


    $.ajax(
    {

    type: "POST",
    url: "autosave_secL.php",
    data: "secL_partL_ques_1_select=" + secL_partL_ques_1_select + "&secL_partL_ques_1=" + secL_partL_ques_1 + "&user_id=<?php echo $row_token[user_id]?>" + "&updated_by=<?php echo $member."-".$key;?>",
        cache: false,
    success: function()
        {    
             $("#timestamp").empty().append('Data Saved Successfully!');

                     if($.isFunction(callback))
         {                  
            callback();
         }
        }

    });

}

我不明白为什么这不起作用,因为回调应该完全起作用。 Firebug 不再以红色显示 POST https://example.com/files/autosave_secL.php,但它显示它已发布但我认为由于某种原因回调没有触发

【问题讨论】:

  • 您的 javascript 中有一些错误(第一个代码示例中的额外 })。请确保您正确复制了它。
  • 你有得到确认对话框吗?

标签: php jquery mysql ajax post


【解决方案1】:
$('.save_secL').click(function() {

//...

//start autosave. Note: Async, returns immediately
autosave();
//and now, before the POST request has been completed, we change location...
window.location= buttonid+".php?token=$row_token[survey_token]&$member=$key&agr=1"
//....and the POST request gets aborted :(

解决方案:

function autosave(callback)
{
//...
$.ajax(
    {
//...
    success: function()
    {    
        $("#timestamp").empty().append('Data Saved Successfully!');
        if($.isFunction(callback)) 
            callback();
    }
    });
}

//and

autosave(function(){
    window.location= buttonid+".php?token=$row_token[survey_token]&$member=$key&agr=1"
});    

顺便说一句,您的自动保存功能对您的服务器来说非常困难。您是否考虑过使用 localStorage + 包含所有数据的最终 POST 请求?

【讨论】:

  • 感谢您的回答。我没有尝试其他技术,因为我只是从在线示例中学到了这一技术。此外,位置也会根据用户的响应而变化。如果用户说是,那么在 url 的末尾添加一个额外的变量。
  • 您的关键问题:您必须等待 POST 请求完成才能更改页面。如果您不等待,您的请求将被中止。
  • 是的,我也这么认为。我不知道如何解决它。你的解决方案应该可以正常工作。让我试试看。
  • 我添加了回调,但它仍然没有完成自动保存。您可能还有其他解决方案吗?以及如何进行 localStorage + 最终 POST 以使其对服务器更好?我非常感谢你的建议。谢谢。
  • 您能发布您修改后的源代码吗?如果你只是想缓存表单输入,我可以推荐plugins.jquery.com/project/webStorage
【解决方案2】:

我得到了解决方案。

它可能是其中之一。 scr4ve 的解决方案绝对有帮助。所以这里是我认为它现在起作用的点。

  1. 在 ajax 自动保存功能中移动了“cache: false”,并在 url: 之前删除了“async:false”。在我把它放在“数据:”之后
  2. 在 autosave_secL.php/?"+Match.random() 之后添加了一个随机变量
  3. 添加了 scr4ve 的解决方案,以便在重定向之前完成 POST

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-12-25
    • 2013-04-04
    • 2022-12-03
    • 1970-01-01
    • 1970-01-01
    • 2019-10-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多