首页 >后端开发 >php教程 >PHP验证码与session不同步

PHP验证码与session不同步

WBOY
WBOY原创
2016-06-23 14:23:191497浏览

本帖最后由 mclubing 于 2012-06-14 16:13:53 编辑

<?php	session_start();//将随机数存入session中	srand((double)microtime()*1000000);//播下一个生成随机数字的种子,以方便下面随机数生成的使用	$im = imagecreate(62,20); //制定图片背景大小	$black = ImageColorAllocate($im, 0,0,0); //设定三种颜色	$white = ImageColorAllocate($im, 255,255,255);	$gray = ImageColorAllocate($im, 200,200,200);	imagefill($im,0,0,$gray); //采用区域填充法,设定(0,0)	while(($authnum=rand()%100000)<10000);	$_SESSION['authnum']=$authnum;	//将四位整数验证码绘入图片	imagestring($im, 5, 10, 3, $authnum, $black);	// 用 col 颜色将字符串 s 画到 image 所代表的图像的 x,y 座标处(图像的左上角为 0, 0)。	//如果 font 是 1,2,3,4 或 5,则使用内置字体	for($i=0;$i<200;$i++) //加入干扰象素	{		$randcolor = ImageColorallocate($im,rand(0,255),rand(0,255),rand(0,255));		imagesetpixel($im, rand()%70 , rand()%30 , $randcolor);	}	Header("Content-type: image/PNG");	ImagePNG($im);	ImageDestroy($im);?>


下面是前端代码
<?php	session_start();?><!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><html>	<head>		<meta http-equiv="Content-Type" content="text/html; charset=gbk" />		<script type="text/javascript" src="./jquery-1.7.2.min.js"></script>		<script type="text/javascript">		</script>	</head>	<body>		<div id="main" style="position:absolute; top:22%; left:26%; width:600px; height:400px; background-color:#BCBCBC;">			<img alt="全球通" src="..." /><h2   style="max-width:90%">全球通俱乐部</h2>			<div style="position:absolute; top:19%; left:19%; width:400px; height:250px; background-color:#949494">				<h4 style="position:absolute; top:0%; left:25%;">全球通俱乐部会所后台</h4>				<div style="position:absolute; top:20%; left:14%; width:290px; height:160px;">					<form action="<{}>">						<table>							<tr>								<td style="text-align:right;">会所账号:</td>								<td><input name="username"/></td>							</tr>							<tr>								<td style="text-align:right;">密码:</td>								<td><input name="password" type="password"/></td>							</tr>							<tr>								<td style="text-align:right;">验证码:</td>								<td><input id="checkimg" name="checkcode" onkeyup="check()" style="width:60px"><img alt="点击可刷新"   style="max-width:90%" src="checkcode.php" onClick="this.src='checkcode.php'+'?a'+'='+new Date().getTime()"></img></td>							</tr>						</table>					</form>					<?php echo $_SESSION['authnum'];//这里的输出老慢一拍 ?>				</div>			</div>		</div>	</body></html>

回复讨论(解决方案)

真有意思,楼主这脑子把自己绕糊涂了吧。

你这个网页要session干什么?

验证码图片里有做SESSION,提交表单的页面用SESSION,你在这个页面里放个SESSION是想证明你一脑子浆糊吗。

不管楼主想有什么需求吧,先看看问题

