2013-08-24 74 views
1

我試圖從2小時沒有運氣,這可能不是技術,但我需要幫助!爲什麼PHP對AJAX的響應包含<script> aBunchOfJavascriptHere</script>?

我有一個AJAX腳本,需要發送GET請求到同一頁面上的php腳本。 PHP腳本終止這樣

 if ($success) { 
     print($state); 
     }?> 

的JavaScript是正確的PHP終止之下,是這樣的。

<script> 
    $('table button').click(function() { 
    var button = $(this); 
    /* if button inside the table is clicked */ 
    var username = button.parent().parent().children('td').html(); 
    var state = button.html(); 

    /* send GET request */ 
    $.ajax({ 
     type: "GET", 
     url: 'index.php', 
     data: 'username='+username+'&state='+state, 
     success: function(response) { 
     alert(response); 
     } 
    }); 
    }); 
</script> 

我不明白的是爲什麼我得到包含此文警報

inside // this is the state, so it's good 
<script> // this is the script, not good 
    $('table button').click(function() { 
    var button = $(this); 
    /* if button inside the table is clicked */ 
    var username = button.parent().parent().children('td').html(); 
    var state = button.html(); 

    /* send GET request */ 
    $.ajax({ 
     type: "GET", 
     url: 'index.php', 
     data: 'username='+username+'&state='+state, 
     success: function(response) { 
     alert(response); 
     } 
    }); 
    }); 
</script> 

我有操縱成功的HTML由我不能這樣做,因爲該凌亂的迴應,我從我的PHP代碼。我不確定是否需要發佈其他代碼。如果您需要了解更多,請儘快回覆。

+1

你是依靠'register_globals'還是有一些代碼在PHP中設置'$ state'爲'$ _GET ['state']'? (你應該做後者)。另外,最好在jQuery的'ajax'函數中使用'data:{'username':username''state':state}',因爲你可以改變表單類型並調整。 – Dave

+0

爲{'用戶名':用戶名,'國家':狀態}建議 – doplumi

回答

4

<?php ?>之外的任何字符都會在響應中發回。當你從瀏覽器訪問index.php時,你首先得到<script>標籤。

回顯和打印顯然也會發送數據。

所以我想你應該有if($success)在index.php文件開始時和exit;裏面,print後。

<?php ?>以外的字符由於歷史和實際原因,標記將作爲響應的一部分發送。 在我們的日子裏,PHP代碼與HTML混合使用是一種不好的做法(正如一些人在評論中指出的那樣)。你要麼使用模板引擎(大多數人知道Smarty),要麼使用PHP本身作爲模板引擎。 但是「當日回來」PHP開始爲只是一個簡單的模板引擎(沒有類,外部模塊,命名空間,自動加載器等),所以混合HTML和PHP基本上就是這種語言的目的。正如我所說,今天我們仍然使用PHP作爲模板語言,所以混合PHP(控制結構,循環)和HTML工程。

+0

啊良好的捕獲。我沒有正確理解他的問題。 – Dave

+0

+1因爲它有效!如果你想更詳細地瞭解爲什麼php標籤之外的東西被回覆到響應中(這就是問題的關鍵),那麼我還是會接受這個答案,謝謝:) – doplumi

+1

@domenicop這就是PHP的作品。當它最初被髮明時,它打算在一個頁面內完成小任務(比如顯示一個命中計數器),所以標籤外的所有內容都會發送給客戶端,就像打印出來一樣。這也是爲什麼它具有html外觀的開始和結束標籤; '

'。現在,它的使用方式已經發展得非常不同了,但是舊的行爲仍然存在,有些人仍然使用它(我個人認爲它會造成非常難看的代碼)。 – Dave

2

快速,但不建議的解決方法是避免JavaScript內容上一個Ajax請求

只是演示,這怎麼可能,

if($success) { 
    print($state); 
    } 

if(!isset($_GET['ajax_call'])) 
{ ?> 
    <script> 
    $('table button').click(function() { 
    var button = $(this); 
    /* if button inside the table is clicked */ 
    var username = button.parent().parent().children('td').html(); 
    var state = button.html(); 

/* send GET request */ 
$.ajax({ 
    type: "GET", 
    url: 'index.php?ajax_call=1', 
    data: 'username='+username+'&state='+state, 
    success: function(response) { 
    alert(response); 
    } 
}); 
}); 
    </script> 
<?php 
}?> 

.....

和你應該注意到新的ajax調用有一個額外的變量,ajax_call,

這是一個快速修復,讓你繼續前進,但我建議你使用MVC框架。

+0

當你說MVC你的意思是我應該把JavaScript放在'js'文件夾中,並通過php'require'它?我知道一般的MVC模式是什麼,只是想確定當爲什麼要談論web開發時它會變成什麼樣。 – doplumi

+0

一般而言,它意味着相同,即分離代碼和設計以避免混亂,但我的意思是使用像codeignitor這樣的框架。 –