2

我希望在我运行的这个论坛式网站中实现 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");
4

1 回答 1

1

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

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

于 2012-12-21T07:09:13.077 回答