我有一个以下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中设置它。 任何提示?
答案 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代码,主要问题和已经给出的一些解释,我必须补充:
<!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>
<?PHP
$target = $_GET['target'];
require_once $target.'.php';
?>
<?PHP
echo "I'm in!";
?>
<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';
}
?>
正如其他许多人所说,你应该改变你的做法。但如果你不这样做,那就应该有效。