我希望在我运行的这个论坛风格的网站中实现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");
答案 0 :(得分:1)
您未对xmlhttp.send()
电话中的参数进行网址编码。如果fileContent
包含&
字符,则将被PHP(或任何其他服务器端脚本语言)视为参数的结尾。
这不应该发生在jQuery版本中。当您将数据作为对象提供时,jQuery会自动对参数进行正确的编码。