1

Тема: Проблема в роботі з формами та switch case

(Використовую програму Xampp)

При першому запуску програми та за замовчуванням(тобто коли форма порожня), під формою виникає повідомлення: 

Ваш бал: А - "Відмінно!"


Ось код:

<html>
    <head>
        <title>Форма для балів</title>
    </head>
    <body>
        <form action="marks.php" method="post">
            <p>Введіть бал(1-100):</p>
                  <p><input type="text" name="mark">            
              <input type="submit" name="submit" value="Ок"></p>
        </form>
        <?php
            $grades = isset($_POST['mark'])?htmlspecialchars($_POST['mark']):'';                
             switch ($grades) {
                case ($grades <= 100 && $grades >= 90):
                    echo '<h2>Ваш бал: А - "Відмінно!"</h2>';
                    break;
                case ($grades <= 89  && $grades >= 80):
                    echo '<h2>Ваш бал: B - "Дуже добре"</h2>';
                    break;
                case ($grades <= 79  && $grades >= 70):
                    echo '<h2>Ваш бал: C - "Добре"</h2>';
                    break;
                case ($grades <= 69  && $grades >= 65):
                    echo '<h2>Ваш бал: D - "Задовільно"</h2>';
                    break;
                case ($grades <= 64  && $grades >= 60):
                    echo '<h2>Ваш бал: E - "Достатньо"</h2>';
                    break;
                case ($grades <= 59  && $grades >= 35):
                    echo '<h2>Ваш бал: FX - "Незадовільно з можливістю повторного складання"</h2>';
                    break;
                case ($grades <= 34  && $grades >= 1):
                    echo '<h2>Ваш бал: X - "Незадовільно з обовязковим повторним курсом"</h2>';
                    break;
                default:
                    echo '<h2>Спробуйте ще раз.</h2>';
                    break;
                }           
        ?>
    </body>
</html>

Вирішення проблеми було знайдено з допомогою коду, в який було включено умовний оператор if else та функцію empty() :

<html>
    <head>
        <title>Форма для балів</title>
    </head>
    <body>
        <form action="marks.php" method="post">
            <p>Введіть бал(1-100):</p>
                  <p><input type="text" name="mark">            
              <input type="submit" name="submit" value="Ок"></p>
        </form>
        <?php
            $grades = isset($_POST['mark'])?htmlspecialchars($_POST['mark']):'';
            if (empty($grades)){
                echo "";
            } else {         
                switch ($grades) {                    
                     case ($grades <= 100 && $grades >= 90):
                        echo '<h2>Ваш бал: А - "Відмінно!"</h2>';
                        break;
                    case ($grades <= 89  && $grades >= 80):
                        echo '<h2>Ваш бал: B - "Дуже добре"</h2>';
                        break;
                    case ($grades <= 79  && $grades >= 70):
                        echo '<h2>Ваш бал: C - "Добре"</h2>';
                        break;
                    case ($grades <= 69  && $grades >= 65):
                        echo '<h2>Ваш бал: D - "Задовільно"</h2>';
                        break;
                    case ($grades <= 64  && $grades >= 60):
                        echo '<h2>Ваш бал: E - "Достатньо"</h2>';
                        break;
                    case ($grades <= 59  && $grades >= 35):
                        echo '<h2>Ваш бал: FX - "Незадовільно з можливістю повторного складання"</h2>';
                        break;
                    case ($grades <= 34  && $grades >= 1):
                        echo '<h2>Ваш бал: X - "Незадовільно з обовязковим повторним курсом"<span>:(</span></h2>';
                        break;
                    default:
                        echo '<h2>Спробуйте ще раз. Зауважте, потрібно ввести число від 1 до 100.</h2>';
                        break;
                    }
            }
        ?>
    </body>
</html>

*WALL*
Питання полягає в тому, що я хочу зрозуміти, чому в першому коді трапилась така помилка?

2

Re: Проблема в роботі з формами та switch case

Ваше рішення буде працювати, але тут потрібно підійти до проблеми із іншого боку, в кейсах ви порівнюєте змінну $grades iз числом.
Ви впевнені що $_POST['mark'] числового типу?
Я от ні, оскільки по перше htmlspecialchars завжди повертає стрінгу
по друге використання тут htmlspecialchars не потрібно зовсім,
і по третє замініть htmlspecialchars на intval. І тут я впевнений що if (empty($grades)) буде не потрібен

(function(){
  console.log("called anonymously");
})()

3

Re: Проблема в роботі з формами та switch case

