[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Снова про каптчу
pradiz
Доброго времени суток всем.
И снова вопрос про каптчу... В поиске не нашел ответа.
С PHP дела никогда не имел. Сейчас потребовалось в форму обратной связи воткнуть простенькую математическую каптчу. Суть проблемы: подставил каптчу в код страницы формы обратной связи. Он выглядит сейчас так:

<?php
session_start ();
?>
<form action=mail.php method=post>
Ваше имя<br><input type=text name=name size=30><p>
Ваш e-mail<br><input type=text name=email size=30><p>
Ваше сообщение<br><textarea name=mess rows=10 cols=50></textarea><p>
<input type=submit value=Отправить>
<img src="http://www.joom1.ru/captcha/captcha.php" />
<input type="text" name="CAPTCHA" />
</form>
<?php
if( $_SESSION['CAPTCHA'] != strip_tags($_POST['CAPTCHA']) ) {
echo 'Вы ввели неправильный код подтверждения!';
} else {
}
?>

Сама каптча такая:

<?php
session_start();

header('content-type: image/png');

$numbers = array();
$numbers[] = rand(1, 9);
$numbers[] = rand(1, 9);

if(rand(0, 1) == 0) {
$_op = '+';
$code = strval($numbers[0]) .' + ' .strval($numbers[1]) .' =';
$_SESSION['CAPTCHA'] = $numbers[0] + $numbers[1];
} else {
$_op = '*';
$code = strval($numbers[0]) .' x ' .strval($numbers[1]) .' =';
$_SESSION['CAPTCHA'] = $numbers[0] * $numbers[1];
}
session_write_close();

$font = dirname(__FILE__) .'/fonts/arial.ttf';

$width = 16;
$height = 24;

$code_length = 7;

$image_height = $height + 2;
$image_width = $width * $code_length + 20;

$im = imagecreatetruecolor($image_width, $image_height);
$white = imagecolorallocate($im, 255, 255, 255);
imagefill($im, 0, 0, $white);

$theme = array();
$theme[] = array('CHAR_COLOR' =>
array('R' => array(150, 201),
'G' => array(250, 252),
'B' => array(0, 126)
),
'BG_COLOR' =>
array('R' => array(150, 230),
'G' => array(150, 230),
'B' => array(150, 230)
)
);
$theme[] = array('CHAR_COLOR' =>
array('R' => array(23, 172),
'G' => array(235, 255),
'B' => array(1, 163)
),
'BG_COLOR' =>
array('R' => array(230, 255),
'G' => array(170, 230),
'B' => array(170, 230)
)
);
$theme[] = array('CHAR_COLOR' =>
array('R' => array(0, 125),
'G' => array(138, 250),
'B' => array(58, 178)
),
'BG_COLOR' =>
array('R' => array(194, 230),
'G' => array(197, 230),
'B' => array(230, 255)
)
);

$pos_x = 5;
$pos_y = 20;
$random = rand(0, (count($theme) - 1) );/* Get a random theme */

$angle = 0;
$size = 16;
for($i = 0, $count = strlen($code); $i < $count; $i++) {

$color = imagecolorallocate($im,
rand($theme[$random]['CHAR_COLOR']['R'][0], $theme[$random]['CHAR_COLOR']['R'][1]),
rand($theme[$random]['CHAR_COLOR']['G'][0], $theme[$random]['CHAR_COLOR']['G'][1]),
rand($theme[$random]['CHAR_COLOR']['B'][0], $theme[$random]['CHAR_COLOR']['B'][1])
);

imagettftext($im, $size, $angle, $pos_x, $pos_y, $color, $font, $code{$i});
$pos_x += $width + 1;

}

imagepng($im);
imagedestroy($im);
?>

При работе с формой mail.php работает как и должен: отслеживает заполнение формы, оправляет мыло и т.д. А вот каптча не работает. То есть мессаги уходят независимо от того введено ли что-нибудь в поле каптчи или нет. Голова уже закипела от непоняток. Подскажите пожалуйста младшему начинающему, что не так в коде, что каптча не участвует в отправке мессаг?

На всякий случай код mail.php выглядит так:

<?php
$xxx =$_POST["xxx"];
$name=$_POST["name"];
$email=$_POST["email"];
$mess=$_POST["mess"];
if (isset ($name))
{
$name = substr($name,0,20);
if (empty($name))
{
echo "<center><b>Не указано имя.<p>";
echo "<a href=kontakt.php>Вернуться и правильно заполнить форму.</a>";
exit;
}
}
else
{
$name = "не указано";
}
if (isset ($email))
{
$email = substr($email,0,20);
if (empty($email))
{
echo "<center><b>Не указан e-mail.<p>";
echo "<a href=kontakt.php>Вернуться и правильно заполнить форму.</a>";
exit;
}
}
else
{
$email = "не указано";
}
if (isset ($mess))
{
$mess = substr($mess,0,1000);
if (empty($mess))
{
echo "<center><b>Нет текста сообщения.<p>";
echo "<a href=kontakt.php>Вернуться и правильно заполнить форму.</a>";
exit;
}
}
else
{
$mess = "не указано";
}
$i = "не указано";
if ($name == $i AND $email == $i AND $mess == $i)
{
echo "Ошибка ! Скрипту не были переданы параметры !";
exit;
}
$to = "admin@joom1.ru";
$headers = "content-type: text/plain";
$subject = "вопрос от посетителя сайта";
$message = "Имя:$name::::::::::Электронный адрес:$email::::::::::Сообщение:$mess:::::::::IP-адрес:$REMOTE_ADDR";
mail ($to,$subject,$message) or print "Не могу отправить письмо.";
echo "<center>Ваше сообщение отправлено. Мы обязательно с Вами свяжемся!<br><a href='index.html'>Вернуться на главную.";
exit;
?>

Заранее благодарю за помощь.



Спустя 18 минут, 28 секунд (8.04.2009 - 17:11) Kuliev написал(а):
pradiz
А где вы здесь проверяете КАПТЧУ??? Я лично ненашел ни слов проние!!!
PHP
<?php
$xxx 
=$_POST["xxx"];
$name=$_POST["name"];
$email=$_POST["email"];
$mess=$_POST["mess"]; 
if (isset (
$name))
{
$name substr($name,0,20);
if (empty(
$name))
{
echo 
"<center><b>Не указано имя.<p>";
echo 
"<a href=kontakt.php>Вернуться и правильно заполнить форму.</a>";
exit;
}
}
else 
{
$name "не указано";
}
if (isset (
$email))
{
$email substr($email,0,20);
if (empty(
$email))
{
echo 
"<center><b>Не указан e-mail.<p>";
echo 
"<a href=kontakt.php>Вернуться и правильно заполнить форму.</a>";
exit;
}
}
else 
{
$email "не указано";
}
if (isset (
$mess))
{
$mess substr($mess,0,1000);
if (empty(
$mess))
{
echo 
"<center><b>Нет текста сообщения.<p>";
echo 
"<a href=kontakt.php>Вернуться и правильно заполнить форму.</a>";
exit;
}
}
else 
{
$mess "не указано";
}
$i "не указано";
if (
$name == $i AND $email == $i AND $mess == $i)
{
echo 
"Ошибка ! Скрипту не были переданы параметры !";
exit;
}
$to "admin@joom1.ru";
$headers "content-type: text/plain";
$subject "вопрос от посетителя сайта";
$message "Имя:$name::::::::::Электронный адрес:$email::::::::::Сообщение:$mess:::::::::IP-адрес:$REMOTE_ADDR";
mail ($to,$subject,$message) or print "Не могу отправить письмо.";
echo 
"<center>Ваше сообщение отправлено. Мы обязательно с Вами свяжемся!<br><a href='index.html'>Вернуться на главную.";
exit;

Смотри внимательней!!!

Спустя 1 час, 8 минут, 49 секунд (8.04.2009 - 18:20) pradiz написал(а):
Цитата (Kuliev @ 8.04.2009 - 14:11)
Смотри внимательней!!!


Извиняюсь дико! Уже действительно шары за гайки зашли.
На самом деле в mail.php добавляю такой код:

PHP
if($_SESSION['CAPTCHA'] != $_POST['CAPTCHA']) {
            echo 
'Вы ввели неправильный код подтверждения!';
        
        } else {
            }


То есть в коде имею следующее:

PHP
...............

echo 
"<a href=kontakt.php>Вернуться и правильно заполнить форму.</a>";
exit;
}
}
else 
{
$mess "не указано";
}
$i "не указано";
if (
$name == $i AND $email == $i AND $mess == $i)
{
echo 
"Ошибка ! Скрипту не были переданы параметры !";
exit;
}
if(
$_SESSION['CAPTCHA'] != $_POST['CAPTCHA']) {
            echo 
'Вы ввели неправильный код подтверждения!';
        } else {
        }
