PHP验证码与session不同步 本帖最后由 mclubing 于 2012-06-14 16:13:53 编辑 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 真有意思,楼主这脑子把自己绕糊涂了吧。你这个网页要session干什么?验证码图片里有做SESSION,提交表单的页面用SESSION,你在这个页面里放个SESSION是想证明你一脑子浆糊吗。 不管楼主想有什么需求吧,先看看问题while(($authnum=rand()%100000)<10000); $_SESSION['authnum']=$authnum;这就说明SESSION变量的赋值是有条件的,当你产生的随机数不满足条件时,authnum还是上一次保存下来的,但后面的代码依旧输出,所以输出的肯定不会同步。 运行先后的问题。每次刷新取的都是上一次的 $authnum 自己琢磨就明白了。 明白楼主的意思了。// 楼主是不是理解为 <td><input id="checkimg" name="checkcode" onkeyup="check()" style="width:60px"><img alt="点击可刷新" style="cursor:pointer; position:absolute; top:35%; left:55%;" src="checkcode.php" onClick="this.src='checkcode.php'+'?a'+'='+new Date().getTime()"></img></td>//此td先执行,那么肯定session 也改变了。然后 <?php echo $_SESSION['authnum'];//这里的输出老慢一拍 ?>//上面session肯定也是td里的session//------------------------------------------------------//其实你可以做个测试,按你的理解,td上面放 echo session和下面放 echo session 肯定是不一样的//那么你在td上面也放一个,看看他们是否不一致。<?php echo $_SESSION['authnum'];//这里的输出老慢一拍 ?> 前端代码 session_start();//取得 session 变量值....echo $_SESSION['authnum'];//这里输出的是上面取到的这个工作是在整个前端代码未到达浏览器时就已经完成了而<img alt="点击可刷新" style="cursor:pointer; position:absolute; top:35%; left:55%;" src="checkcode.php" onClick="this.src='checkcode.php'+'?a'+'='+new Date().getTime()"></img>中的 checkcode.php 是在浏览器读取图片时才访问的很明显,checkcode.php 中产生的 session 数据要晚于你在页面显示的 我原来也碰过这个问题,后来解决了,但是不记得是改了哪里。生成验证码yzm.php<?php //生成验证码图片 session_start(); Header("Content-type: image/gif"); srand((double)microtime()*1000000); $im = imagecreate(50,25);//设置图片的宽与高 $black = ImageColorAllocate($im, 0,0,0);//设置背景颜色 $white = ImageColorAllocate($im, 255,255,255);//设置文字颜色 $gray = ImageColorAllocate($im, 200,200,200);//干扰颜色 imagefill($im,50,25,$gray); while(($chk_num=rand()%10000)<1000); $_SESSION["chk_num"] = $chk_num; //将四位整数验证码绘入图片 imagestring($im, 15, 5, 1,$chk_num , $white);//5, 5, 1分别表示为字体大小,左边距,上边距 for($i=0;$i<100;$i++) //加入干扰象素 { imagesetpixel($im, rand()%70 , rand()%30 , $gray); } ImagePNG($im); ImageDestroy($im);?>前台<html><head><title>验证码判断</title></head><body><form method="post" action="yanzhengma.php"><h3><span>我要评价:</span></h3><input type="hidden" name="guestbook[username]" id="guestbook[username]" value="{$title}" /><input type="hidden" value="{$contentid}" name="guestbook[title]" id="guestbook[title]"/><textarea name="guestbook[content]" cols="80" rows="7" class="text" id="contentid"></textarea><br>请输入验证码:<input type="text" name="yzm" id="yzm" ><img src="yzm.php" id="checkcode" onClick="this.src='yzm.php?id='+Math.random()*5;" style="cursor:pointer;" alt="验证码,看不清楚?请点击刷新验证码" align="absmiddle"/><br><input type="submit" name="dosubmit" value="提交"/> <input type="reset" value="重置"/><?phperror_reporting(0);session_start();if (isset($_POST['dosubmit'])){ if ($_POST['yzm'] == $_SESSION["chk_num"]) { echo "<br>"."验证码正确"; } else { echo "<br>"."验证码错误"; }}?></form></body></html>楼主可以对照一下,看下问题在哪里 我已经知道错在哪,但是我不知道怎么解决,错误原因是因为browser先加载完成html代码,然后再加载图片,所以会出现慢图片一拍的原因,因为图片是在session后面加载的. 就是会慢一拍,是用错了,如果验证码在html页面中引用,而此时又用php输出,那么页面的就比php输出的快,这是用错了, if($_SERVER["REQUEST_METHOD"] == "POST") { echo "提交到服务器了" .$_SESSION["VerifyCode"] ."这是填写的".$_POST["getcode"]; } 这样就同步了,是html的验证码,和回发后的session相同。验证是否两者相等,这才对 lamp 开发流媒体问题 php如何取得上一次与mysql的连接 怎么配置mysql+php+apache在WIN2003下?? 关于这个字符串转数组,有什么好办法 请问一个数组的问题 数字最多12位吗?如何让小数点后面多几位? 如何在PHP程序中实现连续播放MP3 不能注册变量 能不能用一个file控件就可以实现多图上传? 关于facebook第三方登录问题 在线等!!!! 请问这个字符串里的空白字符是什么编码? 用"\s"替换不了 求正则匹配字母
$_SESSION['authnum']=$authnum;
这就说明SESSION变量的赋值是有条件的,当你产生的随机数不满足条件时,authnum还是上一次保存下来的,但后面的代码依旧输出,所以输出的肯定不会同步。
// 楼主是不是理解为
<td><input id="checkimg" name="checkcode" onkeyup="check()" style="width:60px"><img alt="点击可刷新" style="cursor:pointer; position:absolute; top:35%; left:55%;" src="checkcode.php" onClick="this.src='checkcode.php'+'?a'+'='+new Date().getTime()"></img></td>//此td先执行,那么肯定session 也改变了。然后
<?php echo $_SESSION['authnum'];//这里的输出老慢一拍 ?>
//上面session肯定也是td里的session
//------------------------------------------------------
//其实你可以做个测试,按你的理解,td上面放 echo session和下面放 echo session 肯定是不一样的//那么你在td上面也放一个,看看他们是否不一致。
<?php echo $_SESSION['authnum'];//这里的输出老慢一拍 ?>
session_start();//取得 session 变量值
....
echo $_SESSION['authnum'];//这里输出的是上面取到的
这个工作是在整个前端代码未到达浏览器时就已经完成了
而
<img alt="点击可刷新" style="cursor:pointer; position:absolute; top:35%; left:55%;" src="checkcode.php" onClick="this.src='checkcode.php'+'?a'+'='+new Date().getTime()"></img>
中的 checkcode.php 是在浏览器读取图片时才访问的
很明显,checkcode.php 中产生的 session 数据要晚于你在页面显示的
session_start();
Header("Content-type: image/gif");
srand((double)microtime()*1000000);
$im = imagecreate(50,25);//设置图片的宽与高
$black = ImageColorAllocate($im, 0,0,0);//设置背景颜色
$white = ImageColorAllocate($im, 255,255,255);//设置文字颜色
$gray = ImageColorAllocate($im, 200,200,200);//干扰颜色
imagefill($im,50,25,$gray);
while(($chk_num=rand()%10000)<1000);
$_SESSION["chk_num"] = $chk_num;
//将四位整数验证码绘入图片
imagestring($im, 15, 5, 1,$chk_num , $white);//5, 5, 1分别表示为字体大小,左边距,上边距
for($i=0;$i<100;$i++) //加入干扰象素
{
imagesetpixel($im, rand()%70 , rand()%30 , $gray);
}
ImagePNG($im);
ImageDestroy($im);?>前台
<html>
<head>
<title>验证码判断</title>
</head>
<body>
<form method="post" action="yanzhengma.php">
<h3><span>我要评价:</span></h3><input type="hidden" name="guestbook[username]" id="guestbook[username]" value="{$title}" />
<input type="hidden" value="{$contentid}" name="guestbook[title]" id="guestbook[title]"/>
<textarea name="guestbook[content]" cols="80" rows="7" class="text" id="contentid"></textarea><br>请输入验证码:<input type="text" name="yzm" id="yzm" ><img src="yzm.php" id="checkcode" onClick="this.src='yzm.php?id='+Math.random()*5;" style="cursor:pointer;" alt="验证码,看不清楚?请点击刷新验证码" align="absmiddle"/><br>
<input type="submit" name="dosubmit" value="提交"/>
<input type="reset" value="重置"/><?php
error_reporting(0);session_start();if (isset($_POST['dosubmit']))
{
if ($_POST['yzm'] == $_SESSION["chk_num"])
{
echo "<br>"."验证码正确";
}
else
{
echo "<br>"."验证码错误";
}}
?></form>
</body>
</html>
楼主可以对照一下,看下问题在哪里
if($_SERVER["REQUEST_METHOD"] == "POST")
{
echo "提交到服务器了" .$_SESSION["VerifyCode"] ."这是填写的".$_POST["getcode"];
}
这样就同步了,是html的验证码,和回发后的session相同。验证是否两者相等,这才对