Heim >Backend-Entwicklung >PHP-Tutorial >PHP验证码与session不同步

PHP验证码与session不同步

WBOY
WBOYOriginal
2016-06-23 14:23:191498Durchsuche

本帖最后由 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相同。验证是否两者相等,这才对

也碰到了类似的问题,

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

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn