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

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Как прикрутить капчу (проект KCAPTCHA) к форме

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


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

> Описание: Никак не могу разобраться
Hawkmoth
Отправлено: 26 Января, 2012 - 23:21:48
Post Id


Посетитель


Покинул форум
Сообщений всего: 329
Дата рег-ции: Янв. 2012  


Помог: 6 раз(а)




Думал, чего уж проще - всё сделали за меня, осталось только в корневик положить. Не тут-то было. Скрипт капчи качал с этого сайта:
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_из_архива");

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

Если кто-то понял мои объяснения, прошу помочь Улыбка
 
 Top
Bio man
Отправлено: 26 Января, 2012 - 23:32:24
Post Id


Постоянный участник


Покинул форум
Сообщений всего: 2751
Дата рег-ции: Июль 2010  
Откуда: Даугавпилс, Латвия


Помог: 52 раз(а)




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)?>">
 
 Top
Hawkmoth
Отправлено: 27 Января, 2012 - 00:00:27
Post Id


Посетитель


Покинул форум
Сообщений всего: 329
Дата рег-ции: Янв. 2012  


Помог: 6 раз(а)




В архиве лежал файл 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.
Но ничего не работает.
Кто скажет, где я дурак?
 
 Top
Dezmont
Отправлено: 27 Января, 2012 - 08:03:10
Post Id



Частый гость


Покинул форум
Сообщений всего: 245
Дата рег-ции: Июль 2010  


Помог: 1 раз(а)




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) Проверка капчи на правильность.

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


Посетитель


Покинул форум
Сообщений всего: 329
Дата рег-ции: Янв. 2012  


Помог: 6 раз(а)




Да, спасибо, это я понимаю.
В принципе, загвоздка только вот в чем: если я переименовываю лежащий в архиве файл index.php, капча перестает работать.

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

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

Думаю, проще будет кому-то скачать по ссылке этот архив и глянуть, если не в падлу Растерялся Наверняка все проще простого, просто я пока даже в простых вещах теряюсь Закатив глазки
 
 Top
snikers987
Отправлено: 27 Января, 2012 - 13:27:21
Post Id



Участник


Покинул форум
Сообщений всего: 1239
Дата рег-ции: Сент. 2011  
Откуда: Крым


Помог: 25 раз(а)




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 инклудить

(Отредактировано автором: 27 Января, 2012 - 13:28:40)



-----
Когда всматриваешься в тёмную бездну, учти, что кто-то может смотреть на тебя из неё...
 
My status
 Top
Hawkmoth
Отправлено: 27 Января, 2012 - 13:30:42
Post Id


Посетитель


Покинул форум
Сообщений всего: 329
Дата рег-ции: Янв. 2012  


Помог: 6 раз(а)




Всё, разобрался. На всякий случай напишу, если кто-то такой же недалёкий, как я, попадется.

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

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

Ну, и я еще добавил в самое начало


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

Всем спасибо за помощь.
(Добавление)
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, значение которой теряется при переходе от формы к обработчику.
Или я неправ?
 
 Top
Zuldek
Отправлено: 27 Января, 2012 - 14:38:08
Post Id


Постоянный участник


Покинул форум
Сообщений всего: 2122
Дата рег-ции: Июнь 2010  


Помог: 50 раз(а)




session_start() пропишите в первой строке кода обработчика. Если прописано, приведите его полный код.
 
 Top
Hawkmoth
Отправлено: 27 Января, 2012 - 15:00:18
Post Id


Посетитель


Покинул форум
Сообщений всего: 329
Дата рег-ции: Янв. 2012  


Помог: 6 раз(а)




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']);}


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

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

Заранее спасибо Закатив глазки

(Отредактировано автором: 27 Января, 2012 - 15:00:39)

 
 Top
Hawkmoth
Отправлено: 28 Января, 2012 - 23:53:20
Post Id


Посетитель


Покинул форум
Сообщений всего: 329
Дата рег-ции: Янв. 2012  


Помог: 6 раз(а)




Только через JS можно? Стандартными средствами php, я так понимаю, этого не сделать. Но как бы так с наименьшей кровью сделать такое обновление (капчи без перезагрузки)? Натолкните на мысль плиз. Учитывая, что я хочу использовать именно вышеописанную капчу.

(Отредактировано автором: 28 Января, 2012 - 23:54:12)

 
 Top
Hawkmoth
Отправлено: 29 Января, 2012 - 11:33:28
Post Id


Посетитель


Покинул форум
Сообщений всего: 329
Дата рег-ции: Янв. 2012  


Помог: 6 раз(а)




В общем, методом тыка разобрался сам. Чтобы капча обновлялась при щелчке на кнопке "Обновить", к файлу 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>
 
 Top
Hawkmoth
Отправлено: 29 Января, 2012 - 13:42:17
Post Id


Посетитель


Покинул форум
Сообщений всего: 329
Дата рег-ции: Янв. 2012  


Помог: 6 раз(а)




Идём дальше. Следующий вопрос.

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

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

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

Я пока еще чайник, заранее спасибоУлыбка

(Отредактировано автором: 29 Января, 2012 - 13:43:50)

 
 Top
usernamer
Отправлено: 14 Марта, 2013 - 23:31:02
Post Id


Новичок


Покинул форум
Сообщений всего: 4
Дата рег-ции: Март 2013  


Помог: 0 раз(а)

[+]


Ребят всем СПАСИБО! Вы молодцы!!!! Подмигивание Подмигивание Подмигивание
(Добавление)
<?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,"Неправильно введен текст с картинки"));
 
 Top
DeepVarvar Супермодератор
Отправлено: 15 Марта, 2013 - 04:00:21
Post Id



Активный участник


Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


Помог: 353 раз(а)




google translate => Call to undefined function msg

?
 
 Top
usernamer
Отправлено: 15 Марта, 2013 - 05:03:32
Post Id


Новичок


Покинул форум
Сообщений всего: 4
Дата рег-ции: Март 2013  


Помог: 0 раз(а)

[+]


DeepVarvar пишет:
google translate => Call to undefined function msg

?

Ну а как исправить)?
 
 Top
Страниц (2): [1] 2 »
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Вопросы новичков »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB