PHP包含/未定义变量

问题描述:

我知道这个问题上有更多的话题,我已经阅读了他们,但我没有找到答案。PHP包含/未定义变量

我有一个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在C:\ wamp \ www \ test \ index.php在39行”

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

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

+0

尝试包括:($ V); –

严格地说,所有你需要的是改变

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

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

一对夫妇的事情,这里要注意:

  • URL参数成为$_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> 
+0

也谢谢詹姆斯K,我完全不知道安全风险。我有很多东西要读,我猜想。 – VVG

你需要调用它之前定义$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没有在URL中设置因此其他home.php默认页面

+0

谢谢,宝来。 (老实说,我认为足够从navbar.php调用v.就像我说的,我是一个新手 – VVG

要传递URL中的变量,您需要使用$_GET阵列。它将在你的脚本运行之前被自动填充,所以你只需要读取它。例如,$_GET['v']将包含您通过URL传入的值(?v=...)。

请注意,最好首先检查是否设置了该值,否则如果不是,它会向您发出令人讨厌的错误。下面的代码是处理未设置参数的简单方法:

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

希望能够解决它。