PHP重定向w / Arrays(不工作?)

时间:2012-10-06 18:52:54

标签: php arrays

我创建了一个如下所示的重定向脚本...无论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();
?>

3 个答案:

答案 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");

这使您免除了ifelse

答案 2 :(得分:0)

您正在检查$_GET['p']的值是否在$link的值列表中,但是您将其用作header()调用中的密钥。看起来您的意思是$_GET['p']数组中的$link一个键

要执行此操作,请使用isset()代替in_array()检查数组的键(in_array()将检查数组的值):

if (isset($link[$p])) {
    header('Location: '.$link[$p]); // Valid p
}