其他答案已经回答了你的直接问题,但我认为这里有一些更深层次的东西需要解释。
您通常希望避免访问您不确定存在的数组索引。
例如:
$a = array('foo' => 'bar');
echo $a['test']; //bad!
这同样适用于 $_GET、$_POST、$_COOKIE 等。除非您知道它们存在,否则不要访问索引。
请注意,对于用户定义的索引,这转换为“除非您检查过索引是否存在,否则不要访问索引”。
$content = $_GET['content']; //ALWAYS wrong
您可以使用三个选项来检查数组索引:isset、empty 和 array_key_exists。
isset($x)
如果 $x 不为空,则返回 true。 isset
本质上等同于: $x !== null
,除了 isset 不会发出未定义的索引/变量通知。
(empty($x) === (!isset($x) || !$x))
换句话说,empty 认为任何松散地等于 false 的东西都是空的。这在某些情况下很有用。
array_key_exists($key, $array)
是一个简单的保证,$array[$key]
不会发出未定义的索引通知。
那么以正确的方式提取用户输入的最简单方法是什么?
$content = (isset($_GET['content'])) ? $_GET['content'] : null;
在这一点上,您有一个重要的保证,即$content !== null
如果用户提供了输入。
请注意,您还应该避免使用未定义变量的执行路径:
if (isset($_GET['content'])) {
$content = $_GET['content'];
}
echo $content; //WRONG - $content is not guaranteed to be defined
如果 $content 被包裹在 isset 或 empty 中,您可以在这种情况下使用它,但这会妨碍代码的可读性。如果您想在某些条件下保留未定义的变量,请将其定义为 null。这将其保留为“未定义”,而不会发出变量不存在警告。
$a = null;
var_dump($a === $b); //true, because the non-existent $b is treated as false
//(note that this is terrible style though -- this would issue a variable doesn't exist warning for $b
当然,还有 PHP 的过滤器扩展。特别是,您可以使用filter_input来避免重写大量处理用户输入的代码。
您可以在此处或此处的正确部分中阅读有关正确(或偏执狂,有些人可能称之为)输入处理的更多信息。
顺便说一句,您应该始终在错误的情况下进行开发,并且应该监视任何类型的错误(警告、通知等)。这将有助于防止潜在的逻辑错误,并倾向于保持代码清洁。(似乎从不发出通知的代码和编写良好的代码之间存在相关性。)