Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: Как прикрутить капчу (проект KCAPTCHA) к форме
Форумы портала PHP.SU » » Вопросы новичков » Как прикрутить капчу (проект KCAPTCHA) к форме

Страниц (2): [1] 2 »
 

1. Hawkmoth - 26 Января, 2012 - 23:21:48 - перейти к сообщению
Думал, чего уж проще - всё сделали за меня, осталось только в корневик положить. Не тут-то было. Скрипт капчи качал с этого сайта:
http://www[dot]captcha[dot]ru/kcaptcha/

Возился, но допетрить все равно не смог. В архиве есть файл index.php, название которого я, естественно, меняю, потому что у меня в index.php лежит собственно форма. В начало своего файла добавляю
PHP:
скопировать код в буфер обмена
  1. include("индекс.php_из_архива");


А в описание формы добавляю
PHP:
скопировать код в буфер обмена
  1. <td><label for="email">Введите код</label></td>
  2.     <td><p><img src="./?<?PHP echo session_name()?>=<?PHP echo session_id()?>"></p>
  3. <p><input type="text" id="keystring" name="keystring" /></p></td>
  4.   </tr>


Ну и в обработчике, естественно, пара строк. Но до обработки дело не доходит, потому что вместо моей страницы с формой открывается только капча в левом верхнем углу браузера - т.е. открывается index.php из скачанного архива. Если убираю
PHP:
скопировать код в буфер обмена
  1. include("индекс.php_из_архива");

естественно, никакой капчи не видно...

Если кто-то понял мои объяснения, прошу помочь Улыбка
2. Bio man - 26 Января, 2012 - 23:32:24 - перейти к сообщению
Hawkmoth пишет:
<img src="./?<?PHP echo session_name()?>=<?PHP echo session_id()?>">
может
CODE (htmlphp):
скопировать код в буфер обмена
  1. <img src="/путь к файлу капчи, который отдает картинку ("в скрипте должны отправляться заголовки image/jpg|gif|png|итд")?num=<?=mt_rand(0, 9999)?>">
3. Hawkmoth - 27 Января, 2012 - 00:00:27 - перейти к сообщению
В архиве лежал файл form_example.php, иллюстрирующий простейшую форму с предложенной капчой. Его содержание:
PHP:
скопировать код в буфер обмена
  1. <?PHP
  2. ?>
  3. <form action="" method="post">
  4. <p>Enter text shown below:</p>
  5. <p><img src="./?<?PHP echo session_name()?>=<?PHP echo session_id()?>"></p>
  6. <p><input type="text" name="keystring"></p>
  7. <p><input type="submit" value="Check"></p>
  8. </form>
  9. <?PHP
  10. if(count($_POST)>0){
  11.         if(isset($_SESSION['captcha_keystring']) && $_SESSION['captcha_keystring'] === $_POST['keystring']){
  12.                 echo "Correct";
  13.         }else{
  14.                 echo "Wrong";
  15.         }
  16. }
  17.  
  18. unset($_SESSION['captcha_keystring']);
  19. ?>


В файле index.php (тот, который в архиве), вот что:
PHP:
скопировать код в буфер обмена
  1. <?PHP
  2.  
  3.  
  4. include('kcaptcha.php');
  5.  
  6.  
  7. $captcha = new KCAPTCHA();
  8.  
  9. if($_REQUEST[session_name()]){
  10.         $_SESSION['captcha_keystring'] = $captcha->getKeyString();
  11. }
  12.  
  13. ?>


А вся генерация капчи лежит в отдельном файле kcaptcha.php.

В общем, я тупо собезьянничал и скопировал строчку
CODE (htmlphp):
скопировать код в буфер обмена
  1. <p><img src="./?<?php echo session_name()?>=<?php echo session_id()?>"></p>


