【问题标题】:Access a JavaScript variable from PHP从 PHP 访问 JavaScript 变量
【发布时间】:2010-02-26 01:30:03
【问题描述】:

我需要使用 PHP 访问 JavaScript 变量。这是我目前正在尝试的代码的精简版本,但它不起作用:

<script type="text/javascript" charset="utf-8">
    var test = "tester";
</script>

<?php
    echo $_GET['test'];
?>

我是 JavaScript 和 PHP 的新手,所以我非常感谢任何建议。

更新:好的,我想我简化得太多了。我要做的是创建一个表单,在提交时更新 Twitter 状态。我的表单工作正常,但我还想添加地理位置数据。由于我使用 Javascript(特别是 Google Geolocation API)来获取位置,在提交表单时如何使用 PHP 访问该信息?

【问题讨论】:

标签: php javascript variables


【解决方案1】:

简短的回答是你不能

我不知道任何 PHP 语法,但我可以告诉你的是,PHP 是在服务器上执行的,而 JavaScript 是在客户端(在浏览器上)执行的。

你正在做一个$_GET,它用于retrieve form values

内置的 $_GET 函数用于收集带有 method="get" 的表单中的值。

换句话说,如果您的页面上有:

<form method="get" action="blah.php">
    <input name="test"></input>
</form>

您的 $_GET 调用将检索该输入字段中的值。

那么如何从 JavaScript 中获取值呢?

好吧,您可以将 javascript 值粘贴在隐藏的表单字段中...

<script type="text/javascript" charset="utf-8">
    var test = "tester";
    // find the 'test' input element and set its value to the above variable
    document.getElementByID("test").value = test;
</script>

... elsewhere on your page ...

<form method="get" action="blah.php">
    <input id="test" name="test" visibility="hidden"></input>
    <input type="submit" value="Click me!"></input>
</form>

然后,当用户单击您的提交按钮时,他/她将向 blah.php 发出“GET”请求,并发送 'test' 中的值。

【讨论】:

  • 谢谢,我已经更新了我的问题以澄清我想要实现的目标。你认为上面的解决方案(不可见的表单域)仍然是最好的解决方案吗?
  • 您也可以使用 XHR 加载您的页面并将获取变量放入您自己。这将删除表单提交...基本上,您将加载 url "asdf.php?test="+test.value
  • @Chris Armstrong 当然,这是一个很好的解决方案。但是,我不知道有多少数据,并且我相信 GET 请求的数据限制约为 2kb(未研究,只是一个假设)。您可能需要考虑使用 POST 而不是 GET 来发送表单数据。此外,这样数据不会出现在浏览器的 URL 字段中。其他需要考虑的事情 - 您可以在页面加载时设置地理位置数据,但是如果用户在单击“提交”时位于不同的位置怎么办?在这种情况下,您可能需要使用 javascript 提交表单:bit.ly/qOEhx
  • 不可见的表单字段似乎工作正常,地理位置数据只有两个坐标,所以大小应该不是问题,但是我正在考虑使用 ajax(特别是 jquery)提交表单,所以您认为我最好等到用户点击提交后再查找他们的位置?
  • @Chris Armstrong jquery 是一个不错的选择,绝对我认为使用常规按钮而不是表单提交按钮会更好,使用 jquery 将函数绑定到按钮的“单击”事件,然后捕获地理位置,然后使用 javascript 提交表单。
【解决方案2】:

由于 JavaScript 是一种客户端语言,而 PHP 是一种服务器端语言,您需要将变量物理推送到 PHP 脚本,方法是在 PHP 脚本的页面加载中包含变量(script.php? var=test),这实际上与 JavaScript 无关,或者每次更改变量时通过 AJAX/AHAH 调用将变量传递给 PHP。

如果您确实想走第二条路,您会查看 XMLHttpRequest,或者我的偏好,jQuerys Ajax 调用:http://docs.jquery.com/Ajax

