PHP 包含/未定义的变量

PHP include / undefined variable

我知道有更多关于这个问题的主题,我已经阅读了它们,但我没有找到答案。

我有一个 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' 等,但我收到 "undefined variable" 错误 "Undefined variable: v in C:\wamp\www\test\index.php on line 39"

如果我在 index.php 中定义变量 $v,它可以工作,但这意味着我将不得不创建 index.php 的副本,这有点违背了目的。我只希望 pag1.php、pag2.php、pag3.php 等包含在 index.php 中,而不是创建很多副本。我可以为此使用 html:)

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

调用前需要先定义$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

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

传入的值

请注意,始终最好首先检查该值是否已设置,否则如果未设置,它会向您抛出一个严重的错误。以下代码是处理未设置参数的简单方法:

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

希望这能解决问题。

严格来说,你只需要改变

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

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

这里有几点需要注意:

  • URL 参数成为 $_GET 数组中的项目,而不是自变量。
  • include 不需要括号。包括它们并没有错,但没有必要。 See the documentation.
  • 您实际上不应该按原样使用此实现,因为它非常不安全。一个非常简单的 URL 操作,一些不怀好意的人可能会发现很多关于你的文件结构的信息。至少,您应该检查特定的扩展名,或者在 include 语句中附加特定的目录名称。
  • 您也不应按原样使用此实现,因为它无法正常处理 non-existent 文件。如果请求的内容文件不存在,您应该发送错误消息和 404 header。发送 header 必须在发送任何内容之前完成,因此应在此过程的早期检查文件是否存在。

所以,总而言之,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>