Подскажите, пожалуйста! Не работает captcha. Как установить captcha на обычной странице (например, http://host/index.php?p=valid), чтобы при клике на эту ссылку генерировалось новое изображение, без привлечения JS? Множество вариантов, предложенных в сети – не работают (или совсем, или не полностью). Вариант 1 PHP: <?php session_start(); $count=5; /* количество символов */ $width=100; /* ширина картинки */ $height=48; /* высота картинки */ $font_size_min=32; /* минимальная высота символа */ $font_size_max=32; /* максимальная высота символа */ $font_file="./Comic_Sans_MS.ttf"; /* путь к файлу относительно w3captcha.php */ $char_angle_min=-10; /* максимальный наклон символа влево */ $char_angle_max=10; /* максимальный наклон символа вправо */ $char_angle_shadow=5; /* размертени */ $char_align=40; /* выравнивание символа по-вертикали */ $start=5; /* позиция первого символа по-горизонтали */ $interval=16; /* интервал между началами символов */ $chars="0123456789"; /* набор символов */ $noise=10; /* уровень шума */ $image=imagecreatetruecolor($width, $height); $background_color=imagecolorallocate($image, 255, 255, 255); /* rbg-цветфона */ $font_color=imagecolorallocate($image, 32, 64, 96); /* rbg-цветтени */ imagefill($image, 0, 0, $background_color); $str=""; $num_chars=strlen($chars); for ($i=0; $i<$count; $i++) { $char=$chars[rand(0, $num_chars-1)]; $font_size=rand($font_size_min, $font_size_max); $char_angle=rand($char_angle_min, $char_angle_max); imagettftext($image, $font_size, $char_angle, $start, $char_align, $font_color, $font_file, $char); imagettftext($image, $font_size, $char_angle+$char_angle_shadow*(rand(0, 1)*2-1), $start, $char_align, $background_color, $font_file, $char); $start+=$interval; $str.=$char; } if ($noise) { for ($i=0; $i<$width; $i++) { for ($j=0; $j<$height; $j++) { $rgb=imagecolorat($image, $i, $j); $r=($rgb>>16) & 0xFF; $g=($rgb>>8) & 0xFF; $b=$rgb & 0xFF; $k=rand(-$noise, $noise); $rn=$r+255*$k/100; $gn=$g+255*$k/100; $bn=$b+255*$k/100; if ($rn<0) $rn=0; if ($gn<0) $gn=0; if ($bn<0) $bn=0; if ($rn>255) $rn=255; if ($gn>255) $gn=255; if ($bn>255) $bn=255; $color=imagecolorallocate($image, $rn, $gn, $bn); imagesetpixel($image, $i, $j , $color); } } } $_SESSION["captcha"]=$str; if (function_exists("imagepng")) { header("Content-type: image/png"); imagepng($image); } elseif (function_exists("imagegif")) { header("Content-type: image/gif"); imagegif($image); } elseif (function_exists("imagejpeg")) { header("Content-type: image/jpeg"); imagejpeg($image); } imagedestroy($image); ?> Выводит бинарный код в браузер (что и указано в описании imagepng и ей подобным). Как от него избавиться? Header уже вне игры, echo задействована. Вариант 2 То же, но вывод сгенерированного изображения в файл. Казалось бы, прекрасно и все должно работать, но: - при ссылке на созданное изображение с помощью img (src="image.png") - не работает обновление изображения при клике на ссылку http://host/index.php?p=valid, а f5 срабатывает. - если в дескриптор изображения поместить сценарий, создающий изображение (<img src="captcha.php">) - обновление работает и при клике на ссылку и по f5. Но тогда не доступна переменная сессии (echo показывает пустую строку) в которой сохранена уникальная строка для последующей проверки ее со значением из формы. Пробовал уникальные ссылки, кодировки (не понял, зачем это здесь, но умные люди советовали), кеширование и многое другое (на мой непрофессиональный взгляд не имеющее к данному вопросу отношения). Ничего пока не помогло. Уверен, что есть простой и надежный способ сделать код рабочим, но не знаю какой. Поэтому и обратился на специализированный форум.
Зачем придумывать велосипеды, которые, скорее всего, будут ещё и работать не так хорошо, как хотелось бы? Гугл уже всё придумал за нас http://webdesign.tutsplus.com/ru/tu...-captcha-recaptcha-in-your-website--cms-23024
Можно вообще не изучать php– использовать готовые скрипты и сайты. Кстати, это и есть один из велосипедов, предложенных в сети. Это простой код и он должен работать.
Не самое лучшее сравнение. Ну да ладно. Может кто подскажет. Библиотека ImageMagic то хоть установлена?
Нет и не будет установлена. Зачем? ImageMagick 6.9.2-1 Q16 x86_64 2015-11-09 http://www.imagemagick.org Эта установка поможет?
сорян, не ImageMagic, а GD. --- Добавлено --- о, а GD встроена в сам PHP теперь, оказывается. Ну теперь остаётся ждать, когда кто-нибудь знающий подойдёт.
есть такая конструкция как: PHP: ob_start(); echo 'hello'; echo 'world'; $text = ob_get_contents(); ob_end_clean(); 'hello' и 'world' НЕ будут выведены в браузер, а будут записаны в $text, это должно помочь. Но я когда то столкнулся с такой проблемой что картинка норм, а в браузере не отображалось. А точнее отдельно в файле картинка открывалась, а вот на странице wordpress в теге img нет. Может как то можно приспособить в твоём вопросе. а вообще я вижу это так, код должна генерировать сама картинка - captcha_imp.php а обновляться (картинку и код) она как раз должна при клике на картинку, следующим образом - изменение адреса картинки, на все тот же, но тут есть проблема если адрес тот же ни чего не произойдет, т.е. к адресу надо добавлять какие то GET параметры что бы каждый раз адрес был разный.
Пробовал это – не работает. Не понимаю простого, почему сценарию не доступна переменная сессии. А если доступна, то нет обновления кликом по ссылке. f5 – работает. Не писать же – для обновления captcha нажмите f5. А вообще, правильно понимаю, что $_SESSION должна быть доступна везде и всюду, после того как мы ее где-то вписали?
при выполнении скрипта она доступна везде после PHP: session_start(); но это надо делать ДО вывода чего-либо в браузер.
PHP: <?php session_start(); // ?> HTML: <img src="captcha.php"> В файле captcha.php генерируется изображение. В нем же $_SESSION получает уникальное значение. Теперь вопрос, т. к. изображение создается, значит, код php выполняется, следовательно $_SESSION существует, но на деле ее нет!? Вот этого понять не могу. В файле captcha.php она есть, за пределами этого файла ее нет. Один вариант придумал (уникальные адреса файлов) и он номинально работает, но, конечно, неуместен. Всех с праздником!
вот нашел код в интурнете, возможно он тебе поможет: PHP: function insert_base64_encoded_image($img, $echo = false){ $imageSize = getimagesize($img); $imageData = base64_encode(file_get_contents($img)); $imageHTML = "<img src='data:{$imageSize['mime']};base64,{$imageData}' {$imageSize[3]} />"; if($echo == true){ echo $imageHTML; } else { return $imageHTML; } } там просто в src надо указывать еще тип файла (data), base64 и т.д. --- Добавлено --- хотя возможно этот код будет работать криво, потому что там 2 раза вызывается картинка, первый раз: PHP: $imageSize = getimagesize($img); второй PHP: $imageData = base64_encode(file_get_contents($img)); соответственно код будет перезаписываться, короче если что имей ввиду, может это ни как не повлияет.
Это работает, спасибо, но предыдущий вопрос остается открытым ($_SESSION). Чем этот вариант отличается от варианта с тегом <img src="captcha.php">. По существу они решают одну задачу, но последний не работает.