Как проверить множественный GET, если он равен строке?

#php

#php

Вопрос:

в этом php-коде я пытаюсь проверить, задан ли один из этих запросов, и если один из них value == ‘x’, но функция всегда выводит «выбрано» для всех параметров, что я делаю не так?

Функция:

 function getSortBy(){
    
        if (isset($_GET['sortby']) amp;amp; !empty($_GET['sortby'])) {
            
            if ($_GET['sortby'] == 'default') {
                return 'selected';
            }elseif($_GET['sortby'] == 'price-desc'){
                return 'selected';
            }elseif($_GET['sortby'] == 'price-asc'){
                return 'selected';
            }elseif($_GET['sortby'] == 'date-desc'){
                return 'selected';
            }elseif($_GET['sortby'] == 'date-asc'){
                return 'selected';
            }elseif($_GET['sortby'] == 'size-desc'){
                return 'selected';
            }elseif($_GET['sortby'] == 'size-asc'){
                return 'selected';
            }else{
                return null;
            }
    
        }else{
            return null;
        }
    }
  

HTML:

 <select>
<option value="default" <?php echo getSortBy(); ?>>Default</option>
<option value="price-desc" <?php echo getSortBy(); ?>>Price High to Low</option>
</select>
  

Комментарии:

1. То, как вы его закодировали, всегда будет возвращаться selected . Что вы ожидаете напечатать. Допустим, если $_GET[‘sortby’] == ‘price-desc’, что вы хотите напечатать в своем HTML?

2. Ваша функция говорит, что когда любое из этих значений равно true, оно возвращает selected . Вероятно, вы хотите передать в эту функцию значение, например <?php echo getSortBy('price-desc'); ?> , и в вашей функции просто проверить if ($_GET['sortby'] == $valPassedIntoFunction) { return 'selected'; } или подобное.

3. Не забывайте, что вам нужно добавить атрибут name к вашему элементу select. В вашем примере нет атрибута имени ‘sortby’ и, следовательно, нет ключа в $ _GET.

Ответ №1:

Это работает с PHP 7.3.

Файл: test_html1.php

Источник:

 <?php
$options = [
    'default' => 'Default',
    'price-desc' => 'Price High to Low',
];
$currVal = isset($_GET['sortby']) ? $_GET['sortby'] : '';
?>
<html>
<form>
    <select name="sortby">
        <?php foreach ($options as $val => $name) : ?>
            <option value="<?php echo $val; ?>" <?php if ($currVal == $val) echo ' selected="selected"' ?>>
                <?php echo $name; ?>
            </option>
        <?php endforeach; ?>
    </select>
    <input type="submit" />
</form>
</html>
  

Поместите его на сервер для тестирования, например http://localhost/test_html1.php .

Ответ №2:

Вы хотите сравнить значение $_GET['sortby'] со значением параметров, в противном случае, если $_GET['sortby'] имеет какое-либо из этих значений, все элементы option будут иметь атрибут selected .

PHP:

 function getSortBy($value){ 
   if (isset($_GET['sortby']) amp;amp; !empty($_GET['sortby'])) {
      if ($_GET['sortby'] == $value) {
          return 'selected';
      } else {
          return null;
      } 
   } else {
      return null;
   }
}
  

HTML:

 <select>
<option value="default" <?php echo getSortBy('default'); ?>>Default</option>
// ect.
<option value="price-desc" <?php echo getSortBy('price-desc'); ?>>Price High to Low</option>
</select>
  

Ответ №3:

Короткое и простое:

 <select>
    <option value="default" <?= markSelected('default') ?>>Default</option>
    <option value="price-desc" <?= markSelected('price-desc') ?>>Price High to Low</option>
</select>
<?php

function markSelected($value)
{
    if ($_GET['sortby'] ?? null === $value)
    {
        return 'selected';
    }

    return null;
}
  

Ответ №4:

Что-то вроде этого должно работать:

 function getSortBy ($value)
{
     if (isset($_GET['sortby']) amp;amp; $_GET['sortby'] === $value) {
         return "value = '$value' selected ";
     }

     return "value = '$value' ";
}
  

HTML:

 <select>
<option <?= getSortBy('default') ?>>Default</option>
<option <?= getSortBy('price-desc') ?>>Price High to Low</option>
</select>