Heim  >  Artikel  >  Backend-Entwicklung  >  php使用for循环生成4位验证码只生成了3位

php使用for循环生成4位验证码只生成了3位

WBOY
WBOYOriginal
2016-06-06 20:14:431303Durchsuche

我是用php for循环生成验证码,经常出现有一位验证码没能生成的情况,希望了解问题的大神的帮忙看下代码,非常感谢!

<code><?php $image = imagecreatetruecolor(100,30);
$bgcolor = imagecolorallocate($image,255,255,255);
imagefill($image,0,0,$bgcolor);

// 生成干扰像素点
for ($i=0; $i < 200; $i++) {
    $pixelcolor = imagecolorallocate($image,rand(121,254),rand(121,254),rand(121,254));
    imagesetpixel($image,rand(1,99),rand(1,29),$pixelcolor);
}

    // 生成干扰直线
for ($i=0; $i < 4; $i++) {
    $linecolor = imagecolorallocate($image,rand(121,254),rand(121,254),rand(121,254));
    imageline($image,rand(0,99),rand(0,29),rand(0,99),rand(0,29),$linecolor);
}

//生成验证码
for ($i=0; $i < 4; $i++) {
    $fontsize = 6;
    $fontcolor = imagecolorallocate($image,rand(0,120),rand(0,120),rand(0,120));
    $data = 'abcdefghijkmnpqrstuvwxy3456789';
    $fontcontent = substr($data,rand(0,strlen($data)),1);
    $x = ($i*100/4)+rand(5,10);
    $y = rand(5,10);
    imagestring($image,$fontsize,$x,$y,$fontcontent,$fontcolor);
}

header('content-type:image/png');
imagepng($image);
imagedestroy($image);
?>
</code>

php使用for循环生成4位验证码只生成了3位
上图为生成效果

回复内容:

我是用php for循环生成验证码,经常出现有一位验证码没能生成的情况,希望了解问题的大神的帮忙看下代码,非常感谢!

<code><?php $image = imagecreatetruecolor(100,30);
$bgcolor = imagecolorallocate($image,255,255,255);
imagefill($image,0,0,$bgcolor);

// 生成干扰像素点
for ($i=0; $i < 200; $i++) {
    $pixelcolor = imagecolorallocate($image,rand(121,254),rand(121,254),rand(121,254));
    imagesetpixel($image,rand(1,99),rand(1,29),$pixelcolor);
}

    // 生成干扰直线
for ($i=0; $i < 4; $i++) {
    $linecolor = imagecolorallocate($image,rand(121,254),rand(121,254),rand(121,254));
    imageline($image,rand(0,99),rand(0,29),rand(0,99),rand(0,29),$linecolor);
}

//生成验证码
for ($i=0; $i < 4; $i++) {
    $fontsize = 6;
    $fontcolor = imagecolorallocate($image,rand(0,120),rand(0,120),rand(0,120));
    $data = 'abcdefghijkmnpqrstuvwxy3456789';
    $fontcontent = substr($data,rand(0,strlen($data)),1);
    $x = ($i*100/4)+rand(5,10);
    $y = rand(5,10);
    imagestring($image,$fontsize,$x,$y,$fontcontent,$fontcolor);
}

header('content-type:image/png');
imagepng($image);
imagedestroy($image);
?>
</code>

php使用for循环生成4位验证码只生成了3位
上图为生成效果

1个可能的原因

$fontcontent = substr($data,rand(0,strlen($data)),1);

这里改为

$fontcontent = substr($data,rand(0,strlen($data)-1),1);

原因是php的rand方法为闭区间,前后分别为最小值和最大值,都可以出现

试试strlen($data)-1

$fontcontent = substr($data,rand(0,strlen($data)),1);这行

艾玛我点进来的时候还没有回复。跟楼上雷同,我不是故意的。
大家给楼上点赞吧。

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn