会话变量总是在php中加载页面?

时间:2010-11-25 21:03:27

标签: php session

我正在使用以下代码在我的网站上创建验证码,但是当我尝试从会话中读取值时,它始终是之前的验证码值。

<?php

session_start();

$captchaStr = md5(microtime() * mktime());
$captchaStr = substr($captchaStr,0,5);

$_SESSION["captcha"] = $captchaStr;

$captcha = imagecreatefrompng("../images/captcha.png");
$black = imagecolorallocate($captcha, 154, 32, 242);
$line = imagecolorallocate($captcha, 233, 239, 239);

// Draw lines
imageline($captcha, 0, 0, 39, 29, $line);
imageline($captcha, 40, 0, 64, 29, $line);

// Add captcha text
imagestring($captcha, 5, 20, 10, $_SESSION["captcha"], $black);

header("Content-type: image/png");
imagepng($captcha);

?>

有没有人知道为什么会这样以及如何修复它?

干杯

1 个答案:

答案 0 :(得分:3)

我猜你试图从包含验证码值的页面读回验证码值,如下所示:

<?php session_start(); ?>

<img src="/lib/captcha.php" />

<?php echo "Captcha is: ", $_SESSION['captcha'] ?>

这永远不会奏效。 PHP默认锁定会话文件,因此在上述容器页面完成执行之前,您的验证码脚本无法运行。同样,由于验证码是作为单独调用获取的,因此用户的浏览器必须启动回服务器的回调以获取图像。这将需要几秒钟的完成时间,而容器页面将在几微秒内完成。

换句话说,在容器脚本完成之后,验证码生成器脚本很可能永远不会开始运行,这意味着容器脚本永远不会在会话文件中看到新的验证码字符串。