while(($authnum=rand()%100000)     $_SESSION['authnum']=$authnum;
这就说明SESSION变量的赋值是有条件的,当你产生的随机数不满足条件时,authnum还是上一次保存下来的,但后面的代码依旧输出,所以输出的肯定不会同步。

PHP code


    session_start();//将随机数存入session中
    srand((double)microtime()*1000000);//播下一个生成随机数字的种子,以方便下面随机数生成的使用
    $im = imagecreate(62,20); //制定图片背景大小
    $black = ImageColorAlloca……

运行先后的问题。每次刷新取的都是上一次的 $authnum 自己琢磨就明白了。

好多混的.个别才是认真答题的.

明白楼主的意思了。

//  楼主是不是理解为  <td><input id="checkimg" name="checkcode" onkeyup="check()" style="width:60px"><img alt="点击可刷新"   style="max-width:90%" 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'];//这里的输出老慢一拍 ?>

明白楼主的意思了。PHP code

//  楼主是不是理解为
  

PHP验证码与session不同步 好的,我试一下.

引用 5 楼  的回复:

明白楼主的意思了。PHP code

//  楼主是不是理解为

PHP验证码与session不同步 还是一样。

前端代码
    session_start();//取得 session 变量值
....
echo $_SESSION['authnum'];//这里输出的是上面取到的
这个工作是在整个前端代码未到达浏览器时就已经完成了

PHP验证码与session不同步
中的 checkcode.php 是在浏览器读取图片时才访问的
很明显,checkcode.php 中产生的 session 数据要晚于你在页面显示的

前端代码
    session_start();//取得 session 变量值
....
echo $_SESSION['authnum'];//这里输出的是上面取到的
这个工作是在整个前端代码未到达浏览器时就已经完成了

PHP验证码与session不同步 如何解决?

我原来也碰过这个问题,后来解决了,但是不记得是改了哪里。

生成验证码yzm.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)     $_SESSION["chk_num"] = $chk_num;
    
    //将四位整数验证码绘入图片
    imagestring($im, 15, 5, 1,$chk_num , $white);//5, 5, 1分别表示为字体大小,左边距,上边距
    for($i=0;$i     {
        imagesetpixel($im, rand()%70 , rand()%30 , $gray);
    }
    ImagePNG($im);
    ImageDestroy($im);

?>

前台


验证码判断



我要评价:








请输入验证码:

PHP验证码与session不同步




error_reporting(0);

session_start();

if (isset($_POST['dosubmit']))
{
  if ($_POST['yzm'] == $_SESSION["chk_num"])
  {
    echo "
"."验证码正确";
  }
  else
  {
    echo "
"."验证码错误";
  }

}
?>






楼主可以对照一下,看下问题在哪里

应该是要把表单提交时获得正确的验证码

应该是要把表单提交时获得正确的验证码
我已经知道错在哪,但是我不知道怎么解决,错误原因是因为browser先加载完成html代码,然后再加载图片,所以会出现慢图片一拍的原因,因为图片是在session后面加载的.

引用 11 楼  的回复:

应该是要把表单提交时获得正确的验证码

我已经知道错在哪,但是我不知道怎么解决,错误原因是因为browser先加载完成html代码,然后再加载图片,所以会出现慢图片一拍的原因,因为图片是在session后面加载的.

你为什么需要知道当前图片的信息呢?你做验证码应该是验证输入的验证码和图片中的是否一致,只要提交表单就可以判断了,难道你不是这个需求?

mark明天上班看。

引用 14 楼  的回复:

引用 11 楼  的回复:

应该是要把表单提交时获得正确的验证码

我已经知道错在哪,但是我不知道怎么解决,错误原因是因为browser先加载完成html代码,然后再加载图片,所以会出现慢图片一拍的原因,因为图片是在session后面加载的.


你为什么需要知道当前图片的信息呢?你做验证码应该是验证输入的验证码和图片中的是否一致,只要提交表单就……
前台ajax

就是会慢一拍,是用错了,如果验证码在html页面中引用,而此时又用php输出,那么页面的就比php输出的快,这是用错了,
if($_SERVER["REQUEST_METHOD"] == "POST")
{
  
  echo "提交到服务器了" .$_SESSION["VerifyCode"] ."这是填写的".$_POST["getcode"];

这样就同步了,是html的验证码,和回发后的session相同。验证是否两者相等,这才对

也碰到了类似的问题,

    把表单验证信息提交到 另一个页面进行验证。不要在本页进行。

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn