Я пытаюсь создать код для генерации CAPTCHA, и вот первая часть моего кода:
<?php
$flag = 5;
if (isset($_POST["flag"])) // check that POST variable is not empty
{
$input = $_POST["input"];
$flag = $_POST["flag"];
}
if ($flag == 1) // submit has been clicked
{
if (isset($_SESSION['captcha_string']) && $input == $_SESSION['captcha_string']) // user input and captcha string are same
{
?>
<div style="text-align:center;">
<h1>Your answer is correct!</h1>
<form action=" <?php echo $_SERVER['PHP_SELF']; ?>" method="POST"> // refresh the page
<input type="submit" value="refresh the page">
</form>
</div>
<?php
} else // incorrect answer, captcha shown again
{
?>
<div style="text-align:center;">
<h1>Your answer is incorrect!<br>please try again </h1>
</div>
<?php
//!!!!!!13. On refresh of CAPTCHA or web site destroy the CAPTCHA. Delete “CAPTCHA.jpeg” file.
imagedestroy('C:\xampp\htdocs\CAPTCHA2\Images\CAPTCHA.jpg');
create_image();
display();
}
} else // page has just been loaded
{
create_image();
display();
}
Я провел некоторое исследование, но, похоже, не знаю, в чем проблема. Вот предупреждения, которые появились, когда я попытался ввести CAPTCHA:
Примечание: неопределенный индекс: ввод в C: \ xampp \ htdocs \ CAPTCHA2 \ latest.php в строке 33
Предупреждение: imagedestroy () ожидает, что параметр 1 будет ресурсом, строка указана в C: \ xampp \ htdocs \ CAPTCHA2 \ latest.php в строке 63
Ниже приведена функция создания изображения CAPTCHA
function create_image()
{
$fonts = array( dirname(__FILE__) . '/Fonts/arial.ttf', dirname(__FILE__) . '/Fonts/consolaz.ttf', dirname(__FILE__) . '/Fonts/kenyc.ttf');
$word = '';
$w = 280;
$h = 120;
$matrix_c = 240/3;
$matrix_h = 110/3;
//!!!!!!!2. Create 2 dimensional w*h rectangle.
$image2 = imagecreatetruecolor($w, $h);
$background_color = imagecolorallocate($image2, 255, 255, 255);
imagefilledrectangle($image2,0,0,$w,$h,$background_color);
//!!!!!!!3. Add transparent background in rectangle. With w width and h height so its fit to rectangle.
imagealphablending($image2, false);
$transparency = imagecolorallocatealpha($image2, 0, 0, 0, 127);
imagefill($image2, 0, 0, $transparency);
imagesavealpha($image2, true);
//!!!!!!!4. Take random letter and number from "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789" and generate one n number String.
//NOTE: But for selecting letters avoid some same type of letters so its not make any confusion to users. Like I/1, 0/O, Q/O, C/G, h/b After removing this letters, select string only from "acdefgijklmnopqrstuvwxyzABCDEFHJKLMNPRSTUVWXYZ23456789"
$R = rand(0,255);
$G = rand(0,255);
$B = rand(0,255);
$letters = 'ABCYZ2349';
//$letters = 'acdefgijklmnopqrstuvwxyzABCDEFHJKLMNPRSTUVWXYZ23456789';
$len = strlen($letters);
$letter = $letters[rand(0, $len-1)];
$text_color = imagecolorallocate($image2, $R,$G,$B);
//!!!!!!!5. That random String put in rectangle on transparent background. Make this string font color black only.
for ($i = 0; $i<6;$i++) {
$letter = $letters[rand(0, $len-1)];
$R = rand(0,255);
$G = rand(0,255);
$B = rand(0,255);
imagettftext($image2, 38, GetGrad(), 20+($i*40), 75, imagecolorallocate($image2, $R,$G,$B), $fonts[rand(0,2)], $letter);
$word.=$letter;
}
//!!!!!!!6. Put this rectangle in session
$_SESSION['captcha_string'] = $word;
$out = imagecrop($image2,['x' => 10, 'y' => 25, 'width' => 240, 'height' => 60]);
$line_color = imagecolorallocate($image2, 255, 255, 255);
imagesetthickness ($image2,1);
for ($i = 0; $i<0;$i++) {
imageline($image2,0,$matrix_h,280,$matrix_h,$line_color);
imageline($image2,0,$matrix_h*2,280,$matrix_h*2,$line_color);
imageline($image2,$matrix_c,0,$matrix_c,120,$line_color);
imageline($image2,$matrix_c*2,0,$matrix_c*2,120,$line_color);
}
$images = glob("*.png");
foreach($images as $image_to_delete)
{
unlink($image_to_delete);
}
//!!!!!!!7. Now give random rotation on that all letters and re-arrange in rectangle.
imagepng($image2, 'C:\xampp\htdocs\CAPTCHA2\Images\image2.png');
$image = new imagick( 'C:\xampp\htdocs\CAPTCHA2\Images\image2.png' );
$distort = array( 10,0,10,0, 0,100, 20,100, 10,250, 20,200,
253,240, 133,190, 266,400, 266,400, 266,100, 246,100,
266,10, 266,0, 133,0, 153,20 );
$image->setImageVirtualPixelMethod( imagick::VIRTUALPIXELMETHOD_BACKGROUND );
$image->distortImage( Imagick::DISTORTION_SHEPARDS, $distort, true );
$image->writeImage('C:\xampp\htdocs\CAPTCHA2\Images\image2.png');
//!!!!!!!8. Now divide rectangle in r*c matrix.
imageline($image2,0,$matrix_h,280,$matrix_h,$line_color);
imageline($image2,0,$matrix_h*2,280,$matrix_h*2,$line_color);
imageline($image2,$matrix_c,0,$matrix_c,120,$line_color);
imageline($image2,$matrix_c*2,0,$matrix_c*2,120,$line_color);
//!!!!!!!10. Insert one background that consist black color’s n number of lines.
$png = imagecreatefrompng('C:\xampp\htdocs\CAPTCHA2\Images\image2.png');
$jpeg = imagecreatefromjpeg('C:\xampp\htdocs\CAPTCHA2\Images\bg2.jpg');
$out = imagecreatetruecolor($w, $h);
//!!!!!!!11. Insert this background in Rectangle
imagecopyresampled($out, $jpeg, 0, 0, 0, 0, $w, $h, $w, $h);
imagecopyresampled($out, $png, 0, 0, 0, 0, $w, $h, $w, $h);
$out = imagecrop($out,['x' => 10, 'y' => 25, 'width' => 240, 'height' => 60]);
//!!!!!!!12.Export as jpeg file name: “CAPTCHA.jpeg”
imagejpeg($out, 'C:\xampp\htdocs\CAPTCHA2\Images\CAPTCHA.jpg');
}
Я только недавно начал изучать php, любая помощь очень ценится. Спасибо.