Давайте немного вспомним, что мы уже сделали. Создали форму добавления комментариев, написали обработчик для публикации и фильтрации сообщений, подключили javascript для вывода комментариев на ajax без перезагрузки страници, сделали проверку на заполнение полей формы, и далее как, я и обещал сегодня мы подключим файл обработки капчи. Файл будет генерировать случайное число, набор символов или то, что мы ему укажим. Давайте продолжать. И следующим этапом создадим сам файл для генерации капчи и назовем его kсaptcha.php
Содержимое класса для капчи
Код PHP
class KCAPTCHA{
// generates keystring and image
function KCAPTCHA(){
require(dirname(__FILE__).'/kcaptcha_config.php');
$fonts=array();
$fontsdir_absolute=dirname(__FILE__).'/'.$fontsdir;
if ($handle = opendir($fontsdir_absolute)) {
while (false !== ($file = readdir($handle))) {
if (preg_match('/\.png$/i', $file)) {
$fonts[]=$fontsdir_absolute.'/'.$file;
}
}
closedir($handle);
}
$alphabet_length=strlen($alphabet);
while(true){
// generating random keystring
while(true){
$this->keystring='';
for($i=0;$i<$length;$i++){
$this->keystring.=$allowed_symbols{mt_rand(0,strlen($allowed_symbols)-1)};
}
if(!preg_match('/cp|cb|ck|c6|c9|rn|rm|mm|co|do|cl|db|qp|qb|dp/', $this->keystring)) break;
}
$font_file=$fonts[mt_rand(0, count($fonts)-1)];
$font=imagecreatefrompng($font_file);
imagealphablending($font, true);
$fontfile_width=imagesx($font);
$fontfile_height=imagesy($font)-1;
$font_metrics=array();
$symbol=0;
$reading_symbol=false;
// loading font
for($i=0;$i<$fontfile_width && $symbol<$alphabet_length;$i++){
$transparent = (imagecolorat($font, $i, 0) >> 24) == 127;
if(!$reading_symbol && !$transparent){
$font_metrics[$alphabet{$symbol}]=array('start'=>$i);
$reading_symbol=true;
continue;
}
if($reading_symbol && $transparent){
$font_metrics[$alphabet{$symbol}]['end']=$i;
$reading_symbol=false;
$symbol++;
continue;
}
}
$img=imagecreatetruecolor($width, $height);
imagealphablending($img, true);
$white=imagecolorallocate($img, 255, 255, 255);
$black=imagecolorallocate($img, 0, 0, 0);
imagefilledrectangle($img, 0, 0, $width-1, $height-1, $white);
// draw text
$x=1;
for($i=0;$i<$length;$i++){
$m=$font_metrics[$this->keystring{$i}];
$y=mt_rand(-$fluctuation_amplitude, $fluctuation_amplitude)+($height-$fontfile_height)/2+2;
if($no_spaces){
$shift=0;
if($i>0){
$shift=1000;
for($sy=7;$sy<$fontfile_height-20;$sy+=1){
//for($sx=$m['start']-1;$sx<$m['end'];$sx+=1){
for($sx=$m['start']-1;$sx<$m['end'];$sx+=1){
$rgb=imagecolorat($font, $sx, $sy);
$opacity=$rgb>>24;
if($opacity<127){
$left=$sx-$m['start']+$x;
$py=$sy+$y;
if($py>$height) break;
for($px=min($left,$width-1);$px>$left-12 && $px>=0;$px-=1){
$color=imagecolorat($img, $px, $py) & 0xff;
if($color+$opacity<190){
if($shift>$left-$px){
$shift=$left-$px;
}
break;
}
}
break;
}
}
}
if($shift==1000){
$shift=mt_rand(4,6);
}
}
}else{
$shift=1;
}
imagecopy($img,$font,$x-$shift,$y,$m['start'],1,$m['end']-$m['start'],$fontfile_height);
$x+=$m['end']-$m['start']-$shift;
}
if($x<$width-10) break; // fit in canvas
}
$center=$x/2;
// credits. To remove, see configuration file
$img2=imagecreatetruecolor($width, $height+($show_credits?12:0));
$foreground=imagecolorallocate($img2, $foreground_color[0], $foreground_color[1], $foreground_color[2]);
$background=imagecolorallocate($img2, $background_color[0], $background_color[1], $background_color[2]);
imagefilledrectangle($img2, 0, 0, $width-1, $height-1, $background);
imagefilledrectangle($img2, 0, $height, $width-1, $height+12, $foreground);
$credits=empty($credits)?$_SERVER['HTTP_HOST']:$credits;
imagestring($img2, 2, $width/2-ImageFontWidth(2)*strlen($credits)/2, $height-2, $credits, $background);
// periods
$rand1=mt_rand(750000,1200000)/10000000;
$rand2=mt_rand(750000,1200000)/10000000;
$rand3=mt_rand(750000,1200000)/10000000;
$rand4=mt_rand(750000,1200000)/10000000;
// phases
$rand5=mt_rand(0,31415926)/10000000;
$rand6=mt_rand(0,31415926)/10000000;
$rand7=mt_rand(0,31415926)/10000000;
$rand8=mt_rand(0,31415926)/10000000;
// amplitudes
$rand9=mt_rand(330,420)/110;
$rand10=mt_rand(330,450)/110;
//wave distortion
for($x=0;$x<$width;$x++){
for($y=0;$y<$height;$y++){
$sx=$x+(sin($x*$rand1+$rand5)+sin($y*$rand3+$rand6))*$rand9-$width/2+$center+1;
$sy=$y+(sin($x*$rand2+$rand7)+sin($y*$rand4+$rand8))*$rand10;
if($sx<0 || $sy<0 || $sx>=$width-1 || $sy>=$height-1){
continue;
}else{
$color=imagecolorat($img, $sx, $sy) & 0xFF;
$color_x=imagecolorat($img, $sx+1, $sy) & 0xFF;
$color_y=imagecolorat($img, $sx, $sy+1) & 0xFF;
$color_xy=imagecolorat($img, $sx+1, $sy+1) & 0xFF;
}
if($color==255 && $color_x==255 && $color_y==255 && $color_xy==255){
continue;
}else if($color==0 && $color_x==0 && $color_y==0 && $color_xy==0){
$newred=$foreground_color[0];
$newgreen=$foreground_color[1];
$newblue=$foreground_color[2];
}else{
$frsx=$sx-floor($sx);
$frsy=$sy-floor($sy);
$frsx1=1-$frsx;
$frsy1=1-$frsy;
$newcolor=(
$color*$frsx1*$frsy1+
$color_x*$frsx*$frsy1+
$color_y*$frsx1*$frsy+
$color_xy*$frsx*$frsy);
if($newcolor>255) $newcolor=255;
$newcolor=$newcolor/255;
$newcolor0=1-$newcolor;
$newred=$newcolor0*$foreground_color[0]+$newcolor*$background_color[0];
$newgreen=$newcolor0*$foreground_color[1]+$newcolor*$background_color[1];
$newblue=$newcolor0*$foreground_color[2]+$newcolor*$background_color[2];
}
imagesetpixel($img2, $x, $y, imagecolorallocate($img2, $newred, $newgreen, $newblue));
}
}
if(function_exists("imagejpeg")){
header("Content-Type: image/jpeg");
imagejpeg($img2, null, $jpeg_quality);
}else if(function_exists("imagegif")){
header("Content-Type: image/gif");
imagegif($img2);
}else if(function_exists("imagepng")){
header("Content-Type: image/x-png");
imagepng($img2);
}
}
// returns keystring
function getKeyString(){
return $this->keystring;
}
}
Просто поместите этот весь код в один файл, далее вы заметили, что мы в самом верху подключали kcaptcha_config.php, в нем мы зададим параметры. Вот сам код из файла kcaptcha_config.php.
Код PHP
# KCAPTCHA configuration file
$alphabet = "0123456789abcdefghijklmnopqrstuvwxyz"; # do not change without changing font files!
# symbols used to draw CAPTCHA
//$allowed_symbols = "0123456789"; #digits
$allowed_symbols = "23456789"; #alphabet without similar symbols (o=0, 1=l, i=j, t=f)
# folder with fonts
$fontsdir = 'fonts';
# CAPTCHA string length
//$length = mt_rand(3,5); # random 5 or 6
$length = 7;
# CAPTCHA image size (you do not need to change it, whis parameters is optimal)
$width = 120;
$height = 60;
# symbol's vertical fluctuation amplitude divided by 2
$fluctuation_amplitude = 7;
# increase safety by prevention of spaces between symbols
$no_spaces = true;
# show credits
$show_credits = false; # set to false to remove credits line. Credits adds 12 pixels to image height
$credits = 'phpguru.com.ua'; # if empty, HTTP_HOST will be shown
# CAPTCHA image colors (RGB, 0-255)
//$foreground_color = array(0, 0, 0);
//$background_color = array(220, 230, 255);
$foreground_color = array(mt_rand(0,100), mt_rand(0,100), mt_rand(0,100));
$background_color = array(mt_rand(200,255), mt_rand(200,255), mt_rand(200,255));
# JPEG quality of CAPTCHA image (bigger is better quality, but larger file size)
$jpeg_quality = 100;
Далее давайте подведем итоги. что мы имеем. Создали форму для добавления комментариев, сделали обработчик полей формы, подключили ajax и создали класс для реализации капчи для комментариев. Что нам остаеться еще сделать? Как подключать капчу в форму смотрите в коде где создавали в первой публикации. Не забываем, что капча проверка кода будет работать только при включенной сесии. Как вообще должно это работать, давайте просто создадим тестовый файл назовем его test.php и добавим в него такое содержимое.
Код PHP
error_reporting (E_ALL);
include('kcaptcha.php');
if(isset($_REQUEST[session_name()])){
session_start();
}
$captcha = new KCAPTCHA();
if($_REQUEST[session_name()]){
$_SESSION['captcha_keystring'] = $captcha->getKeyString();
}
Если набрать и запустить в браузере этот файл, то должны увидить посреди монитора набор цифр. Если вы увидили такой результат значит сделано все правильно, и все будет работать. Давайте еще рассмотрим один файл для работы с ajax JsHttpRequest.js. Я его добавил в архив с самим файлом JsHttpRequest.php его можно скачать здесь. Ну вот в принципе мы создали форму для добавления комментариев, теперь комментарии у нас проверяються и добавляються в базу, очищенными от лишних символов, установлена защита от спама подключили капчу, защитный код, при котором робот не пройдет. Идем далее. А далее нам необходимо определиться где мы будим выводить комментарии и форму комментирования на сайте. Обычно идет материал на сайте, после него комментарии, и за комментариями идет сама форма для добавления комментариев. Как у вас состоят дела с виводом материала на сайте, я знать не могу. Но для удобства я сделал форму в отдельном блоке как вы видели, то ее можно разместить смело в конце материала.
Создаем выборку комментариев из базы данных comments и публикуем их относительно материала статьи.
Давайте вспомним некоторые поля формы которые мы создавали в первой публикации а данную тему, там мы в таблице указывали идентификатор статьи поле с названием page, а в самой форме я добавил скрытое поле которое и передаст нам на сервер идентификатор статьи. Как это работает разберем подробнее, чтобы вы это усвоили.
У нас есть скрытое поле
Код HTML
<input name="id" value="<?= $id; ?>" type="hidden">
При размещении публикации на странице, вы обязательно указываете уникальный идентификатор статьи, или другого материала, я например реализовал его в переменной $id, куда и вставляю его в поле с именем id. На тему скрытых полей формы, я пока публикаций не писал. Вот решил немного описать вкратце как оно работает, также и переменная $guest для примера занесем в нее
Код PHP
$guest = "avatars/guest.png";
Это я сделал просто для примера, вы можете это сократить и просто по умолчанию в таблице выставить это значение. Значит на этом этапе думаю все понятно двигаемся далее и создадим наконец запрос с выборкой из базы данных комментариев относительно нашего материала. Давайте приведу пример.
Код PHP
$result = mysql_query ("SELECT * FROM comments WHERE post='$id' ORDER BY id ASC",$db); // сортируем выборку по пост id и новые внизу
$myrow = mysql_fetch_array($result);
После того как сделали выборку с базы можно создавать стиль для помещения коментариев, создавать цикл, какой вы обычно используете но рекомендую фореч. На этом заканчиваем разбор добаления комментариев на сайте с php, mysql, ajax, jquery и javascript. Вот теперь наши комментарии добавляються выводяться и обновляються без перезагрузки страници на ayax. Кто узнает разработчиков скриптов JsHttpRequest сообщите мне их координаты обязательно поставлю ссылку на источник. Мне эти файлы попали без никакой ориентации на автора. Не хочу нарушать права. Кому, что непонятно пожалуйста пишите в комментариях будим обязательно разбирать вместе, и выручать друг-друга. До новых встречь!