奇怪的AJAX行为 - 没有保存一次正确的数据

时间:2012-12-21 06:19:19

标签: php javascript jquery ajax

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

以下是发生的事情:我是AJAX的新手,并且是在我之前创建的一个简单的文本编辑器应用程序中测试它的。我基本上改变了旧的“保存”表单,而不是用AJAX运行(它将数据发布到php脚本)。一切都很顺利,正如预期的那样,但我突然加载了一个文本文件,发现它只保存了前三行文本。

那天我正在努力保存两个文件,两者都发生了同样的事情。从那时起,我一直疯狂地试图重新创造这种行为,但我无法做到。

这只是一个侥幸,或者(更有可能)我只是不知道我应该用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使这个10x更清洁并且正在使用:

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");

1 个答案:

答案 0 :(得分:1)

您未对xmlhttp.send()电话中的参数进行网址编码。如果fileContent包含&字符,则将被PHP(或任何其他服务器端脚本语言)视为参数的结尾。

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