2013-03-01 91 views
0

如果可能被随意地运行为get()一个post(),使$id = $_POST['id']可能得到一个空值的查询,任何这些的良好实践方法来测试的可能发布变量的存在。这是测试发布变量存在的正确方法吗?

if (!empty($_POST['id'])){ $id = $_POST['id'];}else{$id = FALSE;}

if (isset($_POST['id'])){ $id = $_POST['id'];}else{$id = FALSE;}

$id = isset($_POST['id']) ? $_POST['id'] : FALSE;

或者是有一些其他优选的方法?他们都做了两次$_REQUEST(),这让我觉得可能有更好的办法。

谢谢!

+0

使用'array_key_exists($ _ POST, '变量')'。 – meagar 2013-03-01 19:17:43

+0

其中任何一个都很好,最后一个(三元)是最好的。 – 2013-03-01 19:17:51

+0

'isset($ _ POST)'或'isset($ _ GET)'检查所采用的方法 – 2013-03-01 19:19:01

回答

1

我会去的:

$id = isset($_POST['id']) && strlen($_POST['id']) > 0 ? (int)$_POST['id'] : FALSE; 

首先,它checkes如果VAR设置,然后检查长度大于0

在我看来,这是最好的可读性,如你不需要5行代码,如果你正确地缩进它,是什么使得它更难阅读,让您的文件不再:

if (isset($_POST['id'])){ 
    $id = $_POST['id']; 
}else{ 
    $id = FALSE; 
} 

如果您使用$ _ POST一个简单的事,作为一个ID,只需将其转换为一个int(int)$ _ POST ['id']。这样你肯定有一个号码。

+0

不错的解决方案。谢谢,约翰。 – 1252748 2013-03-01 19:56:27

0

虽然都可以使用,你的第一个选项是检查的最佳方式:

if (!empty($_POST['id'])){ $id = $_POST['id'];}else{$id = FALSE;} 

以下因素都考虑在内empty()

  • “”(空字符串)
  • 0(0作为整数)
  • 0.0(0作为浮点数)
  • “0”(0作为字符串)
  • NULL
  • FALSE
  • 阵列()(空数组)
  • $变种; (变量声明,但没有值)

isset()只检查它是否为空。

+0

aha,是的,但'id'可以是'0'。所以我想我会用'isset()'去。谢谢! – 1252748 2013-03-01 19:20:45

+0

你应该在问题中提到这个问题!那么'isset()'会是理想的。 – SeanWM 2013-03-01 19:25:43

0
function getByKey($arr, $key, $default = false) { 
    return isset($arr[$key]) ? $arr[$key] : $default; 
} 

$id = getByKey($_POST, 'id'); 

另一种方式是像

$id = filter_input(INPUT_POST, 'id', FILTER_VALIDATE_INT, array(
     'options' => array(
      'min_range' => 1, 
      'max_range' => 255, 
      'default' => 1, 
     ) 
    )); 
1

我会用

if (isset($_POST['id']) && strlen($_POST['id'])) $id = (int)$_POST['id']; 

测试

  • 如果值设置(以不触发通知) ,和
  • 如果它是一个空字符串''

empty()的问题是,它把0和0.0为空的,这可能是有问题的值有时是0。

问题与单独isset()是它把''(空字符串)的设置,所以如果有人碰巧提交表单没有填写某一特定领域,isset()会让它通过返回TRUE传递。 strlen()用于检查非零长度的值是否真的存在。

+0

这似乎很全面。 strlen($ _ POST ['id']))''''id =(int)$ _ POST ['id'];''是否意味着分号?谢谢 – 1252748 2013-03-01 19:55:16

+0

@thomas不,没有。这是一条简单的'if'语句。 – Antony 2013-03-01 19:56:10

+0

哦对。很抱歉误读了。谢谢! – 1252748 2013-03-01 19:57:16

0

如果查询可能被随意地运行作为GET()或后()

如果什么它是贴有一个查询字符串(这样既$_GET$_POST包含id)?

POST /yourscript.php?id=4 
Host: yoursite.com 

id=3 

您必须选择要使用的id(这完全取决于你)。

作为替代别人所提出的建议,你可以使用PHP的内置filter functions

$id = filter_input(INPUT_POST, 'id', FILTER_VALIDATE_INT, FILTER_NULL_ON_FAILURE); 
相关问题