А Ви можете продемонструвати ту частину коду, на який потрібно замінити ? Можливо я щось роблю неправильно, оскільки у мене запропоноване Вами рішення не запрацювало.

4 Востаннє редагувалося Lace (04.04.2018 20:52:32)

Re: Проблема в роботі з формами та switch case

чому в першому коді трапилась така помилка?

Бо ви не правильно його використовуєте.
Якщо ви хочете використовувати у case порівняння, то замість switch($grades)  використовуйте switch (true).
Також незрозуміло навіщо ви пишете зайві умови, бо switch виконає лише один case, тому ваші
case ($grades <= 69  && $grades >= 65):
case ($grades <= 64  && $grades >= 60):
можна замінити на
case ($grades >= 65):
case ($grades >= 60):

Ви впевнені що $_POST['mark'] числового типу?

Конструкція switch-case використовує нестроге порівняння, тому тип там не має значення.

Мова - це форма нашого життя, життя культурного й національного, це форма національного організування. (Іван Огієнко)

Найбільше і найдорожче добро в кожного народу -  це його мова. Ота жива схованка людського духу, його багата скарбниця, в яку народ складає і своє давнє життя, і свої сподіванки, розум, досвід, почування. (Панас Мирний)
Подякували: leofun01, Übermensch2

5

Re: Проблема в роботі з формами та switch case

Übermensch написав:

Питання полягає в тому, що я хочу зрозуміти, чому в першому коді трапилась така помилка?

Мене більше цікавить, чому в другому коді її не сталося.
switch-case так не працює. У вас обчислюються всі значення в дужках після case-ів і виходить

switch($grades)
{
  case false:...
  case false:...
  ...
}

$grades порівнюється із першим false, і оскільки він пустий, а пустий рядок перетворюється на false, то порівняння спрацьовує.
Вам треба переробити цей код на if - else if - else if ... - else. switch-case тут не годиться, хіба що будете по 10-20 case-ів на варіант ставити.

Подякували: leofun01, Übermensch2

6

Re: Проблема в роботі з формами та switch case

Мене більше цікавить, чому в другому коді її не сталося.

Бо там по дефолту $grades = ''; і в другому випадку до switch-case просто не доходить, а в першому помилка саме через те, що відбувається майже так, як ви написали

    switch(false)
    {
      case false:...
      case false:...
      ...
    }
Мова - це форма нашого життя, життя культурного й національного, це форма національного організування. (Іван Огієнко)

Найбільше і найдорожче добро в кожного народу -  це його мова. Ота жива схованка людського духу, його багата скарбниця, в яку народ складає і своє давнє життя, і свої сподіванки, розум, досвід, почування. (Панас Мирний)

7

Re: Проблема в роботі з формами та switch case

Lace написав:

Конструкція switch-case використовує нестроге порівняння, тому тип там не має значення.

Ви вірно підмітили із switch(true).
ДО того ж можна і строге порівнювати, не суть.
Я не розумію, як можна надіятись на НЕстроге порівняння у випадках коли є порівняння типу <= та >= коли порівнюються стрічка і число, це абсурд так писати. Результат може бути зовсім не такий як очікуєш. пхп нестроготипізована мова, такі речі потрібно враховувати.

(function(){
  console.log("called anonymously");
})()

8 Востаннє редагувалося Lace (04.04.2018 22:12:10)

Re: Проблема в роботі з формами та switch case

ДО того ж можна і строге порівнювати, не суть.

Можна, але конструкція switch-case призначена для іншого, використовувати її так, як вона використовується вище я не бачу жодних причин, краще в даному випадку було б скористатись конструкцією if.

Я не розумію, як можна надіятись на НЕстроге порівняння у випадках коли є порівняння типу <= та >= коли порівнюються стрічка і число, це абсурд так писати.

Все якраз навпаки, при нестрогому порівнянні тип немає жодного значення і (int)1 буде дорівнювати (var)1,  (var)2 буде більше за (int)1, (var)1 буде менше за (int)2.

Результат може бути зовсім не такий як очікуєш.

В даному випадку результат не буде залежати від типу змінної, але враховувати даний нюанс дійсно потрібно.

Мова - це форма нашого життя, життя культурного й національного, це форма національного організування. (Іван Огієнко)

Найбільше і найдорожче добро в кожного народу -  це його мова. Ота жива схованка людського духу, його багата скарбниця, в яку народ складає і своє давнє життя, і свої сподіванки, розум, досвід, почування. (Панас Мирний)
Подякували: leofun011