我有一个带按钮的简单表格。按下按钮在PHP页面上调用GET。在页面上只有一个IMG标记,其中SRC是一个动态返回PNG图像的PHP脚本(imagepng()
函数)。
为什么Internet Explorer 9会多次加载此图像?
验证发生这种情况可能有点棘手。我发现这是因为我正在使用PHPEd调试PHP脚本(生成PNG的脚本),并意识到流在文件中输入两次,在断点上停止两次!
当我查看IE的网络日志时,我确认了这一点,并发现确实有多个调用脚本。要查看网络日志,请在IE窗口中按F12,然后单击“网络”选项卡。
根据日志,有一个未完全完成的调用(不返回HTTP 200状态),但这足以使所有内容混乱。
有关如何解决此问题的任何建议?
我已经做了一些示例脚本来演示这个问题:
档案“teste.php”
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<head>
<title>Problem</title>
</head>
<body>
<?php
$handle = fopen("teste.txt", "w");
fclose($handle);
?>
<img src="verification.php" alt="captcha">
<form action="teste.php" method="get">
<input type="submit" value="Go!">
</form>
</body>
</html>
档案“verification.php”
<?php
$im = imagecreatetruecolor(75, 20);
$black = ImageColorAllocate($im, 0, 0, 0);
$red = ImageColorAllocate($im, 255, 0, 0);
$blue = ImageColorAllocate($im, 0, 0, 255);
$grey_shade = ImageColorAllocate($im, 204, 204, 204);
srand((double)microtime()*1000000);
$num1 = rand(1,5);
$found = false;
while (!$found) {
$num2 = rand(1,100);
if (preg_match('/^[0-9]+$/', $num2/5)) {
$found = true;
break;
}
}
$font_c_rand = rand(1,3);
if ($font_c_rand == 1) {
$font_color = $black;
} else if ($font_c_rand == 2) {
$font_color = $red;
} else if ($font_c_rand == 3) {
$font_color = $blue;
}
$font = "vera.ttf";
$line_rand = rand(1,3);
if ($line_rand == 1) {
$line_color = $black;
} else if ($line_rand == 2) {
$line_color = $red;
} else if ($line_rand == 3) {
$line_color = $blue;
}
ImageFill($im, 0, 0, $grey_shade);
imageline($im,0,0,0,20,$line_color);
imageline($im,74,0,74,19,$line_color);
imageline($im,0,0,74,0,$line_color);
imageline($im,0,19,74,19,$line_color);
ImageTTFText($im, 10, 0, 3, 15,$font_color, $font, $num1." + ".$num2." =" );
imagepng($im);
imagedestroy($im);
$handle = fopen("teste.txt", "a");
fwrite($handle, "\"verification.php\ executed!". The sum result is " . ($num1 + $num2) ."\n");
fclose($handle);
?>
如您所见,您将需要一个ttf字体。将相同的文件夹放在同一个文件夹中,然后在上面的脚本中查找$ font变量。您可以使用任何True Type字体,看看:
$ font =“arial.ttf”;
唯一的要求是ttf文件必须位于脚本的同一文件夹中,才能使一切变得更简单。
测试正确的行为:
结果:文件中只有一行。内容表示验证码图像上显示正确的总和值。这是正确的行为,因为在验证码图像的显示上只调用了一次verify.php。
现在,测试问题:
结果:文件上有多行。可能2.其中一个人具有验证码图像总和的正确答案。这两个调用创建图像的方法正在弄乱验证码系统的正确答案,因此,没有办法将它与Internet Explorer一起使用。
如何为IE解决这个问题?在Firefox中,一切都还可以!
PS。:我正在尝试使用Lime Survey PHP脚本的验证码系统,但由于上述问题,它无法用于IE。