Здрасте ! Такой вопрос, хочу реализовать такую фишку: Скрипт генерирует текстовое поле с уникальным именем, например, при просмотре HTML кода, поле для ввода капчи имеет уникальное имя - capcha_E232sa, а после обновления страницы, поле будет уже иметь другое имя, например - capcha_ewe123a Так вот, проблема такая, вот собственно код: Код (Text): $rand = rand(1000,100500); echo " <form method='post'> <input type='text' name='capcha_$rand'> <input type='submit' name='check' value='Отправить'> </form> "; if ($_POST['check']) { $value = $_POST["capcha_$rand"]; echo $value; } Из переменной $value ничего не приходит, в чем проблема?
Код (PHP): echo " <form action='#' method='post'> <input type='text' name='capcha_$rand' value=''> <input type='submit' name='check' value='Отправить'> </form> "; и вывод ошибок включи.... if ($_POST['check']) тут будет первый нотис
Дело даже не в нотисах, а в том, что после отправки запроса страница обновляется, а так как рандом обрабатывается раньше пост, то значение меняется... Зашли на форму $rand сработал и значение у поля input name к примеру такое: "captcha_4fcmv5" Мы ввели туда текст и отправляем форму. И в этот момент у нас обновляется страница и рандом срабатывает еще раз и уже значение "captcha_67fse65" к примеру. И мы тут же хотим его вывести в пост, но форма то отправила изначально "captcha_4fcmv5". По этому у вас не получится сделать так... Это бы выглядело примерно так: Код (PHP): <?php $rand=rand(1000,100500); if(isset($_POST['check'])) { if(isset($_POST['rand']) && isset($_POST['capcha_'.$_POST['rand']])) { $value=$_POST['capcha_'.$_POST['rand']]; echo $value; } } echo'<form method="post"> <input type="hidden" name="rand" value="'.$rand.'"> <input type="text" name="capcha_'.$rand.'"> <input type="submit" name="check" value="Отправить"> </form>'; ?>
Зачем такие сложности?) Как вы смотрите на это?) В принципе почти тоже самое, но меньше кода) Код (PHP): $_SESSION['rand']= isset($_POST['check']) ? $_SESSION['rand'] :rand(1000,100500); echo '<input type="text" name="capcha_'.$_SESSION['rand'].'">';
Спасибо большое за ответы! Your отдельное спасибо за пояснения. Dmitriy A. Arteshuk, нотиса нету, возможно у меня такая конфигурация PHP. А вообще, я почти всегда пишу if ($_POST['value']) без isset..(если вы про это).
r3l0c, причет тут сесии, я детально объяснил задачу, чтобы было понятно почему так происходит... У вас же сессия сохранится и все постоянно будет висеть... А тут нужна уникальность... А у вас ее нет... Не, не, не... Код (PHP): error_reporting(E_ALL); Напишите выше всего скрипта.
Не, я имел ввиду -- зачем столько лишнего кода для столь простой задачи?) Поторопился с кодом я еще-- Код (PHP): if (!isset($_POST['capcha'.$_SESSION['rand']])) { $_SESSION['rand']=rand(1000,100500); echo'<form method="post"> <input type="text" name="capcha_'.$_SESSION['rand'].'"> <input type="submit" name="check" value="Отправить"> </form>'; } else {echo 'Form is submited';}
Вообще я бы так не делал. Смысла нет, от этого. Что так, что так. Ибо поле все равно известно, лишняя обработка. В таком случае эту лишнюю обработку "соль" делать после отправки значения пост.
Поле в любом случае известно =), я бы никак из предложенных способов не делал, в том числе и мною предложенным тоже не стал делать xD. Капча рулит%)
Почему известно? Разве это не защитит от ботов? Может опытные посоветуют, как можно на 99% защитить от ботов без капчи, и прочих систем которые отвлекают пользователей? А что если генерировать слово type="text" (слово - text) рандомно, и забивать его в css? Обьясните нубу, как бот распознает поле?
вариант. добавьте к форме любое поле, с осмысленным именем. присвойте ему особый класс. а в CSS сделайте элементы этого класса невидимыми. профит! нормальный юзер - никогда не будет его заполнять, ибо просто неувидит. бот - тупо заполняет все поля формы(обычно), и раз оно заполнено, значит форму отправил бот. большинтсво тупых ботов отсеит точно. ну а от индивидуальной настройки бота на вас сайт это конечно не спасет.
Можете пример привести? (код) Буду очень благодарен! Хотя спасибо, сам разобрался. Продолжу идею, если наше невидимое заполнено, то блокировать, ибо это бот, я верно думаю?