из файла form_example.php.
Но ничего не работает.
Кто скажет, где я дурак?
4. Dezmont - 27 Января, 2012 - 08:03:10 - перейти к сообщению
PHP:
скопировать код в буфер обмена
  1. <?PHP
  2. ?>
  3. <form action="" method="post">
  4. <p>Enter text shown below:</p>
  5. <p><img src="./?<?PHP echo session_name()?>=<?PHP echo session_id()?>"></p>
  6. <p><input type="text" name="keystring"></p>
  7. <p><input type="submit" value="Check"></p>
  8. </form>
  9. <?PHP
  10. if(count($_POST)>0){
  11.         if(isset($_SESSION['captcha_keystring']) && $_SESSION['captcha_keystring'] === $_POST['keystring']){
  12.                 echo "Correct";
  13.         }else{
  14.                 echo "Wrong";
  15.         }
  16. }
  17. unset($_SESSION['captcha_keystring']);
  18. ?>

Всё что между PHP тэгами нужно. 1) Открывает сессию, никакого вывода не должно быть до этого.
2) Грубо говоря ссылка на картинку.
3) Проверка капчи на правильность.

З.Ы. Вместо тегов формы вставьте свою ХТМЛ страницу с капчей там, где надо, и всё должно заработать.
5. Hawkmoth - 27 Января, 2012 - 12:51:22 - перейти к сообщению
Да, спасибо, это я понимаю.
В принципе, загвоздка только вот в чем: если я переименовываю лежащий в архиве файл index.php, капча перестает работать.

Если я переименовываю свой файл, оставляя скачанный index.php нетронутым, всё хорошо. Т.е., где-то в файлах капчи теряется связь. Но я не могу понять, гдеНедовольство, огорчение

Хочется, чтобы мой index.php так и назывался, а index.php из архива переименовать в captcha.php, например.

Думаю, проще будет кому-то скачать по ссылке этот архив и глянуть, если не в падлу Растерялся Наверняка все проще простого, просто я пока даже в простых вещах теряюсь Закатив глазки
6. snikers987 - 27 Января, 2012 - 13:27:21 - перейти к сообщению
PHP:
скопировать код в буфер обмена
  1.  
  2. <? session_start(); ?>
  3. <td><label for="email">Введите код</label></td>
  4.  <td><p><img src="./index_php_фаил_из_архива.php?<?PHP echo session_name() ?>=<?PHP echo session_id() ?>"></p>
  5. <p><input type="text" id="keystring" name="keystring" /></p></td>
  6. </tr>
  7.  


и не надо index_php_фаил_из_архива.php инклудить
7. Hawkmoth - 27 Января, 2012 - 13:30:42 - перейти к сообщению
Всё, разобрался. На всякий случай напишу, если кто-то такой же недалёкий, как я, попадется.

Файл index.php из архива можно смело переименовывать, например, в captcha.php, а в файл, генерирующий форму (в моем случае - index.php), нужно добавить строчку

CODE (htmlphp):
скопировать код в буфер обмена
  1. <img src="captcha.php?<?php echo session_name()?>=<?php echo session_id()?>

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


Полагаю, так будет правильно.

Всем спасибо за помощь.
(Добавление)
snikers987, спасибо отдельное! Я разобрался чуть пораньше, чем увидел твой ответ, но зато проверил себя Улыбка
(Добавление)
Теперь проблема с обработчиком.
В submit.php у меня лежит такой код:
PHP:
скопировать код в буфер обмена
  1. if(isset($_SESSION['captcha_keystring']) && $_SESSION['captcha_keystring'] === $_POST['keystring']){
  2.                 echo "Correct";
  3.         }else{
  4.                 echo "Wrong";
  5.         }
,

который выдаёт "Wrong" на любой введенный ответ.
В примере, где форма и обработчик находятся в одном файле, все в порядке.
Я так понимаю, что проблема в переменной $_SESSION, значение которой теряется при переходе от формы к обработчику.
Или я неправ?
8. Zuldek - 27 Января, 2012 - 14:38:08 - перейти к сообщению
session_start() пропишите в первой строке кода обработчика. Если прописано, приведите его полный код.
9. Hawkmoth - 27 Января, 2012 - 15:00:18 - перейти к сообщению
Zuldek пишет:
session_start() пропишите в первой строке кода обработчик


