2010-11-12 171 views
1

背景:从通过AJAX/jQuery的XML文件无法删除XML文件

我的网页加载项并显示它们(正常工作)

页也有通过AJAX/jQuery的提交表单到写入XML文件中的PHP文件,然后通过AJAX/jQuery的重新加载XML条目并显示它们(正常工作)

我有以下奇怪的问题:

如果我删除通过FileZilla的XML文件,或尝试通过上传ac来覆盖XML文件opy从我的本地机器上看,当我看着我的页面时,条目根本不会改变。实际上,如果用新副本覆盖XML文件,那么如果我在地址栏中导航到新副本,则会看到新副本:http://mysite.com/myxmlfile.xml,但是,在显示XML条目的页面中,旧条目(如文件是从未被覆盖/删除)仍然显示!

困惑!


这是我的PHP文件:

<?php 

    header('Pragma: no-cache'); 
    header('Cache: no-cache; must-revalidate;'); 

    function signGuestbook($entry){ 

     $date = date("n.d.Y"); 
     $name = $entry['name']; 
     $email = $entry['email']; 
     $comment = $entry['comment']; 

     $doc = new DOMDocument(); 
     $doc->preserveWhiteSpace = false; 
     $doc->load('guestbook.xml'); 

     $root = $doc->firstChild; 
     $e = $doc->createElement('entry'); 
     $dateNode = $doc->createElement('date', $date); 
     $nameNode = $doc->createElement('name', $name); 
     $emailNode = $doc->createElement('email', $email); 
     $commentNode = $doc->createElement('comments', $comment); 

     $e->appendChild($dateNode); 
     $e->appendChild($nameNode); 
     $e->appendChild($emailNode); 
     $e->appendChild($commentNode); 

     $root->appendChild($e); 
     $doc->formatOutput = true; 
     $doc->save('guestbook.xml'); 
    } 

    function loadGuestbook(){ 

     $gBook = new DOMDocument(); 
     $gBook->load('guestbook.xml'); 

     $entries = $gBook->getElementsByTagName('entry'); 
     $entries_arr = array(); 

     foreach($entries as $entry) 
     { 
      $date = $entry->getElementsByTagName('date')->item(0)->nodeValue; 
      $name = $entry->getElementsByTagName('name')->item(0)->nodeValue; 
      $email = $entry->getElementsByTagName('email')->item(0)->nodeValue; 
      $comment = $entry->getElementsByTagName('comments')->item(0)->nodeValue; 

      $entries_arr[] = array(
       'date' => $date, 
       'name' => $name, 
       'email' => $email, 
       'comment' => $comment 
      ); 
     } 

     return json_encode($entries_arr); 
    } 

    $entry = json_decode(stripcslashes($_POST['entry']), true); 

    if($entry != null){ 

     signGuestbook($entry); 
    } 


    header("Content-type: text/plain"); 
    echo loadGuestbook(); 

    ?> 

这是我的JS文件:

$(document).ready(function(){ 
    $.post('guestbook.php?' + new Date().getTime(), loadGuestbook, "text"); 
}); 

function loadGuestbook(gBook){ 

    var gBookDiv = $('div#guestbook'); 
    gBookDiv.empty(); 

    var entries = JSON.parse(gBook); 

    $.each(entries, function(i, entry){ 

     gBookDiv.prepend(
      '<div class="entry">' + 
      '<span class="date">' + entries[i].date + '</span>' + 
      '<strong class="blue">Name:</strong><span class="name">' + entries[i].name+ '</span><br />' + 
      '<strong class="blue">Email:</strong><span class="email">' + entries[i].email + '</span><br />' + 
      '<strong class="blue">Comments:</strong><p>' + entries[i].comment + '</p>' + 
      '</div>' 
     ); 
    }); 
} 

function signGuestbook(){ 

    var name = $('input#name').val(); 
    var email = $('input#email').val(); 
    var comment = $('textarea#comments').val(); 

    if(name == null || name == '' || email == null || email == ''){ 
     alert('You must provide a name and email.'); 
    } 

    else{ 

     var entry = { 
      "name" : name, 
      "email" : email, 
      "comment" : comment 
     }; 

     var entryString = JSON.stringify(entry); 
     $.post('guestbook.php?' + new Date().getTime(), { entry : entryString }, loadGuestbook, "text"); 

     $('input#name').val(''); 
     $('input#email').val(''); 
     $('textarea#comments').val(''); 
    } 
} 
+1

你有没有清晰的浏览器缓存或可能有一些服务器端缓存启用? – 2010-11-12 05:55:09

+0

是的,我清除了我的浏览器缓存。据我所知,我没有启用服务器端缓存,尽管这似乎是一个合理的原因。 – Didaxis 2010-11-12 05:56:27

回答

1

这是一个缓存的问题。为了防止您的Ajax调用被缓存添加时间到您的Ajax调用:

$.post('myphp.php?' + new Date().getTime(), { my : dataString }, myFunction, "text"); 
+0

或者让PHP完全离开它''myxmlfile.xml?' + new Date()。getTime()' – Phil 2010-11-12 06:04:04

+0

是的,发现已经...更好地使用js。谢谢。 – Mischa 2010-11-12 06:05:15

+0

轻微的问题,这不是我如何让我的AJAX呼叫。我使用$ .post('myphp.php',{my:dataString},myFunction,“text”); – Didaxis 2010-11-12 06:07:12

0

您可能还需要在你的PHP脚本发送XML文件之前补充一点:

header('Pragma: no-cache'); 
header('Cache: no-cache; must-revalidate;'); 
+0

我实际上并没有发送XML文件,XML文件是通过PHP进行处理的,并且JSON被发回。但我已经试过你的建议添加标题,并在上​​面添加日期,但无济于事...... – Didaxis 2010-11-12 06:14:18