会话与图像PHP不匹配


Session does not match image PHP

我想知道为什么这个脚本生成的图像中的字符与为会话设置的字符不匹配。我不明白为什么会这样,如果有人能帮忙,那就太好了。谢谢,Lea。

// Font directory + font name
$font = 'wordpress/wp-content/themes/boldy/fonts/SF Juggernaut Bold.ttf';
// Total number of lines
$lineCount = 20;
// Size of the font
$fontSize = 19;
// Height of the image
$height = 38;
// Width of the image
$width = 120;
$img_handle = imagecreate ($width, $height) or die ("Cannot Create image");
// Set the Background Color RGB
$backColor = imagecolorallocate($img_handle, 242, 242, 242);
// Set the Line Color RGB
$lineColor = imagecolorallocate($img_handle, 207, 207, 207);
// Set the Text Color RGB
$txtColor = imagecolorallocate($img_handle, 95, 95, 95);
// Generate
$string = "bcdefghijklmopqrstwxyz023456789";
for($i=0;$i<6;$i++){
    $pos = rand(0,36);
    $str .= $string{$pos};
}
$textbox = imagettfbbox($fontSize, 0, $font, $str) or die('Error in imagettfbbox function');
$x = ($width - $textbox[4])/2;
$y = ($height - $textbox[5])/2;
imagettftext($img_handle, $fontSize, 0, $x, $y, $txtColor, $font , $str) or die('Error in imagettftext function');
for($i=0;$i<$lineCount;$i++){
    $x1 = rand(0,$width);$x2 = rand(0,$width);
    $y1 = rand(0,$width);$y2 = rand(0,$width);
    imageline($img_handle,$x1,$y1,$x2,$y2,$lineColor);
}
header('Content-Type: image/jpeg');
imagejpeg($img_handle,NULL,100);
imagedestroy($img_handle);
session_start();
$_SESSION['img_number'] = $str;

更新:经过测试,我注意到第一次加载映像时,不会设置会话,因此在刷新映像时,会使用最后一个$str值设置会话

如果您的头已经发送,那么调用session_start()可能会遇到问题。

更改

header('Content-Type: image/jpeg');
imagejpeg($img_handle,NULL,100);
imagedestroy($img_handle);
session_start();
$_SESSION['img_number'] = $str;

session_start();
header('Content-Type: image/jpeg');
imagejpeg($img_handle,NULL,100);
imagedestroy($img_handle);
$_SESSION['img_number'] = $str;

如果您使用firebug或devtools之类的工具调试脚本,那么它会调用您的映像两次。

尝试禁用你的firebug/devtools,你会看到PROFIT。

session_start();
// Font directory + font name
$font = 'wordpress/wp-content/themes/boldy/fonts/SF Juggernaut Bold.ttf';
// Total number of lines
$lineCount = 20;
// Size of the font
$fontSize = 19;
// Height of the image
$height = 38;
// Width of the image
$width = 120;
$img_handle = imagecreate ($width, $height) or die ("Cannot Create image");
// Set the Background Color RGB
$backColor = imagecolorallocate($img_handle, 242, 242, 242);
// Set the Line Color RGB
$lineColor = imagecolorallocate($img_handle, 207, 207, 207);
// Set the Text Color RGB
$txtColor = imagecolorallocate($img_handle, 95, 95, 95);
// Generate
$string = "bcdefghijklmopqrstwxyz023456789";
$str = '';
for($i=0;$i<6;$i++){
    $pos = rand(0,36);
    $str .= substr($string, $pos, 1);
}
$_SESSION['img_number'] = $str;
$textbox = imagettfbbox($fontSize, 0, $font, $str) or die('Error in imagettfbbox function');
$x = ($width - $textbox[4])/2;
$y = ($height - $textbox[5])/2;
imagettftext($img_handle, $fontSize, 0, $x, $y, $txtColor, $font , $str) or die('Error in imagettftext function');
for($i=0;$i<$lineCount;$i++){
    $x1 = rand(0,$width);$x2 = rand(0,$width);
    $y1 = rand(0,$width);$y2 = rand(0,$width);
    imageline($img_handle,$x1,$y1,$x2,$y2,$lineColor);
}
header('Content-Type: image/jpeg');
imagejpeg($img_handle,NULL,100);
imagedestroy($img_handle);