$to "admin@joom1.ru";
$headers "content-type: text/plain";
$subject "вопрос от посетителя сайта";
$message "Имя:$name::::::::::Электронный адрес:$email::::::::::Сообщение:$mess:::::::::IP-адрес:$REMOTE_ADDR";
mail ($to,$subject,$message) or print "Не могу отправить письмо.";
echo 
"<center>Ваше сообщение отправлено. Мы обязательно с Вами свяжемся!<br><a href='index.html'>Вернуться на главную.";
exit;


После такой проверки если в поле каптчи ничего не введено - мессага уходит, при введении любого значения в каптчу - мессага все равно уходит, а на пустой странице пишет что введен неправильный код. Где ошибка? Подскажите плиз несведущему в PHP.


Спустя 37 минут, 33 секунды (8.04.2009 - 18:57) Kuliev написал(а):
pradiz
Забыл в начале скрипта запустить сессию вот она у тебя и не работает!!!!

Спустя 2 часа, 31 минута, 6 секунд (8.04.2009 - 21:29) pradiz написал(а):
Цитата (Kuliev @ 8.04.2009 - 15:57)
Забыл в начале скрипта запустить сессию...


Эх блин! Говорила мама в детстве учи сынок С++.......
Не родился во мне программер. wink.gif

Посмотри пожалуйста код. Сессия запускается. Проверка каптчи идет. Только как проверяется... Не могу разобраться я в этих всех переменных с ходу. Задача блин элементарная для вас наверняка...

