2

私が運営しているこのフォーラム スタイルのサイトに AJAX を実装しようとしていますが、最近、その要点をつかむためにテストしているときに、奇妙な (そして壊滅的な可能性がある) データの損失を経験しました。私は心配する必要があります。

何が起こったのか: 私は AJAX の初心者で、少し前に作成した単純なテキスト エディター アプリで AJAX をテストしていました。私は基本的に古い「保存」フォームを代わりにAJAXで実行するように変更しました(データをphpスクリプトに投稿します)。すべてが順調に進んでおり、予想どおりでしたが、突然テキスト ファイルを読み込んでみると、最初の 3 行のテキストしか保存されていませんでした。

その特定の日、私は 2 つのファイルに取り組んで保存していましたが、両方に同じことが起こりました。それ以来、私は必死にその動作を再現しようとしてきましたが、できませんでした。

これは単なるまぐれですか、それとも (おそらく) 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 に答える