За последние 24 часа нас посетили 17469 программистов и 1611 роботов. Сейчас ищут 946 программистов ...

Уже устал искать проблему капчи!

Тема в разделе "PHP для новичков", создана пользователем Romik_Maden, 3 фев 2010.

  1. Romik_Maden

    Romik_Maden Активный пользователь

    С нами с:
    31 янв 2010
    Сообщения:
    25
    Симпатии:
    0
    Адрес:
    Украина, Львов
    Короче скрипт такой:

    Скрипт ввода данных и проверочного кода.

    PHP:
    1.  
    2. <?php
    3. $tim=date("d.m H:i");
    4. $site_title="Гостевая: RU-версия $tim";
    5. $root = $_SERVER['DOCUMENT_ROOT'];
    6. include ("$root/ru/header.tpl");
    7. ?>
    8.       <p>
    9.           <form action=verification.php method=post>
    10.                  <input type=hidden name=action value=post>
    11.                  Имя:<font color=red><sup>*</sup><font><br/>
    12.                    <input type=text name=name maxlength=32 value='<? echo $name; ?>'><br/>
    13.                  Город:<br/>
    14.                     <input type=text name=city maxlength=32 value='<? echo $city; ?>'><br/>
    15.                  E-Mail:<br/>
    16.                     <input type=text name=email maxlength=32 value='<? echo $email; ?>'><br/>
    17.                  URL:<br/>
    18.                     <input type=text name=url maxlength=36 value='<? echo $url; ?>'><br/>
    19.                  Сообщение:<font color=red><sup>*</sup></font><br/>
    20.                     <input type=text name=msg maxlength=36 value='<? echo $msg; ?>'><br/>
    21.                 <!--kcaptcha-->
    22.                 Введите код с картинки:<br/>
    23.                 <img src="/captcha/captcha.php?<?php echo session_name()?>=<?php echo session_id()?>"><br/>
    24.                 <input type="text" name="keystring"><br/>
    25.                 <!--////kcaptcha-->
    26.                 <input type=submit name="submit" value='Добавить'>
    27.                 <input type="reset" value="Очистить форму"><br/>
    28.           </form>
    29.           <small><font color=red><sup>*</sup></font> - поля, обязательные для заполнения </small>
    30.       </p>
    31. <?php
    32. include ("$root/ru/baners.tpl");
    33. include ("$root/ru/footer.tpl");
    34. ?>
    35.  
    Скрипт проверки капчи и обработки введенных данных:

    PHP:
    1.  
    2. <?php
    3. if(count($_POST)>0)
    4.     {
    5.         if(isset($_SESSION['captcha_keystring']) && $_SESSION['captcha_keystring'] ==  $_POST['keystring'])
    6.         {
    7.  
    8.             if ($_POST['name'] == "")
    9.              {
    10.                  header("Location: [url=http://]http://[/url]".$_SERVER['HTTP_HOST'].dirname($_SERVER['PHP_SELF'])."/".$relative_url);
    11.                  die("");
    12.              }
    13.  
    14.              if ( $_POST['email'] == "" ){
    15.                  $redir_404;
    16.                  die("");
    17.              }
    18.  
    19.              if ( $_POST['msg'] == "" ){
    20.                  header("Location: [url=http://]http://[/url]".$_SERVER['HTTP_HOST'].dirname($_SERVER['PHP_SELF'])."/".$relative_url);
    21.                  die("");
    22.              }
    23.  
    24.             if (IsSet($_REQUEST['submit']) & !empty($_REQUEST['submit']))
    25.             {
    26.                  $name=$_POST['name'];
    27.                  $city=$_POST['city'];
    28.                  $email=$_POST['email'];
    29.                  $homepage=$_POST['url'];
    30.                  $msg=$_POST['msg'];
    31.  
    32.                  $name=htmlspecialchars($name);
    33.                  if(strlen($name) >= 30 )
    34.                  {
    35.                      $name=substr($name,0,30);
    36.                  }  
    37.                  $email=trim($email);  
    38.                  if(strlen($email) >= 30 )
    39.                  {
    40.                      $email=substr($email,0,30);
    41.                  }
    42.                  $preg_match=preg_match ('/^[A-Z0-9]+@[A-Z0-9]+\.[A-Z]{2,6}$/i',$email);
    43.                  if(strlen($msg) >= 100 )
    44.                  {
    45.                      $email=substr($msg,0,100);
    46.                  }
    47.                  $msg=htmlspecialchars($msg);
    48.              }  
    49.              if ($preg_match  == "1")
    50.              {
    51.                 $file = fopen("$root/gb/records/rec.".time(),"w");
    52.                            fputs($file,$name."\n");
    53.                            fputs($file,$city."\n");
    54.                            fputs($file,$email."\n");
    55.                            fputs($file,$url."\n");
    56.                            fputs($file,$msg."\n");
    57.                            fputs($file,$time."\n");
    58.                         fclose($file);
    59.              }
    60.         }  
    61.         else
    62.          {
    63.              echo "<center><h3>Вы неверно ввели код подтверждения!</h3></center>";
    64.              echo "<center><h3><a href=\"addrec.php\">Повторите ввод</a></h3></center>";
    65.          }
    66.      }
    67.  
    68.  unset($_SESSION['captcha_keystring']);
    69.  ?>
    70.  
    А вот проблема в том что даже при верном вводе проверочного кода крипт возвращает "Вы неверно ввели код подтверждения!"
    Непонятно. Уже наверно все темы с капчами тут перечитал и гуглил, нигде ответа не нашол. Встречал правда подобные случаи но без решений проблемы. :?
     
  2. Simpliest

    Simpliest Активный пользователь

    С нами с:
    24 сен 2009
    Сообщения:
    4.511
    Симпатии:
    2
    Адрес:
    Донецк
    И собственно еще сам скрипт капчи.

    Проблема в каком-то из этих 3х мест.

    Для начала проверь отдельные части условия if (просто сделай var_dump для них перед самим if)
     
  3. Romik_Maden

    Romik_Maden Активный пользователь

    С нами с:
    31 янв 2010
    Сообщения:
    25
    Симпатии:
    0
    Адрес:
    Украина, Львов
    Сам капч
    PHP:
    1.  
    2. <?php
    3.  
    4. define('ROOT_PATH', './');
    5.  
    6. // Конфигурация
    7. $cfg['captcha_len'] = 4;
    8. $cfg['captcha_shift'] = true;
    9. $cfg['captcha_turn'] = true;
    10. $cfg['captcha_chess'] = true;
    11.  
    12. header('Pragma: no-cache');
    13.  
    14. $symbols = array(/*0,*/ 1, 2, 3, 4, 5, 6, 7, 8, 9);  //, 'A', 'a', 'B', 'b', 'C', 'c', 'D', 'd', 'E', 'e', 'F', 'f', 'G', 'g', 'H', 'h', 'I', 'i', 'J', 'j', 'K', 'k', 'L', 'l', 'M', 'm', 'N', 'n', /*'O', 'o',*/ 'P', 'p', 'Q', 'q', 'R', 'r', 'S', 's', 'T', 't', 'U', 'u', 'V', 'v', 'W', 'w', 'X', 'x', 'Y', 'y', 'Z', 'z'
    15.  
    16. $i = 0;
    17. $captcha = NULL;
    18. $symbols_num = count($symbols) - 1;
    19. while($i < $cfg['captcha_len'])
    20. {
    21.     $captcha = $captcha.$symbols[rand(0, $symbols_num)];
    22.     $i++;
    23. }
    24.  
    25. $width = $cfg['captcha_len'] * 20 + 20; // Ширина
    26. $height = 50; // Высота
    27.  
    28. $image = imagecreatetruecolor($width, $height);
    29. $background  = imagecolorallocate($image, rand(230, 255), rand(230, 255), rand(230, 255));
    30. imagefill($image, 0, 0, $background);
    31.  
    32. // Шахматная доска
    33. if($cfg['captcha_chess'])
    34. {
    35.     $q = 0;
    36.     $cube_side = rand(8, 12);
    37.     while($q <= $height / $cube_side)
    38.     {
    39.         $i = 0;
    40.         while($i <= $width)
    41.         {
    42.             if(fmod($q, 2))
    43.             {
    44.                 $cube_side = rand(8, 12); // Размер стороны квадратика
    45.                 $color = imagecolorallocate($image, rand(150, 255), rand(150, 255), rand(150, 255));
    46.                 imagefilledrectangle($image, $i*2+$cube_side, $q*$cube_side, $i*2+$cube_side*2, $q*$cube_side+$cube_side, $color);
    47.             }
    48.             else
    49.             {
    50.                 $cube_side = rand(8, 12);
    51.                 $color = imagecolorallocate($image, rand(150, 255), rand(150, 255), rand(150, 255));
    52.                 imagefilledrectangle($image, $i*2, $q*$cube_side, $i*2+$cube_side, $q*$cube_side+$cube_side, $color);
    53.             }
    54.  
    55.             $i += $cube_side;
    56.         }
    57.  
    58.         $q++;
    59.     }
    60. }
    61.  
    62. // Шрифты
    63. $fonts_list = scandir(ROOT_PATH.'fonts'); unset($fonts_list[0], $fonts_list[1]);
    64. $fonts_num = count($fonts_list);
    65.  
    66. // Строка
    67. $i = 10;
    68. $captcha = str_split($captcha);
    69. foreach($captcha as $value)
    70. {
    71.     $color = imagecolorallocate($image, rand(50, 150), rand(50, 150), rand(50, 150));
    72.     imagettftext($image, 25, ($cfg['captcha_turn'])? rand(-30, 30) : 0, $i, ($cfg['captcha_shift'])? rand(25, 45) : 35, $color, ROOT_PATH.'fonts/'.$fonts_list[rand(2, $fonts_num+1)], $value);
    73.     $i += rand(15, 25);
    74. }
    75.  
    76. // Рамка
    77. $black = imagecolorallocate($image, 0, 0, 0);
    78. imageline($image, 0, 0, 0, $height, $black); // left
    79. imageline($image, $width - 1, 0, $width - 1, $height, $black); // right
    80. imageline($image, $width, 0, 0, 0, $black); // up
    81. imageline($image, $width, $height - 1, 0, $height - 1, $black); // down
    82.  
    83. // Вывод изображения
    84. header('content-type: image/png');
    85. imagepng($image);
    86.  
    87. imagedestroy($image);
    88.  
    89. ?>
    90.  
    Гдето на етом форуме нашол кстати.

    var_dump возвращает

    Notice: Undefined index: captcha_keystring in C:\Program Files\Apache Group\Apache2\htdocs\ru\gb\verification.php on line 4
    NULL string(4) "5185"

    Походу проблема в капче, но почему? Картинку генерирует. У других работает нормально.

    Подобное как тут: http://www.php.ru/forum/viewtopic.php?t=14866&highlight=%EA%E0%EF%F7%E0
     
  4. Simpliest

    Simpliest Активный пользователь

    С нами с:
    24 сен 2009
    Сообщения:
    4.511
    Симпатии:
    2
    Адрес:
    Донецк
    Не пость простыни кода с вопросом. За редким исключением, их никто не читает.

    Зато начинают копипастить с ошибками.

    Сессию у тебя капча не устанавливает.
     
  5. Romik_Maden

    Romik_Maden Активный пользователь

    С нами с:
    31 янв 2010
    Сообщения:
    25
    Симпатии:
    0
    Адрес:
    Украина, Львов
    Что еще надо? Как поправить а то я уже устал.
     
  6. Kreker

    Kreker Старожил

    С нами с:
    8 апр 2007
    Сообщения:
    5.433
    Симпатии:
    0
    В начало файла каптчи session_start();

    В 23 строку: $_SESSION['captcha_keystring'] = $captcha ;
     
  7. Romik_Maden

    Romik_Maden Активный пользователь

    С нами с:
    31 янв 2010
    Сообщения:
    25
    Симпатии:
    0
    Адрес:
    Украина, Львов
    Kreker

    спасибо но чуть по другому сделал