【问题标题】:Passing of javascript variable data to php variable in the same php file将javascript变量数据传递给同一php文件中的php变量
【发布时间】:2015-11-16 04:08:57
【问题描述】:

我有一个需要将数据传递给 php 变量的 javascript。我已经搜索了如何实现这一点,但我无法使其正常工作。这是我所做的:

Javascript:

$(document).ready(function() {

        $(".filter").click(function() {
            var val = $(this).attr('data-rel');
            //check value
            alert($(this).attr('data-rel'));

            $.ajax({
                type: "POST",
                url: 'signage.php',
                data: "subDir=" + val,
                success: function(data)
                {
                    alert("success!");
                }
            });
        });
    });    

然后在我的 php 标签上:

<?php
if(isset($_GET['subDir']))
{
    $subDir = $_GET['subDir'];
    echo($subDir);
}
else
{
    echo('fail');
}?>    

我总是收到失败的文本,所以肯定有问题。我刚开始使用php和jquery,我不知道出了什么问题。拜托我需要你的帮忙。顺便说一句,它们位于同一文件上,即 signage.php 。提前致谢!

【问题讨论】:

    标签: php ajax


    【解决方案1】:

    当您以这种方式应答 POST 调用时,您需要 三个 东西 - 从 _POST 读取数据,将其正确放在那里,然后以 JSON 格式应答。

    $.ajax({
        type: "POST",
        url: 'signage.php',
        data: {
            subDir: val,
        }
        success: function(answer)
        {
            alert("server said: " + answer.data);
        }
    });
    

    也可以:

    $.post(
        'signage.php',
        {
            subDir: val
        },
        function(answer){
            alert("server said: " + answer.data);
        }
    }
    

    然后在响应中:

    <?php
        if (array_key_exists('subDir', $_POST)) {
            $subDir = $_POST['subDir'];
            $answer = array(
                'data' => "You said, '{$subDir}'",
            );
            header("Content-Type: application/json;charset=utf-8");
            print json_encode($answer);
            exit();
        }
    

    请注意,在响应中,您必须设置 Content-Type 并且必须发送有效的 JSON,这通常意味着您必须在发送 JSON 数据包后立即退出,以确保不发送任何其他内容。此外,响应必须尽快到达,并且之前不得包含任何其他内容(甚至在

    还要注意,使用isset 是有风险的,因为您不能发送一些等同于 unset 的值(例如布尔值 false 或空字符串)。如果您想检查 _POST 是否确实包含 subDir 键,请显式使用 array_key_exists(出于同样的原因,在 Javascript 中您有时会使用 hasOwnProperty)。

    最后,由于你使用单个文件,你必须考虑到第一次打开文件时,_POST会为空,所以你会开始显示“失败”!您已经开始使用 _POST 修复此问题:

    • _POST 表示这是一个 AJAX 调用
    • _GET表示这是signage.php的正常打开

    所以你会做这样的事情:

    <?php // NO HTML BEFORE THIS POINT. NO OUTPUT AT ALL, ACTUALLY,
          // OR $.post() WILL FAIL.
    
    if (!empty($_POST)) {
        // AJAX call. Do whatever you want, but the script must not
        // get out of this if() alive.
    
        exit(); // Ensure it doesn't.
    }
    // Normal _GET opening of the page (i.e. we display HTML here).
    

    更可靠的检查方法是使用辅助功能验证请求的 XHR 状态,例如:

    /**
     * isXHR. Answers the question, "Was I called through AJAX?".
     * @return boolean
     */
    function isXHR() {
        $key = 'HTTP_X_REQUESTED_WITH';
        return array_key_exists($key, $_SERVER)
            && ('xmlhttprequest'
                 == strtolower($_SERVER[$key])
               )
        ;
    }
    

    现在你会:

    if (isXHR()) {
        // Now you can use both $.post() or $.get()
    
        exit();
    }
    

    实际上您可以将 AJAX 代码卸载到另一个文件中:

    if (isXHR()) {
        include('signage-ajax.php');
        exit();
    }
    

    【讨论】:

    • 好的,谢谢你的回答,我先试试你的建议。
    【解决方案2】:

    当您使用$_GET 时,您必须在您的网址中设置数据值,我的意思是

        $.ajax({
              type: "POST",
              url: 'signage.php?subDir=' + val,
              data: "subDir=" + val,
              success: function(data)
              {
                  alert("success!");
              }
    });
    

    或将您的服务器端代码从 $_GET 更改为 $_POST

    【讨论】:

      【解决方案3】:

      编辑您的 javascript 代码,将 ajax 类型的 POST 更改为 GET

      $(document).ready(function() {
      
          $(".filter").click(function() {
              var val = $(this).attr('data-rel');
              //check value
              alert($(this).attr('data-rel'));
      
              $.ajax({
                  type: "GET",
                  url: 'signage.php',
                  data: "subDir=" + val,
                  success: function(data)
                  {
                      alert("success!");
                  }
              });
          });
      }); 
      

      【讨论】:

        【解决方案4】:

        你已经在 ajax 中使用了 POST 方法,所以你也必须在 php 中更改为 POST

        <?php
        if(isset($_POST['subDir']))
        {
            $subDir = $_POST['subDir'];
            echo($subDir);
        }
        else
        {
            echo('fail');
        }?> 
        

        【讨论】:

          【解决方案5】:

          您正在使用POST 方法发送数据,而获取正在使用GET

          <?php
          if(isset($_POST['subDir']))
          {
              $subDir = $_POST['subDir'];
              echo($subDir);
          }
          else
          {
              echo('fail');
          }?>    
          

          【讨论】:

          • 我试图将我的 ajax 调用中的值传递给 php 变量。 $_POST 是正确答案还是 $_GET?
          • 啊,我明白了,我将我的更改为 $_POST 但我仍然有失败文本。当点击事件被触发时,我得到了正确的数据并提示成功!但在我的 php 标签上,它说失败了,我不明白。
          • 检查var val的值并尝试data: {subDir: val},
          • 在检查 php 标签上的 if(isset($_POST['subDir'])) 时,它没有被设置。这就是错误。所以它会回显失败文本。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-08-31
          • 1970-01-01
          • 1970-01-01
          • 2019-07-07
          • 2014-01-11
          • 2011-06-12
          相关资源
          最近更新 更多