Спасибо большое! Именно этого и нехватало Улыбка

Теперь мой код обработчика формы выглядит так:
PHP:
скопировать код в буфер обмена
  1. <?PHP
  2.  
  3. header("Content-Type: text/html; charset=utf-8");
  4.  
  5. if(!isset($_SESSION['captcha_keystring'])|| $_SESSION['captcha_keystring'] !== $_POST['keystring']){
  6. die(msg(0,"Неправильно введен текст с картинки"));
  7.  
  8. unset($_SESSION['captcha_keystring']);}


Ну, и дальше там всякие действия в случае успешного исхода.

А может, кто-нибудь подскажет, как в случае неправильного набора капчи обновить картинку, не обновляя при этом всю страницу? Ну, чтобы пользовательские данные из других полей формы не терялись Улыбка

Заранее спасибо Закатив глазки
10. Hawkmoth - 28 Января, 2012 - 23:53:20 - перейти к сообщению
Только через JS можно? Стандартными средствами php, я так понимаю, этого не сделать. Но как бы так с наименьшей кровью сделать такое обновление (капчи без перезагрузки)? Натолкните на мысль плиз. Учитывая, что я хочу использовать именно вышеописанную капчу.
11. Hawkmoth - 29 Января, 2012 - 11:33:28 - перейти к сообщению
В общем, методом тыка разобрался сам. Чтобы капча обновлялась при щелчке на кнопке "Обновить", к файлу index.php прикручиваем функцию
PHP:
скопировать код в буфер обмена
  1. <script type="text/javascript">
  2. function reload(){
  3. id=Math.floor(Math.random()*1000000);
  4. document.getElementById('captcha').src = "captcha.php?rand="+id;
  5. }
  6. </script>


В том месте, где у нас находится капча, пишем
PHP:
скопировать код в буфер обмена
  1. <td><p><img src="captcha.php?<?PHP echo session_name()?>=<?PHP echo session_id()?>" id="captcha" />     <a href="javascript:void(0)" onclick="reload()">Обновить</a>
12. Hawkmoth - 29 Января, 2012 - 13:42:17 - перейти к сообщению
Идём дальше. Следующий вопрос.

Как при неправильном вводе капчи автоматически ее обновить, не перезагружая при этом всю страницу? Т.е., чтобы файл-обработчик, вернув "false" при проверке на правильность капчи, автоматически загружал новую картинку?

Файл генерации формы и файл-обработчик, напомню, разные файлы.

В общем вопрос сводится к следующему - можно ли из файла 1.php вызвать js-функцию function(), которая определена в файле 2.php, чтобы она произвела некоторые действия в 2.php? В нашем случае - обновила картинку.

Я пока еще чайник, заранее спасибоУлыбка
13. usernamer - 14 Марта, 2013 - 23:31:02 - перейти к сообщению
Ребят всем СПАСИБО! Вы молодцы!!!! Подмигивание Подмигивание Подмигивание
(Добавление)
<?PHP


header("Content-Type: text/html; charset=utf-8");

if(!isset($_SESSION['captcha_keystring'])|| $_SESSION['captcha_keystring'] !== $_POST['keystring']){
die (msg(0,"Неправильно введен текст с картинки"));

unset($_SESSION['captcha_keystring']);}
?>


Почему ругается? Нахмурился

Fatal error: Call to undefined function msg() in /home/u126578750/public_html/reg ister.tpl on line 53
53 линия это die (msg(0,"Неправильно введен текст с картинки"));
14. DeepVarvar - 15 Марта, 2013 - 04:00:21 - перейти к сообщению
google translate => Call to undefined function msg

?
15. usernamer - 15 Марта, 2013 - 05:03:32 - перейти к сообщению
DeepVarvar пишет:
google translate => Call to undefined function msg

?

Ну а как исправить)?

 

Powered by ExBB FM 1.0 RC1