<MyRusakov.ru />

Создание движка на PHP и MySQL 2.0

Создание движка на PHP и MySQL 2.0

Видеокурс "Создание движка на PHP и MySQL 2.0" научит Вас создавать профессиональные движки для сайтов на PHP и MySQL с использованием ООП и паттерна MVC.

В курсе разобрана вся теория по структуре движка: как всё устроено, какие должны быть объекты, какая у них иерархия и как они взаимодействуют между собой.

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

Подробнее
Подписка

Подписавшись по E-mail, Вы будете получать уведомления о новых статьях.

Подписка Подписаться

Добавляйтесь ко мне в друзья ВКонтакте! Отзывы о сайте и обо мне оставляйте в моей группе.

Мой аккаунт Мой аккаунт Моя группа
Опрос

Каким движком Вы предпочитаете пользоваться?

Капча на PHP

Капча на PHP

Капчу на PHP, или проверочный код, позволяющий отличить человека от робота, каждый из Вас вводил многократно: при регистрации, при отправлении сообщения, при поиске на сайте и много, где ещё. И в этой статье мы с Вами разберём скрипт, реализующий капчу на PHP, а также я Вам покажу, как использовать данный скрипт.

Сначала скачайте скрипт капчи на PHP. Извлекайте архив и помещайте его на Ваш сайт.

Теперь о том, как добавить капчу на форму, например, на форму регистрации:

<form name="register" action="register.php" method="post">
  Поля для регистрации...
  <h3>Проверчный код</h3>
  <img src = "captcha.php" />;
  <input type = "text" name = "kapcha" />
  <input type = "submit" value = "Регистрация" />
</form>

В результате, на форме регистрации Вы увидите проверочный код, который пользователь должен будет ввести. Теперь о том, как проверить правильность ввода. Для этого в файле "register.php" (или в другом файле, который указан в атрибуте "action") пишем следующие строки:

session_start();
if($_POST['kapcha'] != $_SESSION['rand_code']) echo "Капча введена неверно";
else echo "Капча введена верно";

То есть считываем то, что ввёл пользователь ($_POST['kapcha']) и сравниваем с тем, что находится в сессии (данное значение было записано при генерации капчи). Если значения не совпадают, то делаем вывод, что капча введена неправильно, иначе делаем вывод, что капча введена верно. То есть дальше Вы можете, основываясь на результат сравнения выполнить определённые действия. Например, зарегистрировать пользователя или отправить его вновь на форму регистрации, хотя, безусловно, это зависит от Вашей задачи.

Если Вы хотите научиться самостоятельно создавать подобные скрипты, то посмотрите мой Видеокурс "PHP и MySQL с Нуля до Гуру": http://srs.myrusakov.ru/php

Копирование материалов разрешается только с указанием автора (Михаил Русаков) и индексируемой прямой ссылкой на сайт (http://myrusakov.ru)!

Добавляйтесь ко мне в друзья ВКонтакте: http://vk.com/myrusakov.
Если Вы хотите дать оценку мне и моей работе, то напишите её в моей группе: http://vk.com/rusakovmy.

Если Вы не хотите пропустить новые материалы на сайте,
то Вы можете подписаться на обновления: Подписаться на обновления

Если у Вас остались какие-либо вопросы, либо у Вас есть желание высказаться по поводу этой статьи, то Вы можете оставить свой комментарий внизу страницы.

Порекомендуйте эту статью друзьям:

Если Вам понравился сайт, то разместите ссылку на него (у себя на сайте, на форуме, в контакте):

  1. Кнопка:

    Она выглядит вот так: Как создать свой сайт

  2. Текстовая ссылка:

    Она выглядит вот так: Как создать свой сайт

  3. BB-код ссылки для форумов (например, можете поставить её в подписи):

Комментарии (61):

armen_98 armen_98 21.05.2011 14:04:59

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

Ответить

Admin Admin 21.05.2011 14:07:27

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

Ответить

armen_98 armen_98 18.07.2011 22:31:06

А зачем тогда капча вообще нужна?

Ответить

Admin Admin 18.07.2011 22:34:28

Для защиты от авторегистраций. А вдруг кому-нибудь понадобится? Это Вам кажется, что капча очень лёгкая, уверяю, что разработать подобный алгоритм распознавания очень тяжело, поэтому человек передумает заниматься авторегистрацией на моём сайте.

Ответить

Jocker Jocker 18.12.2011 18:35:13

Я немного усовершенствовал рисунок (сделал его меньше по высоте на 10 пикселей) и теперь нижние хвосты немного обрезаны. Такие, как "j" сканер определяет как "i", а "y" как "v", "p" как "o" или "D" ну и так далее. Просто нижняя часть скрыта настолько, что человек поймет, какая это буква, а fine reader нет :)

