За последние 24 часа нас посетили 21955 программистов и 1147 роботов. Сейчас ищут 336 программистов ...

Задача на работу с формой

Тема в разделе "PHP для новичков", создана пользователем Alexandrinho, 5 дек 2019.

  1. Alexandrinho

    Alexandrinho Новичок

    С нами с:
    5 дек 2019
    Сообщения:
    24
    Симпатии:
    0
    Здравствуйте!
    Только начинаю осваивать php, попалась такая задача, никак не могу понять алгоритм решения (задача предлагается как "Работа с формой"):

    "Cоздать 3 кнопки с названиями 1, 2, 3, расположенные друг над другом. При нажатии на любую кнопку порядок меняется на 2, 1, 3. Затем при нажатии на любую кнопку порядок меняется на 3, 2, 1. Затем при нажатии на любую кнопку порядок меняется на 1, 2, 3. И так далее."

    Во-первых не совсем ясно, что именно должно меняться - надпись на button или само расположение блоков html.

    Я подумал, что все-таки только надпись, т е форма будет такая:

    <form action="index.php" method="get">
    <p>
    <button name="button" value=""><?php echo $a ?></button>
    </p>
    <p>
    <button name="button" value=""><?php echo $b ?></button>
    </p>
    <p>
    <button name="button" value=""><?php echo $c ?></button>
    </p>
    </form>

    Формально решил через сессии:

    <?php
    error_reporting(-1);
    session_start();

    $a = 1;
    $b = 2;
    $c = 3;

    if (isset($_GET['button'])) {
    $_SESSION['count']++; -------- Notice

    if ($_SESSION['count'] == 1) {
    $a = 2;
    $b = 1;
    $c = 3;
    }
    if ($_SESSION['count'] == 2) {
    $a = 3;
    $b = 2;
    $c = 1;
    }

    if ($_SESSION['count'] > 2) {
    session_unset();
    }​
    }

    var_dump($_SESSION);

    ?>

    Но, при $_SESSION['count'] = 1 выдает "Notice: Undefined index: count in ..... " в строке с итерацией.

    И кроме того решение какое-то кривое, как мне кажется, может возможно какой-то другой алгоритм использовать?
     
  2. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.554
    Симпатии:
    1.754
    Ну так в сессии изначально же ничего нету, поэтому и Notice. А так, решение нормальное, если надо именно на PHP.
     
  3. Alexandrinho

    Alexandrinho Новичок

    С нами с:
    5 дек 2019
    Сообщения:
    24
    Симпатии:
    0
    Да, надо на php.
    А без Notice никак нельзя, или ничего страшного, просто хочется чисто, без ошибок и уведомлений?
     
  4. Alexandrinho

    Alexandrinho Новичок

    С нами с:
    5 дек 2019
    Сообщения:
    24
    Симпатии:
    0
    Да, надо на php.
    А без Notice никак нельзя, или ничего страшного, просто хочется чисто, без ошибок и уведомлений?
     
  5. Valick

    Valick Активный пользователь

    С нами с:
    12 авг 2018
    Сообщения:
    1.911
    Симпатии:
    328
    @Alexandrinho, ничего хорошего в этом решении нет.
    1) Сессий быть не должно.
    2) Не надо отталкиваться от того, что количество кнопок три. Решай задачу так будто кнопок может быть произвольное количество.
     
  6. Valick

    Valick Активный пользователь

    С нами с:
    12 авг 2018
    Сообщения:
    1.911
    Симпатии:
    328
    Для начала объяви переменную в которой будешь хранить количество кнопок. Потом на основе этой переменной сформируй массив, количество элементов которого равно созданной переменной.
     
  7. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.554
    Симпатии:
    1.754
    В условии-то про это нету. Как и нету, что это должно меняться у всех посетителей сайта

    Можно. Я же указал почему Notice - надо заранее инициализировать сессию. Ну или проверять перед увеличением, есть ли там уже этот элемент (isset, ??)
     
  8. Artur_hopf

    Artur_hopf Активный пользователь

    С нами с:
    7 май 2018
    Сообщения:
    2.266
    Симпатии:
    405
    Кто круче, @Valick давай как ты там сделаешь без сессии или куков.
    PHP:
    1. <?php
    2. $count = 3;
    3.  
    4. if( isset($_COOKIE['button_count']))
    5. {
    6.   if( $_COOKIE['button_count'] < $count )
    7.   {
    8.     $n = $_COOKIE['button_count'];
    9.     $n++;
    10.     setcookie("button_count", $n);
    11.   }
    12.   else
    13.   {
    14.     $n = 1;
    15.     setcookie("button_count", $n);
    16.   }
    17. }
    18. else
    19. {
    20.   $n = 1;
    21.   setcookie("button_count", $n);
    22.  
    23. }
    24. $button = '';
    25. $s = 0;
    26. $r = 1;
    27. $check = false;
    28. for ($i = 1; $i <= $count; $i++)
    29. {
    30.  
    31.   if($i == 1)
    32.   {
    33.     $s = $n;
    34.   }
    35.   else
    36.   {
    37.  
    38.     if($n === 1){
    39.       $r++;
    40.       $s = $r;
    41.     }
    42.     else
    43.     {
    44.       if($r !== $n)
    45.       {
    46.         if( $check === false )
    47.         {
    48.           $s = $r;
    49.           $r++;
    50.         }
    51.         else
    52.         {
    53.           $r++;
    54.           $s = $r;
    55.         }
    56.       }
    57.       else
    58.       {
    59.         $r++;
    60.         $s = $r;
    61.         $check = true;
    62.       }
    63.  
    64.     }
    65.   }
    66.  
    67.  
    68.  
    69.   $button .= "<button>{$s}</button>";
    70. }
    71. ?>
    72. <form action="" method="POST">
    73. <?=$button;?>
    74. </form>
     
  9. Alexandrinho

    Alexandrinho Новичок

    С нами с:
    5 дек 2019
    Сообщения:
    24
    Симпатии:
    0
    Спасибо!
     
  10. Valick

    Valick Активный пользователь

    С нами с:
    12 авг 2018
    Сообщения:
    1.911
    Симпатии:
    328
    PHP:
    1. <?php
    2. // меняем количество кнопок
    3. $button_num = 3;
    4.  
    5. $get = $_GET['button']??0;
    6. if($get >= $button_num) {
    7.     $get = 0;
    8. }
    9. $get = $get%$button_num;
    10. for($i=$get; $i<$get+$button_num; $i++) {
    11.     $html[] = '<p><button name="button" value="' . ($get + 1) . '">Кнопка ' . ($i%$button_num + 1) . '</button></p>' . PHP_EOL;
    12. }
    13.  
    14. echo '<form>' . implode('', $html) . '</form>';
     
    Alexandrinho и Artur_hopf нравится это.
  11. Artur_hopf

    Artur_hopf Активный пользователь

    С нами с:
    7 май 2018
    Сообщения:
    2.266
    Симпатии:
    405
    @Valick Круто :) но у меня правильно работает, а у тебя нет =))
     
  12. Valick

    Valick Активный пользователь

    С нами с:
    12 авг 2018
    Сообщения:
    1.911
    Симпатии:
    328
    да, не заметил бардака, совсем старый стал, могу поправить не вопрос, но смысл останется такой же
     
  13. Valick

    Valick Активный пользователь

    С нами с:
    12 авг 2018
    Сообщения:
    1.911
    Симпатии:
    328
    @Artur_hopf, вот тебе ещё вариант
    PHP:
    1. <?php
    2. $barduck = ['1,2,3', '2,1,3', '3,2,1'];
    3. $button_num = count($barduck);
    4. $get = $_GET['button'] ?? 0;
    5. $get = (0 > $get || $get >= $button_num) ? 0 : $get;
    6. $bst = PHP_EOL . '<p><button name="button" value="' . ($get + 1) . '">Кнопка ';
    7. $bed = '</button></p>';
    8. $row = $barduck[$get%$button_num];
    9. $arrow = explode(',', $row);
    10. $html = '<form>' . $bst . implode($bed . $bst, $arrow) . $bed . PHP_EOL . '</form>';
    11. echo $html;
     
    #13 Valick, 6 дек 2019
    Последнее редактирование: 6 дек 2019
  14. Artur_hopf

    Artur_hopf Активный пользователь

    С нами с:
    7 май 2018
    Сообщения:
    2.266
    Симпатии:
    405
    @Valick Не, твой первый вариант лучше.