为什么PHP对AJAX的响应包含<;脚本>;aBunchOfJavascript此处</脚本>;


Why does PHP response to AJAX contains <script> aBunchOfJavascriptHere </script>?

我正试图在两个小时内解决这个问题,但运气不好,也许这不是技术问题,但我需要帮助!

我有一个AJAX脚本,它需要向同一页面上的php脚本发送GET请求。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代码中得到了混乱的响应。我不确定是否必须发布其他代码。如果你需要了解更多,只需询问,我会尽快回复。

<?php ?>标记之外的任何字符都会在响应中返回。当您从浏览器访问index.php时,首先就是这样获得<script>标记的。

echo和print显然也会发送数据。

所以我想你应该在index.php的开头有if($success),在print之后有exit;

由于历史和实际原因,<?php ?>标签之外的字符被作为响应的一部分发送。在我们的时代,将PHP代码与HTML混合是一种糟糕的做法(正如一些人在下面的评论中已经指出的那样)。您可以使用模板引擎(大多数人都知道Smarty),也可以使用PHP本身作为模板引擎。但"在过去",PHP最初只是一个简单的模板引擎(没有类、外部模块、名称空间、自动加载器等),所以将HTML与PHP混合基本上就是这种语言的目的。正如我所说,今天我们仍然使用PHP作为模板语言,因此混合使用PHP(控制结构、循环)和HTML是可行的。

一个快速但不推荐的解决方案是避免ajax请求上的javascript内容

只是在展示

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框架。