Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Как встроить капчу
 
 автор: Хулиган   (06.02.2008 в 14:05)   письмо автору
 
 

Взял тут капчу: http://captcha.ru/kcaptcha.zip
Тестовый пример в зипе выводит картинку, правда почему-то не выводятся input и submit...
Пытался встроить этот скрипт в свою реальную страницу - безуспешно
Делал так:
<?   session_start();  ?>
<html>
  <head>
  <!-- тут html страницы -->
    <tr class='controw' id='rrrrr'>
      <td><b>Капча:</b></td>
      <td>
        <form action="" method="post">
          <img src="autoadd.php?<?php echo session_name()?>=<?php echo session_id()?>">
          <input type="text" name="keystring"></p>
          <input type="submit" value="Check"></p>
        </form>
<?php
    
if(count($_POST)>0){
      if(isset(
$_SESSION['captcha_keystring']) && $_SESSION['captcha_keystring'] ==  $_POST['keystring']){
        echo 
"Correct";
      }
      else{
        echo 
"Wrong";
      }
    }
    unset(
$_SESSION['captcha_keystring']);
?>
<?
    
include('kcaptcha.php');
    if(isset(
$_REQUEST[session_name()])){
      
/*session_start();*/
    
}
    
$captcha = new KCAPTCHA();
    if(
$_REQUEST[session_name()]){
      
$_SESSION['captcha_keystring'] = $captcha->getKeyString();
    }
?>
      </td>
    </tr>

В общем, никакой картинки не выводит, только варнинг:
Warning: Cannot modify header information - headers already sent by (output started at z:\home\site.ru\www\autoadd.php:114) in z:\home\site.ru\www\kcaptcha.php on line 202
После варнинга идут бинарные данные, как я понял - это бинарник картинки.

Пробовал закомментировать строку, на которую ругается (там стоит header("Content-Type: image/jpeg");) - варнинг исчез, но по-прежнему картинки нет, только hex-код картинки.
Что делать?

   
 
 автор: Хулиган   (06.02.2008 в 14:57)   письмо автору
 
   для: Хулиган   (06.02.2008 в 14:05)
 

С картинкой разобрался: генератор картинки поместил в отдельный файл а для <img> сделал src = имя этого файла.
Ещё вопрос: когда я делаю сабмит формы и перехожу на страницу, указаную в её action, то для получения переменной $_SESSION['captcha_keystring'] мне приходится опять открывать сессию (session_start();), иначе пишет, что переменная не установлена.
Это действительно необходимо каждый раз открывать сессию, или я что-то не так делаю?

   
 
 автор: Thrasher   (06.02.2008 в 15:00)   письмо автору
 
   для: Хулиган   (06.02.2008 в 14:57)
 

>Это действительно необходимо каждый раз открывать сессию?
да

   
 
 автор: Хулиган   (06.02.2008 в 18:38)   письмо автору
 
   для: Thrasher   (06.02.2008 в 15:00)
 

Спасибо.

   
 
 автор: Хулиган   (06.02.2008 в 23:14)   письмо автору
 
   для: Хулиган   (06.02.2008 в 14:05)
 

Что-то проблемы с этой капчей продолжаются :(

read_msg.php:

<a href="add_msg.php">Добавить сообщение</a>


add_msg.php:
<? 
    $addmessage 
"";
    
session_start();
    if(
count($_POST)>0){
        
$addmessage $_POST['message']
        if(isset(
$_SESSION['captcha_keystring']) && $_SESSION['captcha_keystring'] ==  $_POST['keystring']){
            unset(
$_SESSION['captcha_keystring']);
            
/* -- add new message -- */
            
if ( $result == "1" ) {    //added successfully
                
Header("Location: /read_msg.php");
                exit;
            }
        }
        else {
            
/* -- wrong captcha --*/
            
unset($_SESSION['captcha_keystring']);
            echo 
"Wrong";
        }
    }
?>

<? session_start(); ?>

<form name="addform" action="add_msg.php" method="post">
    <input type='text' name='message' value=<? print $addmessage?>>
    <img src="kk.php?<?php echo session_name()?>=<?php echo session_id()?>">
    <input type='text' name='keystring'>
    <input type='submit' value='Отправить'>
</form>


Алго такой: со страницы read_msg.php перехожу на страницу добавления сообщений add_msg.php.
Набираю текст, ввожу код с картинки и делаю сабмит. Если все правильно, сообщение добавляется в БД и далее перехожу на read_msg.php, где уже видно новое сообщение.
Если капча была набрана неверно, то add_msg.php перезагружается с новой картинкой.

В общем, 2 проблемы:
1. После добавления сообщения и возврата на read_msg.php если я пытаюсь добавить ещё одно объявление, то при переходе на add_msg.php у меня выводится картинка от предыдущего кода.
Почему - непонятно. При том, что $_SESSION['captcha_keystring'] сгенерирована заново. Естественно я ввожу число считаное с картинки(старое) и оно не совпадает с $_SESSION['captcha_keystring'] и при сабмите происходит ошибка.
После этого страница перезагружается с новой картинкой и с новым $_SESSION['captcha_keystring'] и после этого добавление происходит успешно.
Почему так?

2. При неправильном вводе капчи страница перезагружается с новой картинкой, как и положено, но при этом выскакивает предупреждение:
Notice: A session had already been started - ignoring session_start() in z:\home\site.ru\www\add_msg.php on line 31.
Пробовал заглушить вывод этого сообщение через error_reporting (E_ALL ^ E_NOTICE); - не помогает.
Что с этим можно придумать? Может есть способ определить, что сессия уже стартовала и пропустить повторный старт?

   
 
 автор: spider-x   (07.02.2008 в 00:35)   письмо автору
 
   для: Хулиган   (06.02.2008 в 23:14)
 

1. Так происходит тк видимо не передаётся хеадер о не кешировании изображения...
2. Насчёт 2 хз... :)
но меня смущает что в add_msg.php указано 2 функции session_start();

ждёмс ответов... решил ща вот себе тож прикрутить капчу... :) ещё не пробовал...

   
 
 автор: Freddie_X   (07.02.2008 в 01:33)   письмо автору
 
   для: spider-x   (07.02.2008 в 00:35)
 

Я сделал так, что к имени файла, генерящего картинку прикручиваю рандомное число.
Из-за этого она каждый раз генерируется по новой, а не из кеша.

   
 
 автор: Хулиган   (07.02.2008 в 13:49)   письмо автору
 
   для: spider-x   (07.02.2008 в 00:35)
 

Картинка не может быть из кэша: у неё рандомный адрес (session_id).
В общем обе проблемы решены одним if: вместо второго session_start() делаю
if( !isset($_REQUEST[session_name()]) ) session_start();
чтобы предотвратить повторную генерацию кода session_id, если сессия ещё продолжается.

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования