为什么价值观不平等?

时间:2015-02-28 12:02:21

标签: php session captcha

的index.php:

<?php
session_start();
?>
<img src='captcha.php' />
<?php
var_dump($_SESSION['vercode']);
unset($_SESSION['vercode']);
?>

captcha.php:

<?php
session_start();
$_SESSION["vercode"] = rand(10000,99999); 
$image = imagecreatefromjpeg("img/bg.jpg");
$txtColor = imagecolorallocate($image, 0, 0, 0);
imagestring($image, 5, 5, 5, $_SESSION["vercode"], $txtColor);
header("Content-type: image/jpeg");
imagejpeg($image);
imagedestroy($image);
?>

在结果页面上,图像上的值不等于var_dump上的值。

请告知为什么他们不平等以及如何解决?

3 个答案:

答案 0 :(得分:1)

这不起作用,因为index.php首先工作,captcha.php工作第二。 在index.php打印其会话变量时,还没有调用captcha.php。 Index.php输出字符串<img src='captcha.php' />,但这只是一个字符串,而不是对captcha.php的调用。该字符串将进入浏览器,浏览器将在需要渲染图像时调用captcha.php。但是它会在index.php完成输出之后,因此它的会话变量不会受到影响。

要解决此问题,请将$_SESSION["vercode"] = rand(10000,99999);添加到index.php中,而不是添加到captcha.php中。这样,captcha.php将从index.php准备的会话中读取vercode,所有值都将匹配。

另外,请勿在索引中设置vercode,因为在用户发送验证码答案时您无需检查。只有在您收到用户回答或生成新验证码之前,才能取消设置(重置)。

此外,如果您在同一index.php中收到用户答案,则在这种情况下您无需重置验证码。类似的东西:

if (!empty($_POST)) {
    $vercode = $_SESSION["vercode"];
    // process user input...
} else {
    // reset vercode
    $_SESSION["vercode"] = rand(10000,99999);
}

答案 1 :(得分:0)

只是为了让您的代码能够进行最少的更改(这不是什么,我会在生产中使用)并说明问题: 的index.php:

<?php
session_start();
$_SESSION["vercode"] = rand(10000,99999);
session_write_close();
?>
<img src='captcha.php' />
<?php
var_dump($_SESSION['vercode']);
unset($_SESSION['vercode']);

captcha.php:

<?php
session_start(); 
$image = imagecreatefromjpeg("img/bg.jpg");
$txtColor = imagecolorallocate($image, 255, 255, 255);
imagestring($image, 5, 5, 5, $_SESSION["vercode"], $txtColor);
header("Content-type: image/jpeg");
imagejpeg($image);
imagedestroy($image);

问题:您打开会话两次。因此,当生成captcha.php中的新随机数时,$ _SESSION [&#34; vercode&#34;]的值在index.php中不会更改,因为该变量未从会话文件刷新(为此您必须使用session_write_close)。  =&GT;您可以看到var_dump始终打印先前生成的随机数。

答案 2 :(得分:-1)

如果您正在尝试创建验证码,请尝试使用

<?php
$ranStr = md5(microtime());
$ranStr = substr($ranStr, 0, 6);
?>
<img src="scripts/captcha.php?df='<?php echo $ranStr; ?>'" alt="captcha" width="102" height="53" />
          <input type="hidden" value="<?php echo $ranStr; ?>" name="cap" id="cap" />

这里是captcha.php

<?php 
session_start();
$ranStr= ltrim($_REQUEST['df']);
$image = imagecreatefromjpeg("images/bg.jpg");
$txtColor = imagecolorallocate($image, 0, 0, 0);
imagestring($image, 5, 5, 5, $ranStr, $txtColor);
header("Content-type: image/jpeg");
imagejpeg($image);
imagedestroy($image);
?>