PHP包含/未定义的变量

时间:2015-05-09 16:05:29

标签: php variables undefined php-include

我知道有关此问题的更多主题,我已阅读过,但我没有找到答案。

我有一个index.php,其中包含一堆.php包括:header.php,navigation.php,box.php,footer.php,以及“pages”div内部,我有一个需要的是不同的(基于navbar.php或box.php的链接)。

navbar.php示例:

<a href="index.php?v=pag1.php">Page1</a>
<a href="index.php?v=pag2.php">Page2</a>

的index.php:

<div id="wrapper">
    <div id="header">
        <div id="topbox">
<?php include ("box.php"); ?>       
        </div></div>
    <div id="content">
    <div id="bara">
        <div id="navbar">
<?php include ("navbar.php"); ?>                    
        </div>                  
    </div>  
    <div id="pages">    
<?php include ("$v"); ?>        
    </div>  
    </div>
    <div id="footer">
<?php include("footer.php"); ?> 
    </div>  
</div>

我想要包含的每个页面上都有$ v ='pag1.php',$ v ='pag2.php'等,但我得到“未定义的变量”错误“未定义的变量:V in C:\ wamp \ www \ test \ index.php第39行“

如果我在index.php中定义变量$ v,它可以工作,但这意味着我将不得不创建index.php的重复项,并且有点失败了。我只希望将pag1.php,pag2.php,pag3.php等包含在index.php中,而不是创建大量的副本。我可以使用html:)

我知道我可能会问一个愚蠢的问题,但我是php的新手,我不知道在哪里寻找答案。提前谢谢。

3 个答案:

答案 0 :(得分:0)

您需要在调用之前定义$v,您可以尝试:

<?php if(isset($_GET['v'])) {
$v = $_GET['v'];
} else {
$v = "home.php";
}
?>

<div id="wrapper">
<div id="header">
    <div id="topbox">
<?php include ("box.php"); ?>       
    </div></div>
<div id="content">
<div id="bara">
    <div id="navbar">
<?php include ("navbar.php"); ?>                    
    </div>                  
</div>  
<div id="pages">    
<?php include ("$v"); ?>        
</div>  
</div>
<div id="footer">
<?php include("footer.php"); ?> 
</div>  

当然,如果未在网址中设置v,则需要设置默认页面,因此其他home.php

答案 1 :(得分:0)

要在URL中传递变量,您需要使用$_GET数组。它将在脚本运行之前自动填充,因此您只需要从中读取它。例如,$_GET['v']将包含您通过网址(?v=...)传递的值。

请注意,最好首先检查是否设置了值,否则如果不是这样,它会给你带来一个讨厌的错误。以下代码是处理未设置参数的简单方法:

if (isset($_GET['v'])) {
    include($_GET['v']);
}
else {
    include('default.php');
}

希望这可以解决它。

答案 2 :(得分:0)

严格来说,您只需要改变

<?php include ("$v"); ?>  

<?php include $_GET['v']; ?>  

这里有几点需要注意:

  • 网址参数成为$_GET数组中的项目,而不是自变量。
  • include不需要括号。包含它们并没有错,但没有必要。 See the documentation
  • 您实际上不应该使用此实现,因为它非常不安全。一个非常简单的URL操作,以及一些意图不好的人可以找出很多关于你的文件结构。至少,您应检查特定扩展名,或在include语句中附加特定目录名。
  • 您也不应该使用此实现,因为它不会优雅地处理不存在的文件。如果请求的内容文件不存在,则应发送错误消息和404标头。发送标题必须在发送任何内容之前完成,因此应该在过程的早期检查是否存在文件。

所以,总而言之,index.php的一个更好的实现是:

<?php 
$v = "content/home.php"; // default page
if (isset($_GET['v'])) { // if the GET variable is set.  If no v parameter is provided, asking for $_GET['v'] will cause an error in strict mode. 
    $v = "content/" . $_GET['v'] . ".php"; // keep some control on what can be opened. 
}
if (!file_exists($v)) {
     header("HTTP/1.0 404 Not Found"); // this has to be called before ANY content is sent (include newlines).
     $v = "content/404.php";
}
?>

<div id="wrapper">
    <div id="header">
        <div id="topbox">
<?php include "box.php"; ?>       
        </div></div>
    <div id="content">
    <div id="bara">
        <div id="navbar">
<?php include "navbar.php"; ?>                    
        </div>                  
    </div>  
    <div id="pages">    
<?php include "$v"; ?>        
    </div>  
    </div>
    <div id="footer">
<?php include"footer.php"; ?> 
    </div>  
</div>