Показать сообщение отдельно
  #10 (permalink)  
Старый 21.12.2016, 08:21
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,989

Я не знаю кто такой Жур и чему он учит, но советовал бы вам учить язык программирования не по мультикам, а по учебникам. Хотите научиться вязать спицами? Согласен, в этом случае мультики помогут.

Изучать надо с простого до сложного, ибо вы не понимая многого, пытаетесь охватить необъятное.

Здесь два простых файла, сохраните первый под именем index.php, а второй captcha.php на локальном сервере в созданном локальном домене тестовом. Запустите.

Код из JS имеет только нативный обработчик, изменяющий код каптчи щелчком по самой каптче. Отправляйте форму ничего в нее не вводя - результата не будет, будет вновь предлагаться форма. Введите только код каптчти, опять будет форма. Введите и имя, но с неверным кодом каптчи - опять форма. Все это ошибки, которые не отвечают требованию проверки:

if($post['secret'] && $post['secret']==$_SESSION['secret'] && $post['name'])

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

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

Поймете это простое, тогда следующий этап - прикрутить к этому асинхронный обмен клиента с сервером, и т.д., и т.п.

<?php
session_start();
if($post = array_diff(array_map('trim', $_POST), [''])) {
    if($post['secret'] && $post['secret']==$_SESSION['secret'] && $post['name']) {
        $_SESSION['clubman'] = htmlspecialchars($post['name']);
        unset($_SESSION['secret']);
    }
}
?>
<!DOCTYPE HTML>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<style>
form {
    width: 30%;
    margin: 40px auto;
}
label {
    display: block;
    margin: 10px;
}
label * {
    vertical-align: middle;
}
img {
    cursor: pointer;
}
button {
    padding: 3px 15px;
    margin-top: 10px;
    float: right;
}
</style> 
</head>
<body>
<?php
if(!$_SESSION['clubman']) {
?>
<form method="post">
<fieldset>
<legend>Вы не робот?</legend>
<label>Имя: <input name="name" /></label>
<label>Код: <input name="secret" /> <img src="captcha.php?<?=time()?>" onclick="this.src=this.src.replace(/\d+/, new Date().getTime())" /></label>
</fieldset>
<button>Подтверждаю</button>
</form>
<?php
} else {
?>
<p>Приветствуем участника клуба <?=$_SESSION['clubman']?>!</p>
<?php
}
?>
</body>
</html>


<?php 
session_start(); 
$code = rand(1000,9999); 
$_SESSION['secret'] = $code; 
     
$img = imagecreate (50, 23);
imagecolorallocate($img, 0, 0, 0);
$color = imagecolorallocate($img, 255, 255, 255); 
imagestring($img, 5, 6, 3, $code, $color); 

header('Cache-control: no-cache'); 
header('Content-type: image/gif'); 
imagegif($img);
imagedestroy($img); 
?>

Последний раз редактировалось laimas, 21.12.2016 в 10:10.
Ответить с цитированием