php生成验证码问题,session错误?

fight_dream 发布于 2013/11/13 21:01
阅读 2K+
收藏 0
PHP
 

有两个页面 

  1. 注册页面               register.php       (页面1)
  2. 验证码生成页面     varify_code.php(页面2)

页面2中生成验证码,并保持到session中,在页面1中 用 <img src = "varify_code.php">引用验证码,可是我试着输出了一下session 每次都是上一张的值。

调试发现是先输出值,然后才显示图片。为什么会这样?怎么解决?

谢谢各位

代码较乱,欢迎拍砖 thx

register.php 关键代码在 43-48行

<?php
session_start();
if(isset($_SESSION['uname']))
{
    header("Location:my.php");
    exit;
}

?>
<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <link rel="stylesheet" type="text/css" href="css/style.css">
       <script type="text/javascript" src="js/jquery-1.10.2.min.js"></script>
         <!-- <script type="text/javascript" src="js/check.js"></script> -->
        <title> 注册</title>
    </head>
    <body>
        <fieldset>
            <legend> 注册</legend>
            <form method="post" action="registe.php" class="login-area">
                <p><label for="uname"> 用户名</label>
                <input type="text" name="uname" id="uname" ><span id = "check_name"> </span></p>
                <p> <label for="uemail">邮箱</label>
                <input type="email" name="uemail" id="uemail"></p>
                <p><label for="upassword"> 密码</label>
                <input type="password" name="upassword" id="upassword">
                <span class = "check_pwd"></span>
                </p>
                <p>
                    <label for="reupassword">重复密码</label>
                    <input type="password" name="reupassword" id="reupassword">
                    <span id = "pwdwrong"> 密码不一样</span>
                    <span id = "pwdright"> 密码一样</span>
                    <span id = "pwdnull"> 密码不能为空</span>
                </p>
                <input type="text" class="varify_code" name="varify_code">
                <span> <img src=></span>
                <input type="submit" name="submit" class="resubmit" >
            </form>
        </fieldset>

<script type="text/javascript">
    $("img").attr("src" , "varify_code.php");
var $_SESSION=<?php echo json_encode($_SESSION);?>;
alert($_SESSION["code"]);
 

        $(".resubmit").attr('disabled' , true);

                $().ready(check());
                var judge_name = null, judge_email, judge_password,
                judge_repassword;
                function check(){

                function check_all(){
                    // alert(1);
                    if((judge_name =='yes') && (judge_email =='yes') && (judge_repassword=="yes")){
                        $(".resubmit").attr('disabled' , false);
                    } else{
                        $(".resubmit").attr('disabled' , true);
                    }
                }

                    //检测用户名
                $("#uname").change(function(){
                    //检测用户名只能是字母、汉字、数字、下划线
                    var name = $("#uname").val();
                    var pat = /\W/;
                    judge_name = pat.test(name);
                    if(judge_name)
                    {
                        var check_name = $("#check_name");
                        check_name.html("用户名只能是字母汉字数字下划线");                        
                        judge_name = "no";
                        check_all();
                        return false;
                    }
                    else
                    {
                        judge_name = "yes";
                    }
                    //创建xmlHTTPRequest 对象
                    function CreatXmlHttp(){
                      var xmlhttp = null;
                      try{
                        xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
                      } catch(e){
                        try{
                          xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
                        } catch(E){
                          xmlhttp = new XMLHttpRequest();
                        }
                      }
                      return xmlhttp;
                    }

                    //通过ajax 取回数据 并显示
                    var ajax = null;
                    //var name = $("#uname").val();
                   
                    function show(){

                      ajax = new CreatXmlHttp();
                      ajax.open("get", "check_name.php?name=" + name + "&" + Math.random(), true);

                      // alert("check_name.php?name=" + name + "&" + Math.random());
                      
                      ajax.onreadystatechange = function() {
                         if(ajax.readyState == 4 && ajax.status)
                            {
                                var check_name = $("#check_name");
                                var data = ajax.responseText;
                                if(data == 'yes'){
                                    check_name.html("重复");
                                    judge_name = 'no';
                                    // check_all(); //作用于问题,放到show()后无法达到效果?
                                } else{
                                    check_name.html("可用");
                                    judge_name = 'yes';                     
                            }                   
                        }
                        check_all(); //注意调用位置,变量作用域问题
                      }
                     
                     ajax.send(null);
                    }
                    show();                
                });

                //检测邮箱地址是否可以  允许一个邮箱注册多个用户
                $("#uemail").change(function(){
                    judge_email = 'yes';
                    check_all();
                });

                //检测密码
                //长度>= 6 
                

                $("#upassword").keyup(function(){
                    var psdlong = $("#upassword").val().length;
                    // alert(psdlong);
                    if(psdlong < 6)
                    {
                        $(".check_pwd").html("<b> 密码长度最少六位</b>");
                        judge_password = '';
                    }
                    else
                    {
                        $(".check_pwd").html("ok");
                    }
                    // judge_password = 'yes';
                    check_all();
                });
                //检测密码是否重复
                $("#reupassword ,#upassword").keyup(function(){
                    var psdlong = $("#upassword").val().length;
                    if(psdlong >= 6 && !$("#reupassword").val() == '')
                    {
                            if($("#upassword").val() == $("#reupassword").val())
                        {
                            //密码匹配
                            $("#pwdright,#pwdwrong").css("display" , "none");                                                 
                            $("#pwdright").css("display", "inline"); 
                            judge_repassword = 'yes';                                            
                        }
                        else{
                            $("#pwdright,#pwdwrong").css("display" , "none");                             
                            $("#pwdwrong").css("display", "inline"); 
                            judge_repassword = '';
                        }    
                    }
                    
                    check_all();
                });
            }
        </script>
    </body>
