За последние 24 часа нас посетили 18174 программиста и 1697 роботов. Сейчас ищут 1543 программиста ...

Простая математическая капча с рандомным арифметическим действием

Тема в разделе "PHP для новичков", создана пользователем opiums, 10 окт 2018.

  1. opiums

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

    С нами с:
    6 фев 2015
    Сообщения:
    24
    Симпатии:
    0
    Доброго времени суток, уважаемые форумчане, я пытаюсь написать самостоятельно математическую капчу и не могу разобраться с такой проблемой: при вводе в поле результата я получаю неправильный ответ, по причине того, что символ генерируется. Я понимаю что в данном случае лучше использовать сессии, но я не знаю как правильно переписать код с сессиями, чтобы всё работало на 1й страничке. Подскажите пожалуйста решение?
    PHP:
    1. $min_number = 1;
    2. $max_number = 15;
    3.  
    4. $random_number1 = mt_rand($min_number, $max_number);
    5. $random_number2 = mt_rand($min_number, $max_number);
    6. $random_number3 = mt_rand(1, 3);
    7.  
    8. $captchaResult = htmlspecialchars($_POST['captchaResult']);
    9. $firstNumber = htmlspecialchars($_POST['odin']);
    10. $secondNumber = htmlspecialchars($_POST['dva']);
    11.  
    12. switch ($random_number3){
    13. case 1: $znak = '+'; $checkTotal = $firstNumber + $secondNumber; break;
    14. case 2: $znak = '-'; $checkTotal = $firstNumber - $secondNumber; break;
    15. case 3: $znak = 'x'; $checkTotal = $firstNumber * $secondNumber; break;
    16. }
    17.  
    18. echo '<form method="post">';
    19. echo 'Решите пример: '.$random_number1.' '.$znak.' '.$random_number2.' = ';
    20. echo '<input name="odin" type="hidden" value="'.$random_number1.'" />';
    21. echo '<input name="dva" type="hidden" value="'.$random_number2.'" />';
    22. echo '<input name="captchaResult" type="text" required placeholder="Ответ числом" />';
    23. echo '<input type="submit" value="Отправить">';
    24. echo '</form>';
    25.  
    26. if (isset($_POST['captchaResult']))
    27. {
    28. if ($captchaResult == $checkTotal)
    29. {
    30. echo '<br>Правильно!';
    31. }
    32. else
    33. {
    34. echo '<br>Не правильно!';
    35. }
    36. }
     
  2. lastdays

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

    С нами с:
    27 сен 2012
    Сообщения:
    410
    Симпатии:
    74
    PHP:
    1. <?php
    2.  
    3. if ( isset( $_POST['captchaResult'], $_SESSION["cap_code"] ) and is_numeric($_POST['captchaResult']) and is_array($_SESSION["cap_code"]) )
    4. {
    5.  echo '<div style="color:' .( $_POST['captchaResult'] == $_SESSION["cap_code"][3] ? 'green' : 'red').'">' .( $_POST['captchaResult'] == $_SESSION["cap_code"][3] ? 'Правильно!' : 'Не правильно!').'</div>';
    6.  unset($_SESSION["cap_code"]);
    7. }
    8.  
    9.  
    10. function generate_cap_code()
    11. {
    12.  $min_number = 1;
    13.  $max_number = 15;
    14.  
    15.  if ( !isset( $_SESSION["cap_code"] )  )
    16.  {
    17.  
    18.    $number_1 = mt_rand($min_number, $max_number);
    19.    $number_2 = mt_rand($min_number, $max_number);
    20.  
    21.    $rand = mt_rand(1,3);
    22.    switch ( $rand )
    23.    {
    24.      //- Сложение
    25.      case 1:
    26.        $reply = ($number_1 + $number_2);
    27.        $znak = '+';
    28.      break;
    29.      //- Вычетание
    30.      case 2:
    31.        $reply = ($number_1 - $number_2);
    32.        $znak = '-';
    33.      break;
    34.      //- Умножение
    35.      case 3:
    36.        $reply = ($number_1 * $number_2);
    37.        $znak = '*';
    38.      break;
    39.    }
    40.  
    41.    $_SESSION["cap_code"] = array($number_1, $number_2, $znak, $reply);
    42.  }
    43.  
    44. }
    45.  
    46.  
    47. generate_cap_code();
    48. $cap_code = $_SESSION["cap_code"];
    49.  
    50.  
    51. echo '<form method="post">
    52. Решите пример: '.$cap_code[0].' '.$cap_code[2].' '.$cap_code[1].'
    53. <input name="captchaResult" type="text" required placeholder="Ответ числом" />
    54. <input type="submit" value="Отправить">
    55. </form>';
    Чисто для наглядности))
     
  3. opiums

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

    С нами с:
    6 фев 2015
    Сообщения:
    24
    Симпатии:
    0
    Код хороший, но можно как то избежать сессии?
     
  4. lastdays

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

    С нами с:
    27 сен 2012
    Сообщения:
    410
    Симпатии:
    74
    А зачем? точнее, чем плоха сессия для такого обыденного действа..)
    Записал данные-потер, делов то.

    Не в памяти же хранить c использованием memcache или apc ..))
     
  5. opiums

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

    С нами с:
    6 фев 2015
    Сообщения:
    24
    Симпатии:
    0
    Нет конечно) просто порой когда несколько сессий начинаю путаться
     
  6. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.583
    Симпатии:
    1.761
    @opiums, а ты тут причём? PHP сам следит, чтоб ты работал именно с сессией пользователя, запрос которого в данный момент обрабатывается.