【讨论】:

    【解决方案3】:

    _GET 访问查询字符串变量,test 不是查询字符串变量(PHP 不会以任何方式处理 JS)。你需要重新考虑。您可以创建一个 php 变量 $test,然后执行以下操作:

    <?php
    $test = "tester";
    ?>
    <script type="text/javascript" charset="utf-8">
        var test = "<?php echo $test?>";
    </script>
    
    <?php
        echo $test;
    ?>
    

    当然,我不知道你为什么想要这个,所以我不确定最好的解决方案。

    编辑:正如其他人所指出的,如果 JavaScript 变量确实是在客户端生成的,您将需要 AJAX 或表单将其发送到服务器。

    【讨论】:

    • 如何使它成为查询字符串变量?还是我需要使用不同的php方法?
    • 您可以使用 method="GET" 提交 HTML 表单。
    【解决方案4】:

    如果向用户显示数据,请执行重定向:

    <script language="JavaScript">
        var tester = "foobar";
        document.location="http://www.host.org/myphp.php?test=" + tester;
    </script>
    

    或 iframe:

    <script language="JavaScript">
        var tester = "foobar";
        document.write("<iframe src=\"http://www.host.org/myphp.php?test=" + tester + "\"></iframe>");
    </script>
    

    如果您不需要用户输出,请创建一个宽度=0 且高度=0 的 iframe。

    【讨论】:

      【解决方案5】:

      尝试将此添加到您的 js 函数中:

          var outputvar = document.getElementById("your_div_id_inside_html_form");
          outputvar.innerHTML='<input id=id_to_send_to_php value='+your_js_var+'>';
      

      稍后在 html 中:

          <div id="id_you_choosed_for_outputvar"></div>
      

      这个 div 将包含要通过表单传递给另一个 js 函数或 php 的 js var,记得将它放在你的 html 表单中! 这个解决方案对我来说很好。

      在您特定的地理位置情况下,您可以尝试将以下内容添加到函数 showPosition(position):

          var outputlon = document.getElementById("lon1");
          outputlon.innerHTML = '<input id=lon value='+lon+'>';
          var outputlat = document.getElementById("lat1");
          outputlat.innerHTML = '<input id=lat value='+lat+'>';  
      

      稍后将这些 div 添加到您的 html 表单中:

      <div id=lat1></div>
      <div id=lon1></div>
      

      在这些 div 中,您将获得纬度和经度作为 php 表单的输入值,您最好使用 css 隐藏它们(如果使用,则仅在地图上显示标记)以避免用户在提交之前更改它们,并将您的数据库设置为接受长度为 10,7 的浮点值。

      希望这会有所帮助。

      【讨论】:

        【解决方案6】:

        GET 的问题在于,如果用户有一些知识,他可以自己更改值。我写这个是为了让 PHP 能够从 Javascript 中检索时区:

        // -- index.php

        <?php
          if (!isset($_COOKIE['timezone'])) {
        ?>
        <html>
        <script language="javascript">  
          var d = new Date(); 
          var timezoneOffset = d.getTimezoneOffset() / 60;
          // the cookie expired in 3 hours
          d.setTime(d.getTime()+(3*60*60*1000));
          var expires = "; expires="+d.toGMTString();
          document.cookie = "timezone=" +  timezoneOffset + expires + "; path=/";
          document.location.href="index.php"
        </script>
        </html>
        <?php
        } else {
          ?>
        
          <html>
          <head>
          <body>
        
          <?php 
          if(isset($_COOKIE['timezone'])){ 
            dump_var($_COOKIE['timezone']); 
          } 
        }
        ?>
        

        【讨论】:

          【解决方案7】:

          JS 是基于浏览器的,PHP 是基于服务器的。您必须生成一些基于浏览器的请求/信号才能将数据从 JS 获取到 PHP 中。看看Ajax

          【讨论】:

            【解决方案8】:

            我正在看这个并在想,如果你只能在表单中将变量输入 php,为什么不只是制作一个表单并在其中放置一个隐藏的输入,这样它就不会显示在屏幕上,然后放将您的 javascript 中的值放入隐藏输入并将其发布到 php 中?肯定会比其他一些事情少很多麻烦,对吧?

            【讨论】:

            • 这不是答案,请明确说明您的建议将如何帮助解决 OP 所面临的问题
            • 我在使您的界面正常工作时遇到了太多麻烦。对不起
            【解决方案9】:
            <script type="text/javascript">
                function gotzpl(){
                    var query = window.location.search.substring(1);
                    if(query){
                    }else{
                        var timez = Intl.DateTimeFormat().resolvedOptions().timeZone;
                        if(timez != 'undefined'){
                        window.location = "https://sks.com/searches.php?tzi="+timez;
                        }
                    }
                }
            </script>
            <?php 
                // now retrieve value from URL and use it in PHP; 
                // This way you can get script value in PHP
                $istzg = $_GET['tzi'];
            ?>
            <body onload="gotzpl()">
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2018-06-28
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2011-12-29
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多