【问题标题】:variable not being handed over to included php file变量未移交给包含的 php 文件
【发布时间】:2014-04-28 14:59:32
【问题描述】:

我有以下 php 文件的构造:

  • 需要页眉和页脚的 index.php(效果很好)
  • 一个 wrapper.php,它根据 require_once 调用包含在受保护文件夹“包含”(只能通过 php 服务器端读取)中的请求站点的内容
  • 一个 login.php 包含在其中并被 wrapper.php 包含
  • header.php 包含 jquery 并提供 header,而 footer.php 提供结束标签等。

我会尝试放一个简化的代码示例:

index.php 的内容:

<?
session_start();
session_name('platform');
require_once "includes/header.php";
$callwithinindex = 1;
if ($_SESSION['authenticated'] != 1)
  {
    echo'
      <script>
          $("#content").load("wrapper.php?target=login");
      </script>
      ';
  }

require_once "includes/footer.php";
?> 

wrapper.php 的内容:

<?
if (isset($_SERVER['HTTP_X_REQUESTED_WITH'])
AND strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) === 'xmlhttprequest' AND $callwithinindex == 1)  {
    $target = $_GET['target'];
    require_once 'includes/'.$target.'.php';
  }
?>

login.php 为登录窗口提供 html 代码。

问题是,$callwithinindex 没有传递给 wrapper.php,我不明白为什么。这个变量的原因是为了确保 wrapper.php 只能在它包含在 index.php 中时才能被调用,除了检查它是否作为 xmlhttprequest 调用。

如果我不考虑变量,它可以工作(所以 require 本身可以正常工作)但我不明白为什么 wrapper.php 没有从 index.php 获取 $callwithinindex 变量。

我不想使用会话变量,因为一旦设置了它,就可以调用 wrapper.php 而无需在 index.php 中设置它。 有什么提示吗?

【问题讨论】:

    标签: php jquery ajax require


    【解决方案1】:

    完全有可能...您遇到的问题是文件wrapper.php中的条件。

    您正在尝试验证 index.php 中定义的一些变量,但您正在通过 ajax 加载该页面,这意味着这些变量在文件 wrapper.php 中不可用

    加载 ajax 页面几乎与直接在浏览器中加载该页面相同。
    因此这绝对不是验证登录操作的最佳和安全方式。
    强>

    现在.. 对于 OP 代码、主要问题和已经给出的一些解释,我必须补充:

    index.php

    <!doctype html>
    <html lang="en">
        <head>
            <meta charset="UTF-8" />
        </head>
        <body>
            <div id="content">dummy text</div>
            <script src="http://code.jquery.com/jquery-1.11.0.min.js"></script>
            <script type="text/javascript">
              $(function() {
                $("#content").load("wrapper.php?target=login");
              });
            </script>
        </body>
    </html>
    

    wrapper.php

    <?PHP
        $target = $_GET['target'];
        require_once $target.'.php';
    ?>
    

    login.php

    <?PHP
        echo "I'm in!";
    ?>
    

    index.php 在浏览器中的结果:

    <div id="content">I'm in!</div>
    

    所以逻辑有效,但恕我直言,不适合此目的。

    【讨论】:

      【解决方案2】:

      您正在将服务器端编程语言 (PHP) 与客户端 (JavaScript) 混合使用。它们不能以这种方式互操作。

      通过 AJAX 管理 PHP 包含是不可能的(可行的)。重新考虑你在做什么。

       echo'
       <script>
            $("#content").load("wrapper.php?target=login");
       </script>
       ';
      

      这部分代码是 javacript,它已经包含了渲染的 wrapper.php 页面。 PHP 是服务器端编程语言。

      如果要将变量传递给 wrapper.php,则必须通过 php 包含它,如下所示:

       $target = 'login';
       include('wrapper.php');
      

      同时从wrapper.php中删除这一行:

      $target = $_GET['target'];
      

      【讨论】:

      • 那我该如何解决这个问题呢?我有一个主 index.php,它是一个“空”文件,应该包含受保护的文件。但是包含哪个文件是通过 AJAX 实现的。
      • 永远不要相信 Ajax 可以处理安全问题,因为客户端可以针对任何恶意进行调整。身份验证应仅在服务器端进行
      • @Broco 我已经发布了一个解决方案。通过 AJAX 管理 PHP 包含是不可能的(可行的)。重新考虑你在做什么。
      • 但是如果我做对了,就不可能点击页面上的一个按钮,然后让 wrapper.php 通过 AJAX 切换内容,或者是吗?对不起,我现在有点困惑......
      【解决方案3】:

      您的代码一团糟;-) 您正在生成服务器端代码,并希望客户端代码在您的服务器端代码中包含一些文件……这是不可能的。从服务器端代码获取内容的唯一方法是通过客户端 Javascript 中的 Ajax。

      一般来说,在服务器端编码中内联客户端编码是一个坏主意,您应该将 Javascript 代码放在一个单独的文件中,并包含该文件:

      echo "<script src='myjavascript.js'></script>\n";
      

      如果用户未通过身份验证,我建议停止或重定向用户,而不是按照您的方式进行操作:

      session_start();
      session_name('platform');
      require_once "includes/header.php";
      $callwithinindex = 1;
      
      if($_SESSION['authenticated'] != 1) {
        echo "You are not authenticated ... quitting!";
      #  header("Location:/loginpage.php"); // maybe redirect them to a login-page
        exit();
      }
      
      require_once "includes/footer.php";
      

      【讨论】:

        【解决方案4】:

        您可以/需要在查询字符串中传递 $callwithinindex,就像使用 $target 一样,并在 wrapper.php 中处理它

        <? /* index.php */
        session_start();
        session_name('platform');
        require_once "includes/header.php";
        $callwithinindex = 1;
        if ($_SESSION['authenticated'] != 1){
          echo'
              <script>
                  $("#content").load("wrapper.php?target=login&callwithinindex=$callwithinindex");
              </script>
              ';
        }
        
        require_once "includes/footer.php";
        ?>
        

        还有wrapper.php

        <?
        if (isset($_SERVER['HTTP_X_REQUESTED_WITH'])
        AND strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) === 'xmlhttprequest' AND $_GET['callwithinindex'] == 1)  {
            $target = $_GET['target'];
            require_once 'includes/'.$target.'.php';
          }
        ?>
        

        正如许多其他人所提到的,您应该改变您的方法。但如果你不这样做,那么这应该可以工作。

        【讨论】:

          猜你喜欢
          • 2010-12-08
          • 2011-01-13
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-05-20
          • 1970-01-01
          • 2017-11-22
          • 2016-06-08
          相关资源
          最近更新 更多