检查$ _POST是否存在


100

我正在尝试检查$ _POST是否存在,如果存在,则在另一个字符串中打印它,如果不存在,则根本不打印。

像这样的东西:

$fromPerson = '+from%3A'.$_POST['fromPerson'];

function fromPerson() {
    if !($_POST['fromPerson']) {
        print ''
    } else {
        print $fromPerson
    };
}

$newString = fromPerson();

任何帮助将是巨大的!

Answers:


171
if( isset($_POST['fromPerson']) )
{
     $fromPerson = '+from%3A'.$_POST['fromPerson'];
     echo $fromPerson;
}

60

简单。您有两种选择:

1.检查是否有任何发布数据

//Note: This resolves as true even if all $_POST values are empty strings
if (!empty($_POST))
{
    // handle post data
    $fromPerson = '+from%3A'.$_POST['fromPerson'];
    echo $fromPerson;
}

(要么)

2.仅检查帖子数据中是否有特定密钥

if (isset($_POST['fromPerson']) )
{
    $fromPerson = '+from%3A'.$_POST['fromPerson'];
    echo $fromPerson;
}

按照施的评论在奥古斯弗朗西斯的回答empty()不是对的选择#1是正确的,因为在PHP中,字符串'0'相当于false-和empty()回报true相当于所有的值设置为false。因此empty,如果值为,则代码将跳过打印'0'。如果要排除空字符串,请参见Augustus答案。
ToolmakerSteve

33

每个人都在说使用isset()-这可能对您有用。

但是,重要的是要了解

$_POST['x'] = NULL;$_POST['x'] = '';

isset($_POST['x'])false在第一个示例上返回,但是true即使您尝试打印任何一个,也将在第二个示例上返回,但两者都将返回空白值。

如果您$_POST来自用户输入的字段/表单,并且留空,那么我相信(尽管我不能100%肯定)该值将为“”,但不能为NULL。

即使这个假设是错误的(如果我错了,请有人纠正我!)以上内容对于将来的使用仍然是一个很好的了解。


4
empty()检查变量是否存在以及是否为非空值,因此这是当空字符串应返回false时要使用的函数。
Han Dijk

1
@HanDijk -按照施的评论在奥古斯弗朗西斯的回答empty()不是在这里正确的,因为在PHP中,字符串'0'相当于false-和empty()回报true相当于所有的值设置为false。因此,使用时empty,如果值为,代码将跳过打印'0'
ToolmakerSteve

30

惊讶它没有被提及

