За последние 24 часа нас посетили 72317 программистов и 36541 робот. Сейчас ищут 2315 программистов ...

Капча

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

  1. Rishat1c

    Rishat1c Новичок

    С нами с:
    14 мар 2017
    Сообщения:
    11
    Симпатии:
    0
    Адрес:
    Набережные Челны
    Всем привет, не так давно окунулся в мир php, перед этим немного лет поплавал в pawn

    Решил реализовать систему капчи, беру два числа $a и $b
    Пытаюсь их суммировать и проверить $_POST['capt']==$c ($c сумма $a и $b)

    Вот собственно сам код
    PHP:
    1. <?php
    2. $a=rand(1,10);
    3. $b=rand(1,10);
    4. $c=$a+$b;
    5.  
    6. if(isset($_POST['capt']) && !empty($_POST['capt'])) {
    7.     if(isset($_POST['capt2'])) {
    8.         if($_POST['capt']==$c) {
    9.             echo 'Капча введена ВЕРНО, сумма ', $c;
    10.         } else {
    11.             echo 'Капча введена НЕВЕРНО, сумма ', $c;
    12.         }
    13.     }
    14. }
    15.  
    16. ?>
    17.  
    18. <form action="" method="POST">
    19.     <? echo $a, ' + ', $b, ' = ?'; ?><br>
    20.     <input type="text" name="capt"><br>
    21.     <input type="submit" name="capt2" value="Выполнить">
    22. </form>
    Тема такая, что при вызове кнопки 'submit' он уже изменяет переменные :-(
    Прошу прощения за строение кода, т.к. на данном этапе изучаю базу
    [​IMG]

    p.s. в теории, понимаю, что можно это реализовать путем использовании сессии

    Помогите, господа кодеры
     
  2. mahmuzar

    mahmuzar Старожил

    С нами с:
    6 апр 2012
    Сообщения:
    4.601
    Симпатии:
    423
    Адрес:
    РД, г. Махачкала.
    @Rishat1c, а в чем проблема, если в теории знаешь как реализовать через сесси?
     
  3. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.497
    Симпатии:
    1.726
    Конечно изменяет. Капчу надо сгенерировать, сохранить в сессии, и только потом проверить. мы же знаем, как работает php: phpfaq.ru/na_tanke
     
  4. mahmuzar

    mahmuzar Старожил

    С нами с:
    6 апр 2012
    Сообщения:
    4.601
    Симпатии:
    423
    Адрес:
    РД, г. Махачкала.
    Isset и проверка именно нажатия кнопки, мне кажется лишены смысла. Я дума можно код сократить.
    PHP:
    1. if (!empty($_POST['capt'])) {
    2.     if ($_POST['capt'] == $c) {
    3.         echo 'Капча введена ВЕРНО, сумма ', $c;
    4.     } else {
    5.         echo 'Капча введена НЕВЕРНО, сумма ', $c;
    6.     }
    7. }
     
    TeslaFeo нравится это.
  5. TeslaFeo

    TeslaFeo Старожил

    С нами с:
    9 мар 2016
    Сообщения:
    2.971
    Симпатии:
    753
    так и должно быть.
    а в чем проблема?
     
  6. alexblack

    alexblack Старожил

    С нами с:
    20 янв 2016
    Сообщения:
    638
    Симпатии:
    380
    Как пример:
    page1.php
    PHP:
    1. <?php
    2.     session_start();
    3.  
    4.     $digit1 = mt_rand(1,20);
    5.     $digit2 = mt_rand(1,20);
    6.     if( mt_rand(0,1) === 1 ) {
    7.             $math = "$digit1 + $digit2";
    8.             $_SESSION['answer'] = $digit1 + $digit2;
    9.     } else {
    10.             $math = "$digit1 - $digit2";
    11.             $_SESSION['answer'] = $digit1 - $digit2;
    12.     }
    13.  
    14.     ?>
    15.  
    16.     <form method="POST" action="page2.php">
    17.             <?php echo $math; ?> = <input name="answer" type="text" /><br />
    18.             <input type="submit" />
    19.     </form>
    page2.php
    PHP:
    1. <?php
    2.     session_start();
    3.     if ($_SESSION['answer'] == $_POST['answer'] )
    4.             echo ' <b>Это правильный ответ</b>';
    5.     else
    6.             echo 'Не верный ответ. Ожидалось '.$_SESSION['answer'];
    7.  
    8.     ?>
     
  7. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.333
    Симпатии:
    1.753
    штьё ета?
    --- Добавлено ---
    вариантов два:
    1. сессия
    2. подписанные переменные пихать в хидден инпут на форме, а на сервере проверять, что это именно те переменные, потом что подпись правильная. Плюсы - ничего не надо хранить; капча не дохнет, но можно добавить подписанное же время.
     
  8. denis01

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

    С нами с:
    9 дек 2014
    Сообщения:
    12.213
    Симпатии:
    1.711
    Адрес:
    Молдова, г.Кишинёв
    Попробую угадать, он писал скрипты для игр, half-life, counter-strike или подобное, википедия на это намекает