PHP
<?php
session_start 
();
$xxx =$_POST["xxx"];
$name=$_POST["name"];
$email=$_POST["email"];
$mess=$_POST["mess"];  
if (isset (
$name))
{
$name substr($name,0,20);
if (empty(
$name))
{
echo 
"<center><b>Не указано имя.<p>";
echo 
"<a href=kontakt.php>Вернуться и правильно заполнить форму.</a>";
exit;
}
}
else 
{
$name "не указано";
}
if (isset (
$email))
{
$email substr($email,0,20);
if (empty(
$email))
{
echo 
"<center><b>Не указан e-mail.<p>";
echo 
"<a href=kontakt.php>Вернуться и правильно заполнить форму.</a>";
exit;
}
}
else 
{
$email "не указано";
}
if (isset (
$mess))
{
$mess substr($mess,0,1000);
if (empty(
$mess))
{
echo 
"<center><b>Нет текста сообщения.<p>";
echo 
"<a href=kontakt.php>Вернуться и правильно заполнить форму.</a>";
exit;
}
}
else 
{
$mess "не указано";
}
$i "не указано";
if (
$name == $i AND $email == $i AND $mess == $i)
{
echo 
"Ошибка ! Скрипту не были переданы параметры !";
exit;
}
if(
$_SESSION['CAPTCHA'] != $_POST['CAPTCHA']) {
            echo 
'Вы ввели неправильный код подтверждения!';
        } else {
echo 
"<center>Ваше сообщение отправлено. Мы обязательно с Вами свяжемся!<br><a href='index.html'>Вернуться на главную.";
        }
$to "admin@joom1.ru";
$headers "content-type: text/plain";
$subject "вопрос от посетителя сайта";
$message "Имя:$name::::::::::Электронный адрес:$email::::::::::Сообщение:$mess:::::::::IP-адрес:$REMOTE_ADDR";
mail ($to,$subject,$message) or print "Не могу отправить письмо.";
exit;


В таком виде получается что если поле каптчи оставлять пустым - сообщение отправляется, но как только в поле появляется какое-либо значение, даже верный результат математического действия, предлагаемого каптчей юзеру, кричит это: Вы ввели неправильный код подтверждения! Чего не хватает может в коде проверки?

Спустя 1 час, 25 минут, 55 секунд (8.04.2009 - 22:54) Joker написал(а):
Сократи код читать больно)

Вот так попробуй:

PHP
<?php
session_start
();
$xxx =$_POST["xxx"];
$name=$_POST["name"];
$email=$_POST["email"];
$mess=$_POST["mess"];  
$error 
.= (empty($name) || strlen($name)>20 )?"<br/><center><b>Не указано имя.<p>":NULL;
$error .= (empty($email) || strlen($email)>20 )?"<br/><center><b>Не указан e-mail.<p>":NULL;
$error .= (empty($mess) || strlen($mess)>1000 )?"<br/><center><b>Не указан e-mail.<p>":NULL;
$error .= ($_SESSION['CAPTCHA'] != $_POST['CAPTCHA'])?"<br/>Вы ввели неправильный код подтверждения!":NULL;

if (!empty($error)
echo $error."<br/><a href=kontakt.php>Вернуться и правильно заполнить форму.</a>";
else
{
    $to = "admin@joom1.ru";
    $headers = "content-type: text/plain";
    $subject = "вопрос от посетителя сайта";
    $message = "Имя:".$name."::::::::::Электронный адрес:".$email."::::::::::Сообщение:".$mess.":::::::::IP-адрес:".$_SERVER['REMOTE_ADDR'];
    if (mail($to,$subject,$message))
    echo "<center>Ваше сообщение отправлено. Мы обязательно с Вами свяжемся!<br><a href='index.html'>Вернуться на главную.";
    else
    echo 
"Не могу отправить письмо.";
}

Спустя 13 часов, 35 минут, 34 секунды (9.04.2009 - 12:30) pradiz написал(а):
Цитата (Joker @ 8.04.2009 - 19:54)
Сократи код читать больно)

