变量没有被移交给包含的php文件

时间:2014-03-21 09:55:12

标签: php jquery ajax require

我有一个以下php文件的构造:

  • index.php,需要页眉和页脚(效果很好)
  • 一个wrapper.php,它根据require_once
  • 调用受保护文件夹“includes”(只能通过php服务器端读取)中包含的请求站点的内容
  • 一个login.php,位于includes中,包含在wrapper.php
  • header.php包含jquery并提供标题,而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,我不明白为什么。这个变量的原因是为了确保只有在包含在index.php中才能调用wrapper.php,除了检查它是否被称为xmlhttprequest之外。

如果我将变量保留为有效(因此require本身工作正常)但我不明白为什么wrapper.php没有从index.php获取$ callwithinindex变量。

我不想使用会话变量,因为一旦设置它就可以调用wrapper.php而不再在index.php中设置它。 任何提示?

4 个答案:

答案 0 :(得分:0)

您正在将服务器端编程语言(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'];

答案 1 :(得分:0)

您的代码很乱;-)您正在生成服务器端代码,并希望客户端代码在服务器端代码中包含一些文件......这是不可能的。从服务器端代码获取内容的唯一方法是通过客户端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";

答案 2 :(得分:0)

完全可能......你遇到的问题是文件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>

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

答案 3 :(得分:0)

您可以/需要在查询字符串中传递$ 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';
  }
?>

正如其他许多人所说,你应该改变你的做法。但如果你不这样做,那就应该有效。