Ответить

Goshan9876 Goshan9876 26.05.2013 04:30:42

А я вобщем просто не заморачивался и скачал другой шрифт с корявыми буквами, в коде заменил verdana.tff на название моего шрифта и всё =)

Ответить

klen klen 19.12.2011 19:07:34

В какое место вставить session_start(); if($_POST['kapcha'] != $_SESSION['rand_code']) echo "Капча введена неверно"; else echo "Капча введена верно"; <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=windows-1251"/> <title>Обратная связь</title> </head> <body> <?php if (isset($_POST['name'])) {$name = $_POST['name'];} if (isset($_POST['email'])) {$email = $_POST['email'];} if (isset($_POST['mess'])) {$mess = $_POST['mess'];} if (empty($name)) { echo "<b>Не указано имя!<p>"; echo "<a href=contacts.html>Вернуться к заполнению формы</a>"; exit; } if (empty($email)) { echo "<b>Не указан e-mail!<p>"; echo "<a href=contacts.html>Вернуться к заполнению формы</a>"; exit; } if (empty($mess)) { echo "<b>Сообщение не написано!<p>"; echo "<a href=contacts.html>Вернуться к заполнению формы</a>"; exit; } $to = "pupkin@rambler.ru"; /*УКАЗАТЬ СВОЙ АДРЕС!*/ $headers = "Content-type: text/plain; charset = windows-1251"; $subject = "Сообщение с вашего сайта"; $message = "Имя пославшего: $name \nЭлектронный адрес: $email \nСообщение: $mess"; $send = mail ($to, $subject, $message, $headers); if ($send == 'true') { echo "<b>Спасибо за отправку вашего сообщения!<p>"; echo "<a href=index.html>Нажмите,</a> чтобы вернуться на главную страницу"; } else { echo "<p><b>Ошибка. Сообщение не отправлено!"; } ?> </body> </html>

Ответить

Admin Admin 19.12.2011 19:11:13

Обычно вставляют прямо в начале скрипта.

Ответить

klen klen 19.12.2011 19:16:12

примерчик сделайте пожалйста

Ответить

Admin Admin 19.12.2011 19:21:15

Какой пример? Начало скрипта сразу после <?php Но если не понимаете, то вот пример: <?php session_start(); echo "Сессия началась"; ?>

Ответить

klen klen 19.12.2011 19:24:05

ВОТ ТАК ПРАВИЛЬНО ИЛИ НЕТ? <?php session_start(); if($_POST['kapcha'] != $_SESSION['rand_code']) echo "Капча введена неверно"; else echo "Капча введена верно";

Ответить

Admin Admin 19.12.2011 19:32:22

Правильно.

Ответить

klen klen 19.12.2011 19:46:01

