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>
我知道有更多关于这个问题的主题,我已经阅读了它们,但我没有找到答案。
我有一个 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>