我创建了两个链接,我希望在其中更改页面内容。问题是URL更改,而不是页面内容。
<h3>Filter Results</h3>
<p><a href="index.php?filter='Action'>Action</a></p>
<p><a href="index.php?filter='Comedy'">Comedy</a></p>
if (isset($_GET['filter']) == 'Action') {
echo 'Action';
}
else if (isset($_GET['filter']) =='Comedy') {
echo 'Comedy';
}
它始终输出第一个链接信息"操作"。
您的链接有问题:
<p><a href="index.php?filter=Action">Action</a></p>
<p><a href="index.php?filter=Comedy">Comedy</a></p>
<!-- ^ ^ No single quotes (' ') -->
Yogesh Suthar首先指出了这一点
此外, isset()
将返回一个布尔值(true
或false
;基于变量是否被设置(。您将布尔值与字符串进行比较,字符串将始终转换为TRUE
(除非字符串为"false"或类似(,因此基本上,如果设置了变量,则第一个条件将始终匹配。
你想要
if (isset($_GET["filter"]) && $_GET["filter"] === "Action")
注意使用 ===
,这将确保变量与您认为的完全一样,而不是某种其他类型的变量。
还有几点(从其他答案中无耻地偷来的(
如果有多个可能的过滤器,请检查变量是否存在一次,并使用
switch/case
块来确定它是其中的哪个:if(isset($_GET['filter'])) { switch($_GET['filter']) { case 'Action': echo 'Action'; break; case 'Comedy': echo 'Comedy'; break; } }
函数isset
只会检查变量是否存在!它不会返回其值!试试这个:
<h3>Filter Results</h3>
<p><a href="index.php?filter=Action">Action</a></p>
<p><a href="index.php?filter=Comedy">Comedy</a></p>
if(isset($_GET['filter']) && $_GET['filter'] == 'Action'){
echo 'Action';
}
else if(isset($_GET['filter']) && $_GET['filter'] == 'Comedy') {
echo 'Comedy';
}
此外,使用 switch 可能会使将来的事情变得更容易:
<h3>Filter Results</h3>
<p><a href="index.php?filter=Action">Action</a></p>
<p><a href="index.php?filter=Comedy">Comedy</a></p>
if(isset($_GET['filter'])) {
switch($_GET['filter']) {
case 'Action':
echo 'Action';
break;
case 'Comedy':
echo 'Comedy';
break;
}
}
正如@MadaraUchiha所说的isset
和,
if(isset($_GET['filter']) == 'Action')
应该是
if(isset($_GET['filter']) && $_GET['filter'] == 'Action')
也
<a href="index.php?filter='Action'>Action</a>
^ ^ ^ // here you started " but not ended and remove the single quotes around Action
应该是
<a href="index.php?filter=Action">Action</a>
确保插入一个开始和一个结束的 php 标签: <?php
和 ?>
为了简化它,你可以回显你通过$_GET
获得的值
<h3>Filter Results</h3>
<p><a href="index.php?filter='Action'>Action</a></p>
<p><a href="index.php?filter='Comedy'>Comedy</a></p>
<?php
if(isset($_GET['filter'])){
echo $_GET['filter'];
}
?>
函数isset
将返回true或false(它检查变量是否设置(。更改您的代码:
if(isset($_GET['filter']) && $_GET['filter'] == 'Action') {
您的 if 条件不正确,请执行此操作:
if(isset($_GET['filter']) && $_GET['filter'] == 'Action'){
echo 'Action';
}
与 else 类似,如果:
else if(isset($_GET['filter']) && $_GET['filter'] =='Comedy') {
当您将isset($_GET['filter'])
与值进行比较时,尽管 isset 返回 true 的 false 因此您需要比较 $_GET['filter']
的值。
你不必使用isset((然后进行比较。
$filter = $_GET['filter'];
if(isset($filter)){
if($filter == 'Action'){
echo 'Action';
}else if($filter == 'Comedy'){
echo 'Comedy';
}
}
isset
返回true
并且由于'Action'
不是null
,因此它的计算结果为true。
if ((isset($_GET['filter'])) && ($_GET['filter'] == 'Action')) {
// ...
} else if ((isset($_GET['filter'])) && ($_GET['filter'] == 'Comedy')) {
// ...
}
顺便说一句,这样的代码迟早会成为维护的噩梦。
例如,您可以改为
function preventDirectoryTraversal($requestParam) {
return preg_replace("/'//", "", $requestParam);
}
// ...
if (isset($_GET['filter'])) {
$filterName = preventDirectoryTraversal($_GET['filter']);
include(FILTERS_DIR . "/" . $filterName . ".php");
}
或类似的东西。当然,这可以进一步改进,但我希望你明白这一点。
错误使用 isset,检查文档,返回布尔值。
if (isset($_GET['filter']))
{
switch ($_GET['filter'])
{
case 'Action':
//TODO
break;
case 'Comedy':
// TODO
break;
default:
// TODO
break;
}
}
//isset will always return true or false
if(isset($_GET['filter'])){
if($_GET['filter']=='Action')
{
echo 'Action';
}elseif($_GET['filter']=='Comedy'){
echo 'Comedy';
}
}