【问题标题】:Weird AJAX behavior - Didn't save correct data once奇怪的 AJAX 行为 - 一次没有保存正确的数据
【发布时间】:2012-12-21 06:19:19
【问题描述】:

我希望在我运行的这个论坛式网站中实现 AJAX,但最近,在测试它以了解它的要点时,我遇到了奇怪的(并且可能是毁灭性的)数据丢失,我想知道如果这是我应该担心的事情。

发生的事情是这样的:我是 AJAX 的新手,正在我之前创建的一个简单的文本编辑器应用程序中对其进行测试。我基本上将旧的“保存”表单改为使用 AJAX 运行(它将数据发布到 php 脚本)。一切进展顺利,符合预期,但出乎意料的是,我加载了一个文本文件,发现它只保存了前 3 行文本。

那天我正在处理并保存两个文件,同样的事情发生在两个文件上。从那以后,我一直在疯狂地尝试重现这种行为,但我一直没能做到。

这只是侥幸,还是(更有可能)我只是不知道使用 AJAX 应该注意什么?提前谢谢大家 - 这是我个人提出的第一个问题,但多年来我从这个社区产生的问题和答案中受益匪浅。

这是我当时使用的JS代码:

function saveDraft()
    {
        if ($('#title').html() == "Title")
        {
            alert("Please change the title of your draft from \"Title\"");
            return;
        }
        $('#statusBox').html("...saving");

        if (window.XMLHttpRequest)
        {// code for IE7+, Firefox, Chrome, Opera, Safari
            xmlhttp=new XMLHttpRequest();
        }
        else
        {// code for IE6, IE5
            xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
        }

        xmlhttp.onreadystatechange=function()
        {
            if (xmlhttp.readyState==4 && xmlhttp.status==200)
            {
                $('#statusBox').html(xmlhttp.responseText);
                //document.getElementById("txtHint").innerHTML=xmlhttp.responseText;
            }
        }
        xmlhttp.open("POST","createTextFile.php",true);
        xmlhttp.setRequestHeader("Content-type","application/x-www-form-urlencoded");
        var fileName = $('#fileName').val();
        var fileContent = $('#fileContent').val();
        xmlhttp.send("fileName="+fileName+"&fileContent="+fileContent);
    }

我后来发现 jQuery 让这 10 倍更清洁,我正在使用:

function saveDraft()
    {
        $.post("createTextFile.php",
        {
            fileName:$('#fileName').val(),
            fileContent:$('#fileContent').val()
        },
        function(data){
            $('#statusBox').html(data);
        });
    }

最后是 php 代码:

$fileName = $_POST['fileName'];
$fileContent = $_POST['fileContent'];

$illegalChars = array(" ", "#", "%", "&", "{", "}", "\\", "<", ">", "*", "?", "/", "$", "!", "'", "\"", ":", "@", "+", "`", "|", "=");

$fileName = str_replace($illegalChars, "_", $fileName);
$fileHandle = fopen("files/".$fileName.".txt", 'w') or die("can't open file");
fwrite($fileHandle, $fileContent);
fclose($fileHandle);

echo "Saved on ".date("n\.j\.y \a\\t h:i:s a");

【问题讨论】:

  • 那么即使您保存了更多数据,您保存的每个草稿也只包含 3 行文本?
  • 您的 jQuery 表单看起来不错。 i) 但是,如果您有表格中的数据,您可以序列化表格并发布。看这个例子:stackoverflow.com/a/5772905/174184 ii) 前 3 行案例:猜测:在将数据传输到服务器时是否会丢失数据包?我认为通常不会发生。
  • 我怀疑应该归咎于缺少 URL 编码,如下所述。

标签: php javascript jquery ajax


【解决方案1】:

您没有对 xmlhttp.send() 调用中的参数进行 URL 编码。如果fileContent 包含&amp; 字符,PHP(或任何其他服务器端脚本语言)会将其视为参数的结尾。

jQuery 版本不应该发生这种情况。当您将数据作为对象提供时,jQuery 会自动对参数进行适当的编码。

【讨论】:

  • 我想在这种情况下 OP 正在使用 jQuery
  • @asprin 他说问题发生在他使用纯Javascript版本时。
  • "I have since discovered jQuery makes this 10x cleaner and am using:" 我想只有 OP 才能对此有所了解:)
  • @asprin 看前面,他在那里写了“这是我当时使用的 JS 代码:”。他还说他最近无法重现这个问题——可能是因为他切换到没有错误的 jQuery 版本。
  • 我的错,没有看到他提到他无法重现问题的部分。您可能对 url 编码是正确的
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-06
  • 1970-01-01
  • 1970-01-01
  • 2010-09-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多