避免在表单上使用isset()?

时间:2012-02-17 16:27:50

标签: php forms

当你有很多输入(选择/ textarea / input)时,当你加入isset()

时,它会显得很乱

例如:

<input id="firstname" type="text" name="firstname" 
  value="<?php echo (isset($_POST['firstname']) ? $_POST['firstname'] : "";?>">

在另一种方式中,它看起来整洁和可维护吗?

如果有帮助,我正在使用MVC Framework。

6 个答案:

答案 0 :(得分:3)

您可以预先解析您正在使用的所有变量:

<?php
$v_list = array('firstname', 'lastname', 'birthdate');
$v_vals = array();
foreach ($v_list as $v) {
    if (isset($_POST[$v])) $v_vals[$v] = $_POST[$v];
    else $v_vals[$v] = "";
}
?>

<input ... value="<?php echo $v_vals['firstname']; ?>" />

答案 1 :(得分:2)

如果行为始终相同,请定义一个命名短的函数:

function val ($variable, $default)
{
  if isset($variable)
      return $variable;
  else
     return $default;
}

然后像这样使用它:

<input id="firstname" type="text" name="firstname" 
  value="<?= val(@$_POST['firstname'],"")?>">

还要注意最后的“;”

中没有其他内容,则不需要

最后,<?=<? echo的快捷方式,但它仅适用于短标记(<?),而不适用于<?php

这不是很棒但是更简洁。

答案 2 :(得分:1)

由于您使用的是MVC,因此应避免在视图中轮询超变量。此外,array_key_exists优于isset这类事情。

所以,在控制器中你应该:

$myview->firstname = array_key_exists( 'firstname', $_POST ) ? $_POST['firstname'] : '';

并在视图中

<input id="firstname" type="text" name="firstname" value="<?= $this->firstname ?>" />

答案 3 :(得分:0)

您可以构建自己的函数来填充值:

function get_post( $key, $default = ''){
    if( isset( $_POST[$key])){
       return htmlspecialchars( $_POST[$key]);
    }
    return htmlspecialchars( $default);
}

并将其用作:

<input ... value="<?php echo get_post( 'firstname', 'Your name'); ?>" />

或者无论如何它都会被整合到你的框架中。

如果您需要更完整的按键,可以这样做:

function get_post( ){
    $args = func_get_args();
    if( count( $args) < 2){
       // Wrong usage, throw an exception
    }
    $default = array_pop( $args);

    $progress = $_POST;
    while( $key = array_shift( $args)){
        if( !is_array( $progress) || !isset( $progress[$key])){
           $progress = $default;
           break;
        }
        $progress = $progress[$key];
    }
    return htmlspecialchars( $progress);
}

echo get_post( 'my', 'multiple', 'keys', 'default');

准备变量

您也可以利用php array operator+并设置所有变量:

<?php

$myList = array( 'name' => 'Your name', 'another' => 'Another');
$values = $_POST + $myList;

而不仅仅是:

<?php echo htmlspecialchars( $values['name']); ?>

答案 4 :(得分:0)

与许多其他概念一样,PHP用户也错了。

当用户收到“未定义的变量”消息时,通常会对此表达态度:“多么吵闹的东西!是否有虔诚的方法来摆脱它?” “当然可以!” - 来自一个PHP用户和一些代码,从来没有忙着问一个问题:那个错误信息是什么?为什么我得到它?我应该纠正吗?

所以,这里有isset或isset的一些包装器。

但是如果你想到错误信息的含义,很明显程序员必须总是知道他有哪些变量以及什么是值。

“Undefined variable”消息只是一个提示:你不知道你正在使用什么变量以及它是否存在!

因此,正确的解决方案是定义一个您将在表单中使用的变量。对于空的,你必须定义一个空的。但是,您通常不需要检查每一个。一个条件就足够了。

因此,正确的 定义您在模板中使用的每个变量,然后再加载它。

更不用说你不应该在value属性中发布原始数据,而是总是通过htmlspecialchars()

传递它

答案 5 :(得分:-2)

访问未定义的变量会抛出E_NOTICEE_NOTICE可以或多或少地被忽略(否则它们将是E_WARNINGE_ERROR s),因此设置error_reporting(E_ALL ^ E_NOTICE)并回显这些变量而不先检查它们的存在。

或者,不要为每个人键入isset,而是定义一个类似的函数:

<?php
function echoifset(&$var) {
    if( isset($var)) echo $var;
}
?>

然后你可以打电话给<?php echoifset($_POST['firstname']); ?>,它就像你目前的所有支票一样。