Вот такая ошибка Warning: session_start() [function.session-start]: Cannot send session cache limiter - headers already sent (output started at

Ответить

Admin Admin 19.12.2011 19:49:32

Одно из двух: 1. Что-то до <?php выводите, например, пробел. Иногда выводят даже HTML-теги. 2. Кодировка UTF-8, хотя нужно ставить кодировку UTF-8 без BOM.

Ответить

enot_poloskun enot_poloskun 01.03.2012 01:01:02

Здравствуйте. Скрипт, проверяющий капчу, выдает: Cannot send session cache limiter - headers already sent (output started at...) Я так думаю, это из-за того, что сессия запускается повторно. Первая была в генераторе капчи. Как можно решить эту проблему?

Ответить

Admin Admin 01.03.2012 08:24:16

Нет, проблема не в этом. Проблема в том, что сессия запускается ПОСЛЕ какого-нибудь echo или любого другого вывода в браузер. Ещё это может быть из-за проблемы с кодировкой. Надо ставить не UTF-8, а UTF-8 без BOM.

Ответить

enot_poloskun enot_poloskun 01.03.2012 14:56:34

Простите, а как можно исключить вывод в браузер, если в самом генераторе капчи жизненно необходим вывод в браузер изображения? Сессия там запускается при старте генератора капчи. Или, может быть, в нем можно обойтись и без сессии? (например, просто сформировав массив из пяти случайных чисел в результате работы цикла for?). И еще один вопрос. Можно ли организовать проверку введенного кода, не используя "session start"?

Ответить

Admin Admin 01.03.2012 16:51:37

Так начинайте сессию ДО вывода капчи.

Ответить

enot_poloskun enot_poloskun 01.03.2012 18:05:08

Так в том то и проблема, что и в генераторе есть session_start(), и в обработчике кпчи - тоже. Ваш пример: session_start(); if($_POST['kapcha'] != $_SESSION['rand_code'])... Так вот, если я убираю отсюда "session_start();", обработчик капчи перестает правильно распознавать вводимые мною числа - что бы я ни вводил, правильно ли, неправильно ли, все равно эффект один и тот же - пишет: "неправильно введены числа с картинки", хотя я уверен, что все ввожу правильно. Снова вставляю в обработчик "session start", и он начинает работать, как надо, но появляется вышеприведенная ошибка.

Ответить

Admin Admin 01.03.2012 18:18:27

Исправляйте свой код, он не является нормальным.

Ответить

morozov-semen morozov-semen 25.03.2012 13:55:52

Здравствуйте, Михаил. А как сделать чтобы буквы выводились не по левому краю, а посередине?

Ответить

Admin Admin 25.03.2012 13:56:50

Изменить координаты в самом скрипте при генерации капчи.

Ответить

morozov-semen morozov-semen 25.03.2012 14:06:21

А какие именно параметры отвечают за положение символов?

Ответить

Admin Admin 25.03.2012 14:08:58

imagettftext ($image, 30, 0, 10, 40, $color, $dir."verdana.ttf", $_SESSION['rand_code']);

Ответить

morozov-semen morozov-semen 25.03.2012 14:20:17

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

Ответить

AndreyWS AndreyWS 25.03.2012 19:54:49

Есть ли вообще смысл распознавать капчу роботом каждый раз, если хранить ответ в сессии? можно просто один раз ввести с картинки, сохранить, скопировать куку php-сессии и регистрироваться миллионы раз! Такую програмку я могу написать за 20 минут, более того, с помощью такой програмки конкуренты сайта могут забить тебе базу mysql за очень короткий срок! По-этому надо задуматься о том, стоит ли вообще доверять встроенным сессиям в php... я, например использую собственный класс сессии, значения которого хранятся тоже в кукисах (шифруется с помощью Rijndael(AES) + дополнительные крипты и хеши), в нем присутствует ключ с указанием времени жизни сессии, ip-адреса, user-agent'а ну еще нескольких финтов..(это все настраивается в конфигах). Но сессии использую только для авторизированных пользователей, для капчи использую зашифрованный куки с временем жизни 60 секунд(в самом куки хранится информация о времени его создания, поэтому копирование не прокатит), естественно капча тоже обновляется каждые 50 секунд(с запасом в 10сек) с помощью яваскрипта.

Ответить

ulot3049 ulot3049 17.05.2012 21:58:25

Мощно! А раскритикуете мою капчу? _http://lifeexample.ru/php-primeryi-skriptov/kapcha-na-php.html

Ответить

ken15 ken15 06.06.2012 13:31:03

а как сделать капчу по типу сложения, например записать ответ(1+3)

Ответить

Admin Admin 06.06.2012 18:51:14

Хорошо, напишу такую статью в понедельник.

Ответить

igor igor 02.08.2012 08:11:28

Михаил, спасибо за статью и вообще за сайт. Но у меня неувязочка выходит: файл captcha.php сам по себе открывается нормально-картинка есть. Но в другом файле через <img src = "captcha.php" alt="" /> не отображается в броузере. В firebug можно видеть , что <img> как будто бы в режиме hidden - написание осветленное, но если курсор остановить на src то в всплывающем инфо картинка загружается нормально... С чего могут быть такие проблемы? Спасибо!

Ответить

Admin Admin 02.08.2012 13:12:10

Если по src картинка появляется, то всё должно работать. Может у Вас действительно где-то в стилях картинка скрывается.

Ответить

igor igor 02.08.2012 18:39:09

случилось что-то страшное: после экспериментов с капчой на localhoste вобще все картинки перестали отображаться....

Ответить

Admin Admin 02.08.2012 23:58:37

Переустановить попробуйте.

Ответить

igor igor 03.08.2012 04:20:31

Целый день сегодня все переустанавливал, были проблемы с Вампом (проблемы с Aeston Menu и доступом на сервер). Все установил, а проблема осталась... Сами по себе картинки открываются, но в файлах РНР они не видны. Но слава Богу, как оказалось что такая беда только с Firefox, в Chrome все нормально отображается. Вобщем, проблема между Фоксом и с локальным сервером. С удаленным сервером нормально работает. Михаил, спасибо за ваши быстрые ответы и если у Вас будут какие=нибудь идеи по моей проблеме с Фоксом буду очень признателен.

Ответить

Admin Admin 03.08.2012 14:44:49

C firefox может быть ещё проблема в кэшировании картинки. Попробуйте поиграться с его настройками и проверить.

Ответить

igor igor 05.08.2012 01:06:53

Спасибо за совет попробую!

Ответить

Surovuy Surovuy 12.12.2012 22:53:25

Igor, такая же проблема, что и у Вас, в firefox не вставляется картинка по src, нашли решение?

Ответить

igor igor 18.12.2012 15:21:30

нет, не нашел. использую Хром.

Ответить

mixalka mixalka 06.12.2012 08:36:04

Помогите разобраться. В форму вставил, всё заработало. А вот дальше проблемы код: <?php session_start(); if($_POST['kapcha'] != $_SESSION['rand_code']) echo "Капча введена неверно"; else echo "Капча введена верно"; $to = $_POST['to']; // $tema = $_POST['tema']; $from = $_POST['from']; $message = $_POST['msg']; $header = "From: ".$from; mail($to, $tema, $message, $header); ?> Выдаёт ошибку строку 2 (session_start();), если введено не верно или верно, но в любом случае письмо уходит к адресату. Тест проводил на денвере.

Ответить

Admin Admin 06.12.2012 17:38:36

Надо после того, как капча введена неверно, делать редирект обратно, а не продолжать скрипт.

Ответить

mixalka mixalka 07.12.2012 07:45:27

Если не трудно напишите этот самый редирект, а то уже устал экспериментировать.

Ответить

Admin Admin 07.12.2012 10:34:58

header("Location: ".$_SERVER["HTTP_RERFERER"]); exit;

Ответить

mixalka mixalka 08.12.2012 13:48:33

<?php session_start(); if($_POST['kapcha'] != $_SESSION['rand_code']) echo "Капча введена неверно"; else echo "Капча введена верно"; header("Location: ".$_SERVER["HTTP_RERFERER"]); exit; $to = $_POST['to']; $tema = $_POST['tema']; $from = $_POST['from']; $message = $_POST['msg']; $header = "From: ".$from; mail($to, $tema, $message, $header); ?> Капча введена неверно Warning: Cannot modify header information - headers already sent by (output started at Z:\home\...\www\mail\mail.php:3) in Z:\home\...\www\mail\mail.php on line 5 Капча введена верно Warning: Cannot modify header information - headers already sent by (output started at Z:\home\...\www\mail\mail.php:4) in Z:\home\...\www\mail\mail.php on line 5

Ответить

Admin Admin 08.12.2012 19:59:05

echo перед header() - это абсурд. Это всё равно, что лошадь впереди телеги. Рекомендую ознакомиться с этой статьёй: http://myrusakov.ru/php-how-study.html

Ответить

mixalka mixalka 09.12.2012 08:29:15

Напишите как надо. Ставил после exit; и тоже выдаёт ошибку. Статья не внесла ясности.

Ответить

Admin Admin 09.12.2012 10:55:06

Статья должна внести ясности в том, что не надо делать регистрацию, если не знаете, что такое header(). Я мог бы написать (это ровно 3 строчки), но не буду, ибо это будет вред Вам. Здесь учатся, а готовые скрипты "скопируй не думая, вставь не думая" на других сайтах.

Ответить

Domino Domino 25.12.2012 00:39:35

Как то так <?php session_start(); if($_POST['kapcha'] != $_SESSION['rand_code']) { echo 'Капча введена неверно'; exit; } else { header ('Refresh: 3; URL=адрес куда отправлять'); //Время редиректа и куда отправлять пользователя $to = $_POST['to']; $tema = $_POST['tema']; $from = $_POST['from']; $message = $_POST['msg']; $header = "From: ".$from; mail($to, $tema, $message, $header); echo 'Сообшение успешно отправлено'; exit; } ?>

Ответить

Domino Domino 25.12.2012 00:21:52

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

Ответить

Admin Admin 25.12.2012 09:33:25

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

Ответить

Скромняга Скромняга 15.01.2013 17:01:22

А какой смысл разукрашивать буквы в капче, если боту это будет абсолютно всё равно?

Ответить

Admin Admin 15.01.2013 19:33:48

Для красоты.

Ответить

Скромняга Скромняга 18.01.2013 10:08:28

Лучше шрифт поменяйте на посложнее. И хоть на пару слов разбейте.

Ответить

wormix45 wormix45 14.02.2013 11:40:26

Михаил, а как сделать если капча правильная,то переходила на определёную ссылку?

Ответить

Admin Admin 14.02.2013 21:00:12

Через редирект: http://myrusakov.ru/redirekt-php.html

Ответить

heatshepset heatshepset 01.07.2013 13:26:05

Спасибо за урок! очень помогло!!!

Ответить

cap4369 cap4369 10.11.2013 19:09:37

Здравствуйте Дмитрий! Спасибо за урок, установил капчу в форму обратной связи, но выдается ошибка, что неправильно введен текст. Как я понимаю, при нажатии мною кнопки "submit" в $_POST['captcha'] попадает новое значение капчи, а не то которое ввожу. Как от этого избавиться? Привожу код обработчика: <?php include "config.php"; if($_POST['submit']){ session_start(); // определяем переменные $name = substr($_POST['name'], 0, 20); $mail = substr($_POST['mail'], 0, 20); $text = substr($_POST['text'], 0, 2000); $captcha = $_POST['captcha']; // проверка заполнения обязательных полей $error = ''; $pattern = "/^.+@[a-z0-9]+\.[a-z]{2,6}$/i"; if(empty($name)) $error = '<li>Не заполнено поле "Имя"</li>'; if(empty($mail)) $error .= '<li>Не заполнено поле "Email"</li>'; if(empty($text)) $error .= '<li>Не заполнено поле "Сообщение"</li>'; if(empty($captcha)) $error .= '<li>Не заполнено поле "Введите текст с картинки"</li>'; if(!empty($mail) and !preg_match($pattern, $mail)) $error .= '<li>Поле "Ваш Email:" не соответствует установленному формату</li>'; if($_POST['сaptcha'] != $_SESSION['rand_code']) $error .= '<li>Символы с картинки введены неверно</li>'; if(empty($error)) { // определяем переменные $to = 'to@mail.com'; $subject = "\r\n".'Заполнена форма на сайте'. "\r\n"; $message = "\r\n"."Имя: " .$name. "\r\n"; $message .= "Обратный e-mail: " .$mail. "\r\n"; $message .= "Текст сообщения: " .$text. "\r\n"; $headers = "Content-type: text/plain; charset = \"utf-8\""; // формируем сообщение if(mail($to, $subject, $message, $headers)) { $_SESSION['res'] = $name.', Ваше письмо успешно отправлено.'; header("Location: $site_url?option=contacts"); exit(); } else { $_SESSION['res'] = 'Произошла ошибка. Попробуйте еще раз.'; header("Location: $site_url?option=contacts"); exit(); } } else { $_SESSION['res'] = "Не заполнены обязательные поля:<ul>" .$error. "</ul>"; $_SESSION['name'] = $name; $_SESSION['mail'] = $mail; $_SESSION['text'] = $text; $_SESSION['captcha'] = $captcha; header("Location: $site_url?option=contacts"); exit(); } } ?>

Ответить

Admin Admin 10.11.2013 21:31:52

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

Ответить

cap4369 cap4369 10.11.2013 22:28:04

Михаил, обработчик("action"), который указывается в форме у меня естественно в отдельном файле, я вам его и показал выше. А вложение форм, чтобы указать еще один "action" не допускается. Но я нашел выход, я код капчи из файла img.php поместил в файле обработчика после if($_POST['submit']), соответственно в форме указал src="mail.php"(т.е. обработчик). Таким образом, при нажатии на кнопку отправки сообщения в массив POST попадает не новое значение капчи, а то, которое я ввожу в поле input. Еще раз огромное спасибо за Ваши уроки, они мне очень помогают. Михаил, у меня к Вам просьба, расскажите пожалуйста, как сделать так, чтобы при отправке сообщений страница в браузере не перескакивала в начало, так как становится не видно сообщения об отправке сообщения или регистрации. И еще, хотелось бы узнать каким редактором пользуются на форумах для того чтобы можно было вставлять код. Было бы хорошо вообще такой урок сделать. Я умею прикручивать CKEditor, но он не очень меня устраивает. Заранее благодарю. С уважением Игорь Нагай

Ответить

Plan1977 Plan1977 18.04.2014 07:08:50

Здравствуйте Михаил!!! Попробовал установить КАПЧУ из вашего примера к себе на сайт, НО почему то в форме с выводом капчи картинка НЕ выводится. Я убрал все лишние файлы, оставил только папку font, файл captcha.php и в пустой файл Index.html вставил код формы с капчей и всё ровно картинка не выводится???? Файл chaptcha.php изображение генерит нормально, видимо загвоздка в строке <img src = "captcha.php" /> В чём дело, что я делаю неправильно?????

Ответить

Plan1977 Plan1977 18.04.2014 11:36:58

Разобрался частично, действительно код рабочий, КАПЧА выводится. Причина кроется в следующем: файл captcha.php должен обязательно лежать в корне сайта. Если его положить во вложенную папку (например lib) то конструкция <img src = "lib/captcha.php" /> уже не срабатывает. А вот почему???? вот это вопрос. Если к примеру загружать просто картинку из каталога lib (например <img src = "lib/logo.png" /> - картинка загружается, а captcha.php НЕТ. В ЧЁМ ПРИЧИНА ?????? Поясните Михаил!!!!!!!!!

Ответить

yuriy.rudei yuriy.rudei 17.08.2015 01:57:25

Класно, мне нравиться

Ответить

Для добавления комментариев надо войти в систему.
Если Вы ещё не зарегистрированы на сайте, то сначала зарегистрируйтесь.