if($_SERVER['REQUEST_METHOD'] == 'POST' && isset($_POST['fromPerson'])){

2
为什么?如果服务器方法不是POST,则将不会设置POST变量,因此仅需要第二部分。我错了吗?
ToolmakerSteve

@ToolmakerSteve是的,在大多数情况下这是足够的,但并非总是我的回答是显示另一种可以完成的方法。
约翰·木兰

如果您有一个带有复选框的表单并且提交时不带名称,它也将起作用。
John Magnolia'3

2
描述一种情况isset($_POST['fromPerson']true,即使if($_SERVER['REQUEST_METHOD'] == 'POST'false。除非有这种情况,否则只需要isset...一部分。
ToolmakerSteve

是的,但这是相反的。fromPerson可能不存在,但POST可能仍然存在。问题是,“ $ _ POST是否存在。” 仅在示例中,使用$ _POST ['fromPerson']。在某些情况下,如@goat此处所述,即使它fromPerson是一个Submit名称,它也可能不会出现在POST中。
papo


13

检查数组键是否存在的正确方法是function array_key_exists()

区别在于,当您拥有 $_POST['variable'] = null它它意味着该键存在并已发送,但值为null

另一个选择是 isset()哪个将检查数组键是否存在以及是否已设置

最后一个选择是使用 empty(),它将检查是否设置了数组键以及是否将值视为空值。

例子:

$arr = [
  'a' => null,
  'b' => '',
  'c' => 1
];

array_key_exists('a', $arr); // true
isset($arr['a']); // false
empty($arr['a']); // true


array_key_exists('b', $arr); // true
isset($arr['b']); // true
empty($arr['b']); // true


array_key_exists('c', $arr); // true
isset($arr['c']); // true
empty($arr['c']); // false

关于你的问题

检查值是否已发送的正确方法是将array_key_exists()与请求方法的检查一起使用

if ($_SERVER['REQUEST_METHOD'] == 'POST' && array_key_exists('fromPerson', $_POST)    
{
   // logic
}

但是有些情况取决于您的逻辑,在哪里isset()empty()可能是好的。


很棒的答案,除了建议使用empty。按照施的评论在奥古斯弗朗西斯的回答empty()不是作为一种替代的选择是正确的,因为在PHP中,字符串'0'相当于false-和empty()回报true相当于所有的值设置为false。因此,使用时empty,如果值为,代码将跳过打印'0'。如果要排除空字符串,请参见Augustus答案。
ToolmakerSteve

最佳答案+1。
维克多·乔拉斯

9
  • 在这种情况下,使用方法isset不合适。

根据PHP文档:http : //php.net/manual/en/function.array-key-exists.php
(请参见示例2# array_key_exists()与isset()
该方法array_key_exists用于检查数组中的键是否存在。

因此,可以将问题中的代码更改如下:

function fromPerson() {
   if (array_key_exists('fromPerson', $_POST) == FALSE) {
        return '';
   } else {
        return '+from%3A'.$_POST['fromPerson'];
   };
}

$newString = fromPerson();


  • 不需要检查数组$ _POST的存在,因为它是PHP环境全局变量,自版本4.1.0起(如今,我们不符合旧版本的PHP)。

isset当设置post字段但包含NULL时,此代码的行为才与解决方案有所不同。如果要允许进入分支,这是一个很好的选择但是,如果需要一个字符串,这是一个错误;在这种情况下,做正确的事,但是此代码不行-它将传递值。罗伯特(Robert)后来的回答证明了差异。NULLelseissetNULL
ToolmakerSteve

6

所有这些方法实际上是鼓励,它在Netbeans的7.4警告,它肯定是一个很好的做法不直接访问超全局变量,使用过滤器代替

$fromPerson = filter_input(INPUT_POST, 'fromPerson', FILTER_DEFAULT);
if($fromPerson === NULL) { /*$fromPerson is not present*/ }
else{ /*present*/ }
var_dump($fromPerson);exit(0);

1
另一方面,代码的可读性也很重要。恕我直言,isset比过滤器表达式更具可读性。但是,谢谢您指出这一点;这是一个有用的选择。
ToolmakerSteve

好了,你可以编写自己的myIsset / 2的包装梅托德使用过滤器,但有/ 2 isset的行为
linuxatico

“实际上不鼓励使用所有方法”-这是一个强有力的声明(即使NetBeans确实将其标记为警告)。你有一个链接到权威来源,即不鼓励到$ _POST直接引用?(关于php 的很多事情都是为了方便编码而设计的,而不是严格的-看看这个问题的答案中有多少人使用不当empty,被php的松散输入绊倒了;很难想象访问$ _POST会被认为是差劲的。风格。)
ToolmakerSteve

4

尝试

if (isset($_POST['fromPerson']) && $_POST['fromPerson'] != "") {
    echo "Cool";
}

Per Han Dijk对Rafael答案的评论进行了empty($_POST['fromPerson'])此组合测试。更易于阅读和输入:)
ToolmakerSteve15年

@ToolmakerSteve:empty('0')返回true。所以不一样。

1
@Shi-是的,您是正确的;我说的错了!似乎没有比这里显示的代码更简单的解决方案了。
ToolmakerSteve


3
if (is_array($_POST) && array_key_exists('fromPerson', $_POST)) {
    echo 'blah' . $_POST['fromPerson'];
}

1
is_array($ _ POST)是否检查POST中是否有任何值?在我的应用中,我正在尝试确定是否有帖子,然后再执行其他操作。
杰夫·拉法

1
看到我的编辑。is_array()检查是否为数组,第二部分检查是否具有键为key的项目'fromPerson'
jezmck'2


1

我想检查它是否已设置,并且在三元运算符中是否为空。

// POST variable check
$userID  = (isset( $_POST['userID'] )    && !empty( $_POST['userID'] ))   ? $_POST['userID']   :  null;
$line    = (isset( $_POST['line'] )      && !empty( $_POST['line'] ))     ? $_POST['line']     :  null;
$message = (isset( $_POST['message'] )   && !empty( $_POST['message'] ))  ? $_POST['message']  :  null;
$source  = (isset( $_POST['source'] )    && !empty( $_POST['source'] ))   ? $_POST['source']   :  null;
$version = (isset( $_POST['version'] )   && !empty( $_POST['version'] ))  ? $_POST['version']  :  null;
$release = (isset( $_POST['release'] )   && !empty( $_POST['release'] ))  ? $_POST['release']  :  null;

5
empty('0')true。所以,最好不要有version 0,或userID 0

0

我想补充一下我的答案,即使这个主题已经存在多年并且对我来说在Google中排名很高。

我最好的方法是尝试:

if(sizeof($_POST) !== 0){
// Code...
}

$_POST数组一样,如果脚本加载并且没有数据存在$_POST变量中数组长度为0。可在IF语句中使用它。

您可能还想知道这是否引发“未定义索引”错误,好像我们正在检查是否$_POST已设置...实际上$_POST始终存在,仅当您尝试搜索$ _POST时才会出现“未定义索引”错误数组值不存在。

$_POST总是存在本身为空或具有数组值。 $_POST['value']可能不存在,从而引发“未定义索引”错误。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.