Я надеялся связаться с кем-то в ситуации, когда я нигде не могу найти решение.
Я пытаюсь создать капчу на своем веб-сайте, используя php, и хотя мне удалось создать изображение и создать произвольный текст капчи.
Я не могу их перебить. Вот мой код:
<?PHP
session_start();function generateRandomString($length = 10) {
$letters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz';
$len = strlen($letters);
$letter = $letters[rand(0, $len - 1)];
$text_color = imagecolorallocate($image, 0, 0, 0);
$word = "";
for ($i = 0; $i < 6; $i++) {
$letter = $letters[rand(0, $len - 1)];
imagestring($image, 7, 5 + ($i * 30), 20, $letter, $text_color);
$word .= $letter;
}
$_SESSION['captcha_string'] = $word;
}function security_image(){
// $code = isset($_SESSION['captcha']) ? $_SESSION['captcha'] : generate_code();
//$font = 'content/fonts/comic.ttf';
$width = '110';
$height = '20';
$font_size = $height * 0.75;
// $image = @imagecreate($width, $height) or die('GD not installed');
global $image;
$image = imagecreatetruecolor($width, $height) or die("Cannot Initialize new GD image stream");
$background_color = imagecolorallocate($image, 255, 255, 255);
imagefilledrectangle($image,0,0,200,50,$background_color);$line_color = imagecolorallocate($image, 64,64,64);
for($i=0;$i<10;$i++) {
imageline($image,0,rand()%50,200,rand()%50,$line_color);
}
$pixel_color = imagecolorallocate($image, 0,0,255);
for($i=0;$i<1000;$i++) {
imagesetpixel($image,rand()%200,rand()%50,$pixel_color);
}
//$textbox = imagettfbbox($font_size, 0, $font, $code);
//$textbox = imagettfbbox($font_size, 0, $randomString);
$x = ($width - $textbox[4]) / 2;
$y = ($height - $textbox[5]) / 2;
// imagettftext($image, $font_size, 0, $x, $y, $text_color, $font , $code);
imagettftext($image, $font_size, 0, $x, $y, $text_color , $word);$images = glob("*.png");
foreach ($images as $image_to_delete) {
@unlink($image_to_delete);
}
imagepng($image, "image" . $_SESSION['count'] . ".png");
header('Content-Type: image/png');
imagepng($image);
imagedestroy($image);
}
security_image();?>
Я понятия не имею, что я делаю неправильно. Я потратил более 10 часов на эту проблему «отображения текста». Я не понимаю, и я отчаянно нуждаюсь в помощи. Я даже скачал рабочую версию капчи с других ресурсов, которые ломаются, когда я загружаю ее на свой сервер. Я понятия не имею, что происходит. Сначала я подумал, что с моим сервером что-то не так, но тот факт, что я могу даже создать пиксели и линии, означает, что он по крайней мере работает.
Пожалуйста помоги!!!!
ОБНОВИТЬ———————————————
Спасибо вам за ваши предложения. Вот отредактированный код. У меня все та же проблема.
<?PHP
session_start();function security_image(){
global $image;
// $code = isset($_SESSION['captcha']) ? $_SESSION['captcha'] : generate_code();
$font = 'content/fonts/comic.ttf';
$width = '110';
$height = '20';
$font_size = $height * 0.75;
$image = imagecreatetruecolor($width, $height) or die("Cannot Initialize new GD image stream");
$background_color = imagecolorallocate($image, 255, 255, 255);
imagefilledrectangle($image,0,0,200,50,$background_color);$line_color = imagecolorallocate($image, 64,64,64);
for($i=0;$i<10;$i++) {
imageline($image,0,rand()%50,200,rand()%50,$line_color);
}
$pixel_color = imagecolorallocate($image, 0,0,255);
for($i=0;$i<1000;$i++) {
imagesetpixel($image,rand()%200,rand()%50,$pixel_color);
}
$letters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz';
$len = strlen($letters);
$letter = $letters[rand(0, $len - 1)];
$text_color = imagecolorallocate($image, 0, 0, 0);
$word = "";
for ($i = 0; $i < 6; $i++) {
$letter = $letters[rand(0, $len - 1)];
imagestring($image, 7, 5 + ($i * 30), 20, $letter, $text_color);
$word .= $letter;
}
$_SESSION['captcha_string'] = $word;
/*texbox unitinitialized (removed for the sake of just showing the word size doesnt matter)
$x = ($width - $textbox[4]) / 2;
$y = ($height - $textbox[5]) / 2;
*/
$x = ($width) / 2;
$y = ($height) / 2;
imagettftext($image,$font, 4, $x, $y, $word);header('Content-Type: image/png');
imagepng($image);
imagedestroy($image);
}
security_image();?>
я сделал некоторые предлагаемые изменения, но код, кажется, все еще делает то же самое. Просто отобразите строки и пиксели, как и ожидалось, но текст все еще отсутствует …?
В ваших функциях есть несколько «ошибок», давайте исправим их:
В generateRandomString ()
generateRandomString($length = 10)
$lenght
не используется его сфера применения.
$text_color = imagecolorallocate($image, 0, 0, 0);
$image
неинициализирован
В security_image () функция:
$textbox
неинициализирован
$text_color
а также $word
неинициализирован.
А также Wrong parameter count for imagettftext()
Вы добавляете 7 параметров и забываете font file
параметр.
нашел проблему. используя это:
http://php.net/manual/en/function.imagettftext.php
я смог увидеть, что расположение шрифта было неверным. Использование примера на этой странице и редактирование его в соответствии с моими потребностями сработало.