0

我制作了一个如下所列的重定向脚本...无论传递什么 p 值,即使有效,它也会被重定向到 default.htm 页面...本质上它是跳过 if/else 部分并始终转到别的。

php header 函数有什么特别之处吗?它忽略了条件语句?

<?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();
?>
4

3 回答 3

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 存在,它也不会显示索引未定义警告

于 2012-10-06T19:02:43.740 回答
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");

这可以让你省去ifand else

于 2012-10-06T18:59:31.733 回答
0

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

为此,请使用isset()而不是in_array()检查数组的键(in_array()将检查数组的值):

if (isset($link[$p])) {
    header('Location: '.$link[$p]); // Valid p
}
于 2012-10-06T18:56:41.100 回答