Действительно, так гораздо приятнее глазу, когда код в таком виде )) Там я так понял нужна еще одна скобка закрывающая в 12 строке?
PHP
if (!empty($error))

Всё равно каптча работает как и раньше - неправильно. При пустом поле каптчи мессаги уходят, а при вводе любого значения, даже правильного, - кричит неправильный код подтверждения. Такое ощущение, что отсутствует правильный результат предлагаемого каптчей математического действия, для сравнения.

Спустя 13 минут, 3 секунды (9.04.2009 - 12:43) Kuliev написал(а):
Цитата (pradiz @ 9.04.2009 - 09:30)
Цитата (Joker @ 8.04.2009 - 19:54)
Сократи код читать больно)

Действительно, так гораздо приятнее глазу, когда код в таком виде )) Там я так понял нужна еще одна скобка закрывающая в 12 строке?
PHP
if (!empty($error))

Всё равно каптча работает как и раньше - неправильно. При пустом поле каптчи мессаги уходят, а при вводе любого значения, даже правильного, - кричит неправильный код подтверждения. Такое ощущение, что отсутствует правильный результат предлагаемого каптчей математического действия, для сравнения.

Ну так посмотри что у тебя в посте передается!
PHP
echo "<pre>";
print_r($_POST);


Спустя 24 минуты, 5 секунд (9.04.2009 - 13:07) pradiz написал(а):
Цитата (Kuliev @ 9.04.2009 - 09:43)
Ну так посмотри что у тебя в посте передается!

Пост всё правильно передаёт, только этот результат почему-то каптчёй не учитывается.

Спустя 5 минут, 12 секунд (9.04.2009 - 13:12) Kuliev написал(а):
Цитата (pradiz @ 9.04.2009 - 10:07)
Цитата (Kuliev @ 9.04.2009 - 09:43)
Ну так посмотри что у тебя в посте передается!

Пост всё правильно передаёт, только этот результат почему-то каптчёй не учитывается.

Посмотри что в сессии
PHP
echo "<pre>";
print_r($_SESSION);


Спустя 17 минут, 24 секунды (9.04.2009 - 13:30) pradiz написал(а):
Цитата (Kuliev @ 9.04.2009 - 10:12)
...что в сессии


А сессия млин пустая!
Вот этот кусок отвечает за математические действия и результат, который должен быть в сессии? А чем тогда здесь делается запись в сессию?
PHP
$numbers     = array();
    
$numbers[]    = rand(19);
    
$numbers[]  = rand(19);
    
    if(
rand(01) == 0) {
        
$_op                         '+'
        
$code                        strval($numbers[0]) .' + ' .strval($numbers[1]) .' =';
        
$_SESSION['CAPTCHA'] = $numbers[0] + $numbers[1];
    } else {
        
$_op                         '*';    
        
$code                        strval($numbers[0]) .' x ' .strval($numbers[1]) .' =';
        
$_SESSION['CAPTCHA'] = $numbers[0] * $numbers[1];
    }
    
session_write_close();

Спустя 43 минуты, 14 секунд (9.04.2009 - 14:13) Kuliev написал(а):
pradiz
Сейчас проверял твою каптчу все ОК!
А почему ты каптчу именно так подключаешь, а не через относительный путь????
HTML
<img src="http://www.joom1.ru/captcha/captcha.php" />


Спустя 33 минуты, 11 секунд (9.04.2009 - 14:46) pradiz написал(а):
Цитата (Kuliev @ 9.04.2009 - 11:13)
А почему ты каптчу именно так подключаешь, а не через относительный путь????

Я еще раз оправдаюсь, что я не программер в принципе. Если только в Бэйсике ))))) Поэтому понятие "через относительный путь" вводит меня в ступорный трепет. )) Относительный путь это примерно так?
PHP
<img src="./captcha/captcha.php/>


Спустя 3 минуты, 15 секунд (9.04.2009 - 14:49) pradiz написал(а):
Цитата (Kuliev @ 9.04.2009 - 11:13)
Сейчас проверял твою каптчу все ОК!


ГЕНИАЛЬНО! Действительно через относительный всё заработало!!!! А я ж дурень думал там нужно глобально всё. С чувством, с толком, с расстановкой... Спасибо просто наиогромнейшее за Вашу помощь! Буду продолжать вникать потихоньку в PHP, покуда мозг еще жив. wink.gif
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2025 Invision Power Services, Inc.