我创建了一个如下所示的重定向脚本...无论p的值是什么,即使有效,它也会重定向到default.htm页面...基本上它正在跳过if / else部分并且总是去别的地方。
有没有关于php头函数的特殊内容,而忽略了条件语句?
<?php
/*
Use the following link format:
<a href="goto.php?p=XXXXXX">XXXXXX</a>
*/
$p = $_GET['p'];
$link = array(
/*Links*/
'link1'=>'/link1.htm',
'link2'=>'/link2.htm',
);
/*Send Headers*/
header('Content-Type: text/html; charset=utf-8');
header('X-Robots-Tag: noindex, nofollow, noarchive', true);
if (in_array($p, $link))
{
header('Location: '.$link[$p]); // Valid p
}
else
{
header('Location: /default.htm'); // Invalid p
}
exit();
?>
答案 0 :(得分:3)
使用array_key_exists这样的
if ((array_key_exists('p', $_GET) && isset($link[$p]))
{
header('Location: '.$link[$p]); // Valid p
}
else
{
header('Location: /default.htm'); // Invalid p
}
以上对我有用,并且它不会显示索引未定义警告,因为您使用array_key exists
答案 1 :(得分:1)
而不是:
if (in_array($p, $link))
你想要:
if (array_key_exists($p, $link))
首先检查值(=>
s的右侧)。第二次检查密钥(=>
s的左侧)。
请参阅:http://php.net/manual/en/function.array-key-exists.php
您的案例中的简短版本是:
$link = @$link[$p] ?: '/default.htm';
header("Location: $link");
这使您免除了if
和else
。
答案 2 :(得分:0)
您正在检查$_GET['p']
的值是否在$link
的值列表中,但是您将其用作header()
调用中的密钥。看起来您的意思是$_GET['p']
数组中的$link
是一个键。
要执行此操作,请使用isset()
代替in_array()
检查数组的键(in_array()
将检查数组的值):
if (isset($link[$p])) {
header('Location: '.$link[$p]); // Valid p
}