Избегать использования isset () в форме? - PullRequest
4 голосов
/ 17 февраля 2012

Когда у вас много входов (выберите / textarea / input), это будет выглядеть очень грязно, если вы включите isset()

Например:

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

Есть ли альтернативный способ, чтобы он выглядел аккуратно и легко обслуживалось?

Я использую MVC Framework, если это поможет.

Ответы [ 6 ]

3 голосов
/ 17 февраля 2012

Вы можете предварительно проанализировать все переменные, которые вы используете:

<?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']; ?>" />
2 голосов
/ 17 февраля 2012

Если поведение всегда одинаковое, определите функцию с коротким именем:

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

Тогда используйте это так:

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

Также обратите внимание, что последний ";" не требуется, если у вас нет ничего внутри

Наконец, <?= является ярлыком для <? эха, но работает только с короткими тегами (<?), а не с <?php.

Это не круто, но намного короче.

1 голос
/ 17 февраля 2012

Поскольку вы используете MVC, вам следует избегать опроса супервариабельных переменных в представлении.Кроме того, array_key_exists превосходит isset для такого рода вещей.

Итак, в контроллере вы должны иметь:

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

и в представлении

<input id="firstname" type="text" name="firstname" value="<?= $this->firstname ?>" />
0 голосов
/ 17 февраля 2012

Как и многие другие концепции, пользователи PHP ошибочно принимают это.

Когда пользователь получает сообщение «Неопределенная переменная», к нему обычно относятся: «Что за шумная вещь! Есть ли благочестивый метод, чтобы избавиться от него?» "Конечно!" - приходит с таким же пользователем PHP-кода, не занимая себя вопросом: что это за сообщение об ошибке? Почему я получаю это? Должен ли я исправить это?

Итак, вот isset или какая-то оболочка для isset.

Но если вы задумаетесь о значении сообщения об ошибке, станет ясно, что программисту всегда нужно знать, какие у него переменные и какие значения.

А сообщение «Неопределенная переменная» - всего лишь подсказка: вы не представляете, какую переменную вы используете и существует ли она когда-либо!

Итак, правильное решение - определить переменную, которую вы собираетесь использовать в форме. Для пустого вы должны определить пустой. Вам обычно не нужно проверять каждый, хотя. Достаточно одного условия.

Итак, истинно правильно будет определять каждую переменную, которую вы собираетесь использовать в шаблоне перед загрузкой.

Не говоря уже о том, что вы не должны публиковать необработанные данные в атрибуте value, а всегда передавать их через htmlspecialchars ()

0 голосов
/ 17 февраля 2012

Вы можете создать свою собственную функцию, которая будет заполнять значения:

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'); ?>" />

Или в любом случае, чтобы она была включена в вашу среду.1007 *

Если вам нужны более полные ключи, вы можете сделать это так:

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']); ?>
0 голосов
/ 17 февраля 2012

При доступе к неопределенной переменной выдается E_NOTICE.E_NOTICE s можно более или менее игнорировать (в противном случае они будут E_WARNING s или E_ERROR s), поэтому установите error_reporting(E_ALL ^ E_NOTICE) и выведите эти переменные без предварительной проверки их существования.

В качестве альтернативы,вместо того, чтобы набирать isset для каждого, определите функцию следующим образом:

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

Тогда вы можете просто вызвать <?php echoifset($_POST['firstname']); ?>, и она сделает то же самое, что и все ваши текущие проверки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...