Доброго времени суток, уважаемые форумчане, я пытаюсь написать самостоятельно математическую капчу и не могу разобраться с такой проблемой: при вводе в поле результата я получаю неправильный ответ, по причине того, что символ генерируется. Я понимаю что в данном случае лучше использовать сессии, но я не знаю как правильно переписать код с сессиями, чтобы всё работало на 1й страничке. Подскажите пожалуйста решение? PHP: $min_number = 1; $max_number = 15; $random_number1 = mt_rand($min_number, $max_number); $random_number2 = mt_rand($min_number, $max_number); $random_number3 = mt_rand(1, 3); $captchaResult = htmlspecialchars($_POST['captchaResult']); $firstNumber = htmlspecialchars($_POST['odin']); $secondNumber = htmlspecialchars($_POST['dva']); switch ($random_number3){ case 1: $znak = '+'; $checkTotal = $firstNumber + $secondNumber; break; case 2: $znak = '-'; $checkTotal = $firstNumber - $secondNumber; break; case 3: $znak = 'x'; $checkTotal = $firstNumber * $secondNumber; break; } echo '<form method="post">'; echo 'Решите пример: '.$random_number1.' '.$znak.' '.$random_number2.' = '; echo '<input name="odin" type="hidden" value="'.$random_number1.'" />'; echo '<input name="dva" type="hidden" value="'.$random_number2.'" />'; echo '<input name="captchaResult" type="text" required placeholder="Ответ числом" />'; echo '<input type="submit" value="Отправить">'; echo '</form>'; if (isset($_POST['captchaResult'])) { if ($captchaResult == $checkTotal) { echo '<br>Правильно!'; } else { echo '<br>Не правильно!'; } }
PHP: <?php session_start(); if ( isset( $_POST['captchaResult'], $_SESSION["cap_code"] ) and is_numeric($_POST['captchaResult']) and is_array($_SESSION["cap_code"]) ) { echo '<div style="color:' .( $_POST['captchaResult'] == $_SESSION["cap_code"][3] ? 'green' : 'red').'">' .( $_POST['captchaResult'] == $_SESSION["cap_code"][3] ? 'Правильно!' : 'Не правильно!').'</div>'; unset($_SESSION["cap_code"]); } function generate_cap_code() { $min_number = 1; $max_number = 15; if ( !isset( $_SESSION["cap_code"] ) ) { $number_1 = mt_rand($min_number, $max_number); $number_2 = mt_rand($min_number, $max_number); $rand = mt_rand(1,3); switch ( $rand ) { //- Сложение case 1: $reply = ($number_1 + $number_2); $znak = '+'; break; //- Вычетание case 2: $reply = ($number_1 - $number_2); $znak = '-'; break; //- Умножение case 3: $reply = ($number_1 * $number_2); $znak = '*'; break; } $_SESSION["cap_code"] = array($number_1, $number_2, $znak, $reply); } } generate_cap_code(); $cap_code = $_SESSION["cap_code"]; echo '<form method="post"> Решите пример: '.$cap_code[0].' '.$cap_code[2].' '.$cap_code[1].' <input name="captchaResult" type="text" required placeholder="Ответ числом" /> <input type="submit" value="Отправить"> </form>'; Чисто для наглядности))
А зачем? точнее, чем плоха сессия для такого обыденного действа..) Записал данные-потер, делов то. Не в памяти же хранить c использованием memcache или apc ..))
@opiums, а ты тут причём? PHP сам следит, чтоб ты работал именно с сессией пользователя, запрос которого в данный момент обрабатывается.