【问题标题】:Executing PHP code inside a .js file在 .js 文件中执行 PHP 代码
【发布时间】:2019-07-23 11:50:53
【问题描述】:

我正在尝试在 .js 文件中执行一些 PHP,但显然不知道如何正确执行。

基本上,代码是在我的页面中添加一些 HTML 标记,我将其用于滑出式联系表单。然而,联系表格本身是在 Wordpress 中通过简码完成的。所以我试图让简码在使表单滑出的代码中工作。

var phpTest = '<?php do_shortcode("[contact-form-7 id=\'1088\' title=\'Live Chat Form\']"); ?>';

// add feedback box
$this.html('<div id="fpi_feedback"><div id="fpi_title" class="rotate"><h2>'
    + thisSettings.title
    + '</h2></div><div id="fpi_content">'
    + phpTest
    + '</div></div>');

如果我将变量“phpTest”更改为带有文本的常规字符串,它会显示得很好,我只是不确定如何在这种情况下执行 php。

【问题讨论】:

  • PHP 在调用 javascript 之前执行,所以这将 "never" 起作用。
  • 尝试将文件保存为 .php 而不是 .js。然后将此代码放入&lt;script&gt; 标签中。我知道这适用于 asp,我认为它也适用于 php。
  • PHP 在服务器上执行。 Javascript 在客户端的机器上执行。您的客户端计算机无法执行您的 PHP 程序,因为它不了解 PHP 程序(它永远不会看到它,只有服务器看到它)。如果您想执行一些 PHP 功能并将其报告给用户,而无需重新加载页面,请查看 AJAX。 Jquery 有一个非常简单的实现 (api.jquery.com/jquery.ajax)
  • @imtheman PHP 不能那样工作。
  • @CullyLarson 为什么它不起作用? php 代码没有使用任何 javascript 变量。它只是从一个很可能是静态的 php 函数中回显出结果。

标签: php jquery wordpress


【解决方案1】:

编辑:脚本类型应始终为text/javascript,因为application/javascript 可能会破坏与旧浏览器的兼容性(我认为IE8 及更早版本会忽略该类型的脚本标签)。但是,Content-type 仍应为 application/javascript


您不能像使用普通的.php 文件那样将php 混入.js 文件,因为.php 引擎不会像.php 那样预处理.js 文件文件是。

执行此操作的最典型方法(将 php 包含在 js 文件中)是在 .php 文件中仅包含内联 JS(&lt;script&gt; 标签之间的内容)。然后它将按预期工作。

另一种方法是在 php 中创建一个 js 文件,因此以 .php 文件开头

<?php
header("Content-type: application/javascript");
?>
var jsvar='something';
var othervar='<?php echo $phpVar; ?>';
//<?php //some php ;?>

然后像这样将其包含在您的页面上

<script src='myjs.php' type='text/javascript'></script>

【讨论】:

  • 我赞成这个答案。但是,您实际上配置了您的网络服务器,以便由 PHP 处理的 JS 文件。不过,这是一个非常糟糕的主意,将您的 JS 与您的服务器代码紧密耦合。最好使用 AJAX,或者至少在 PHP 中创建一个供 JS 使用的 JSON 对象
  • @JuanMendes 是的,这当然是一个选择,但正如你所说,这是一个糟糕的主意,所以我没有包括它。我在解释什么是 IMO 的 2 种好方法,而不是每种方法。
  • 在许多情况下,您不想在页面加载的顶部发出辅助 ajax 请求。我认为将所有内容打包在一个 json 对象中可能是最好的方法。
  • @chiliNUT 是的,确实如此,除了支持禁用 JS 的浏览器之外,我们有时不想要额外的请求。但是,如果工作量很大,在 PHP 中进行额外的处理可能会延迟页面的显示。因此,做决定的人必须权衡这两个因素。
  • 谢谢@chiliNUT。我将尝试将代码重新加工成一个 .php 文件,看看我是否不能让它工作:)
【解决方案2】:

我评论说你的问题是不可能的,但它确实是可能的。 不建议这样做,但如果您不担心可能存在的安全漏洞,可以通过以下方法解决您的问题:

在与您的.js 文件相同的目录中创建一个.htaccess 文件,其中包含以下内容:

AddHandler application/x-httpd-php .js

<FilesMatch "\.js$">
    Header set Content-Type "text/javascript; charset=utf-8"
</FilesMatch>

这会将您的 JavaScript 文件作为 PHP 执行,然后自动修复 .js 文件的 Content-Type(因为当您添加 php 处理程序时它们被视为文本)。

注意:虽然这是一个快速而肮脏的解决方案,但更好的方法是使用 Ajax(请参阅 chiliNUT's Answer

【讨论】:

  • 既然您知道这样做的缺点,您能提出更好的方法吗?顺便说一句,我认为主要问题不是安全漏洞。
  • 我试图展示的表格有它自己的安全/验证,但是我假设你的意思是它会引发不同的安全问题。我可以使用确切的 .js 文件名而不是使用一揽子“.js”,这样它只会影响一个 .js 文件,而不是我网站上的所有 .js?
  • @KerynGill 可以,将\.js$ 替换为^filename.js$
  • @JuanMendes 我添加了一个指向 chiliNUT 答案的链接
【解决方案3】:

您可以对 .php 文件执行 ajax 发布请求。这是一个有点肮脏的把戏,但它有效

$.post('thePhpFile',{var1:var1,var2:var2},function(result){
    //Code to do with the resulted... like $("#div").html(result);
});

有了这个技巧,你基本上可以做任何你想做的事

【讨论】:

    【解决方案4】:

    假设你的文件名是 myscript.js:

    在你的 head 标签中(它必须是一个可执行的 php 文件):

    <head>
    <script type="text/javascript">
    <?php 
    require_once 'myscript.js';
    ?>
    </script>
    

    ... ... 通过这种方式,您可以像执行 php 文件一样执行该文件

    【讨论】:

      【解决方案5】:

      我认为你可以使用 AJAX 做这样的事情:

      JS代码:

      var xmlhttp;
      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){
              $this.html('<div id="fpi_feedback"><div id="fpi_title" class="rotate"><h2>'
              + thisSettings.title
              + '</h2></div><div id="fpi_content">'
              + xmlhttp.responseText
              + '</div></div>');
          }
      }
      
      xmlhttp.open("GET","do_shortcode_file.php",true);
      xmlhttp.send();
      

      do_shortcode_file.php 必须是这样的:

      PHP 代码:

      <?php
      echo do_shortcode("[contact-form-7 id=\'1088\' title=\'Live Chat Form\']");
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-06-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-12-14
        • 1970-01-01
        相关资源
        最近更新 更多