</html>
       
varify_code.php

<?php
	class Imagecode{
		private $width ;
		private $height;
		private $counts;
		private $distrubcode;
		private $fonturl;
		private $session;
		function __construct($width = 120,$height = 30,$counts = 5,$distrubcode="1235467890qwertyuipkjhgfdaszxcvbnm",$fonturl="C:\Windows\Fonts\TektonPro-BoldCond.otf"){
			$this->width=$width;
			$this->height=$height;
			$this->counts=$counts;
			$this->distrubcode=$distrubcode;
			$this->fonturl=$fonturl;
			$this->session=$this->sessioncode();
			session_start();
			$_SESSION['code']=$this->session;
            //echo $_SESSION['code'];
		}
		
		 function imageout(){
			$im=$this->createimagesource();
			$this->setbackgroundcolor($im);
			$this->set_code($im);
			$this->setdistrubecode($im);
			ImageGIF($im);
			ImageDestroy($im); 
		}
		
		private function createimagesource(){
			return imagecreate($this->width,$this->height);
		}
		private function setbackgroundcolor($im){
			$bgcolor = ImageColorAllocate($im, rand(200,255),rand(200,255),rand(200,255));//背景颜色
			imagefill($im,0,0,$bgcolor);
		}
		private function setdistrubecode($im){
			$count_h=$this->height;
			$cou=floor($count_h*2);
			for($i=0;$i<$cou;$i++){
				$x=rand(0,$this->width);
				$y=rand(0,$this->height);
				$jiaodu=rand(0,360);
				$fontsize=rand(8,15);
				$fonturl=$this->fonturl;
				$originalcode = $this->distrubcode;
				$countdistrub = strlen($originalcode);
				$dscode = $originalcode[rand(0,$countdistrub-1)];
				$color = ImageColorAllocate($im, rand(40,140),rand(40,140),rand(40,140));
				imagettftext($im,$fontsize,$jiaodu,$x,$y,$color,$fonturl,$dscode);
			}
		}
		private function set_code($im){
				$width=$this->width;
				$counts=$this->counts;
				$height=$this->height;
				$scode=$this->session;
				$y=floor($height/2)+floor($height/4);
				$fontsize=rand(30,35);
				$fonturl="C:\Windows\Fonts\AdobeGothicStd-Bold.otf";//$this->fonturl;
				
				$counts=$this->counts;
				for($i=0;$i<$counts;$i++){
					$char=$scode[$i];
					$x=floor($width/$counts)*$i+8;
					$jiaodu=rand(-20,30);
					$color = ImageColorAllocate($im,rand(0,50),rand(50,100),rand(100,140));
                    imagettftext($im,$fontsize,$jiaodu,$x,$y,$color,$fonturl,$char);
				}
                   
			
		}
		private function sessioncode(){
				$originalcode = $this->distrubcode;
				$countdistrub = strlen($originalcode);
				$_dscode = "";
				$counts=$this->counts;
				for($j=0;$j<$counts;$j++){
					$dscode = $originalcode[rand(0,$countdistrub-1)];
                    $_dscode.=$dscode;
                }
                
				return $_dscode;
				
		}
	}
	Header("Content-type: image/GIF");
	$imagecode=new  Imagecode(160,50);
    $imagecode->imageout();
    //echo "<br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/>";
    //echo $_SESSION['set_code'];
    //echo 12;
?>

加载中
0
空白码生
空白码生
可能你输出的是上以此生成的验证码,代码贴出来,不然很难找错误
空白码生
空白码生
恩 ,你的程序没有错,只是页面加载的时候,js先执行了,验证码在js之后重新生成了,所以你的打印和新的验证码不一致,可以试着在后台进行打印调试,用echo打印验证码。不知我的回答对你有帮助没,见谅哈!
fight_dream
fight_dream
谢谢,代码已贴,有点乱。
0
Tuesday
Tuesday

可以这样操作session? 建议学习基础去.

=<?php echojson_encode($_SESSION);?>;

fight_dream
fight_dream
这个是在网上找到的,想的是用js把session值调出来。请问有什么更好的方法吗?谢谢。新手
0
cjp路人
cjp路人
session直接echo出来,不用经过转化成json
fight_dream
fight_dream
和这个关系不大好像
0
南湖船老大
南湖船老大

没细看,怎么看都像是 $("img").attr("src" , "varify_code.php");这句引起的。

目测这句只是赋值,但没起到发送请求的作用,session还是上次的,直到刷新了页面。

fight_dream
fight_dream
但是我赋一次值的时候就要请求一次呀。我也不是太明白了,能具体一下吗?谢谢
0
习家家天下
程序应该能正常工作,不需要任何调整。只不过你的调试语句(alert)显示的是上次的code,仅此而已。
因为register页面首先载入,这时,验证码还没生成。接下来载入verify_code,这时验证码才存入SESSION。
fight_dream
fight_dream
如果alert是上次的话,那么我的值也应该是上次的呀,那么我检测是否验证码正确也就会不对。我已经试了,确实这样。而且我又稍微改了一下,等到我出发一个事件是才获取session值,也就是生成图片后再取session可是还是错误。THX
返回顶部
顶部