用户
 找回密码
 入住 CI 中国社区
搜索
查看: 11925|回复: 10
收起左侧

[已解决] session获取不到图片验证码的值

[复制链接]
发表于 2011-10-1 18:04:35 | 显示全部楼层 |阅读模式
本帖最后由 飞雪残剑 于 2011-10-7 20:19 编辑

             这是我从咱们社区下载下来的代码,想学习一下,可是当我在调试验证码模块的时候,不知怎么验证码总是不能写入到session里,希望各位大大帮小弟看看问题出在哪里了
          这是我application/controller/admin/admin.php控制器里的内容:
         
PHP复制代码
 
 <?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
 
class Admin extends CI_Controller
{
    public function __construct()
    {
        parent::__construct();
        $this->load->helper(array('form', 'url'));
        $this->load->library('session');
    }
   
    function index()
    {
        $temp['xinxi']="";
        $temp['old'] = "";
        $temp['new'] ="";
        $this->load->view('admin/login',$temp);
    }
   
    function yzm()
    {
        $conf['name']='yzm';
        $this->load->library('captcha_code',$conf);
        $this->captcha_code->show();
    }
   
    function check_login()
    {
        $yzm=$this->input->post('CheckCode');
        $username=$this->input->post('UserName');
        $userpass=$this->input->post('Password');
        $yzm_session=$this->session->userdata('yzm');
        if($yzm==$yzm_session)
        {
            $where['username']=$username;
            $where['userpass']=sha1($userpass);
            $table="admin";
            $query=$this->db->get_where($table,$where);
            $num=$query->num_rows();
            if($num>0)
            {
                $this->session->set_userdata(array('manager'=>$username));
                $this->session->unset_userdata('yzm');
                redirect('admin_login/main');
            }
            else
            {
                $temp['xinxi']="用户名密码错误";
                $this->load->view('admin/login',$temp);
            }
        }
        else
        {
            $temp['old'] = $yzm;
            $temp['new'] = $yzm_session;
            $temp['xinxi']="验证码输入错误";
            $this->load->view('admin/login',$temp);
        }
    }
   
    function login_out()
    {
        $this->session->unset_userdata('manager');
        redirect('admin/');
    }
}
>
         
复制代码

这是我application/libraries/Captcha_code.php   验证码类的代码
PHP复制代码
 
<?php
class Captcha_code
{
    var $width='60';
    var $num='4';
    var $height='20';
    var $name='randcode';
 
    public function __construct($conf="")
    {
        if($conf!="")
        {
            foreach($conf as $key=>$value)
            {
                $this->$key=$value;
            }
        }
    }
   
    function show()
    {
        Header("Content-type: image/gif");
        /*
        * 初始化
        */

        $border = 0; //是否要边框 1要:0不要
        $how = $this->num; //验证码位数
        $w = $this->width; //图片宽度
        $h = $this->height; //图片高度
        $fontsize = 5; //字体大小
        $alpha = "abcdefghijkmnopqrstuvwxyz"; //验证码内容1:字母
        $number = "023456789"; //验证码内容2:数字
        $randcode = ""; //验证码字符串初始化
        srand((double)microtime()*1000000); //初始化随机数种子
       
        $im = ImageCreate($w, $h); //创建验证图片
       
        /*
        * 绘制基本框架
        */

        $bgcolor = ImageColorAllocate($im, 255, 255, 255); //设置背景颜色
        ImageFill($im, 0, 0, $bgcolor); //填充背景色
        if($border)
        {
            $black = ImageColorAllocate($im, 0, 0, 0); //设置边框颜色
            ImageRectangle($im, 0, 0, $w-1, $h-1, $black);//绘制边框
        }
       
        /*
        * 逐位产生随机字符
        */

        for($i=0; $i<$how; $i++)
        {  
            $alpha_or_number = mt_rand(0, 1); //字母还是数字
            $str = $alpha_or_number ? $alpha : $number;
            $which = mt_rand(0, strlen($str)-1); //取哪个字符
            $code = substr($str, $which, 1); //取字符
            $j = !$i ? 4 : $j+15; //绘字符位置
            $color3 = ImageColorAllocate($im, mt_rand(0,100), mt_rand(0,100), mt_rand(0,100)); //字符随即颜色
            ImageChar($im, $fontsize, $j, 3, $code, $color3); //绘字符
            $randcode .= $code; //逐位加入验证码字符串
        }
       
        /*
        * 添加干扰
        */

        for($i=0; $i<5; $i++)//绘背景干扰线
        {  
            $color1 = ImageColorAllocate($im, mt_rand(0,255), mt_rand(0,255), mt_rand(0,255)); //干扰线颜色
            ImageArc($im, mt_rand(-5,$w), mt_rand(-5,$h), mt_rand(20,300), mt_rand(20,200), 55, 44, $color1); //干扰线
        }  
        for($i=0; $i<$how*15; $i++)//绘背景干扰点
        {  
            $color2 = ImageColorAllocate($im, mt_rand(0,255), mt_rand(0,255), mt_rand(0,255)); //干扰点颜色
            ImageSetPixel($im, mt_rand(0,$w), mt_rand(0,$h), $color2); //干扰点
        }
       
        //把验证码字符串写入session
       
        //$this->session->set_userdata(array($this->name=>$randcode));
       
        $_SESSION[$this->name]=$randcode;
        /*绘图结束*/
        Imagegif($im);
        ImageDestroy($im);
        /*绘图结束*/
    }
}
?>
 
复制代码

这是我application/views/admin/login.php 视图的代码
PHP复制代码
 
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML><HEAD><TITLE>管理员登录</TITLE>
<base href="<?=base_url()?>" />
<META http-equiv=Content-Type content="text/html; charset=gb2312">
<LINK href="images/admin/southidc.css" rel=stylesheet>
<SCRIPT language=javascript>
<!--
function SetFocus()
{
if (document.Login.UserName.value=="")
    document.Login.UserName.focus();
else
    document.Login.UserName.select();
}
function CheckForm()
{
    if(document.Login.UserName.value=="")
    {
        alert("请输入用户名!");
        document.Login.UserName.focus();
        return false;
    }
    if(document.Login.Password.value == "")
    {
        alert("请输入密码!");
        document.Login.Password.focus();
        return false;
    }
    if (document.Login.CheckCode.value==""){
       alert ("请输入您的验证码!");
       document.Login.CheckCode.focus();
       return(false);
    }
}
 
 
//-->
 
</SCRIPT>
<script type="text/javascript">
function reloadCode() {
 var Pnk = document.getElementById("checkCodeImg");
 nk.src = "<?php echo site_url('admin/admin/yzm')?>?tempstr=" + Math.random();
}
</script>
<STYLE type=text/css>.STYLE2 {
    COLOR: #cccccc
}
.STYLE3 {
    FONT-WEIGHT: bold; FONT-SIZE: 14px
}
</STYLE>
 
<META content="MSHTML 6.00.2900.6058" name=GENERATOR></HEAD>
<BODY class=bgcolor bgColor=#fffff6>
<> </P>
<?php echo form_open('admin/admin/check_login',array('onSubmit'=>'return CheckForm();','target'=>'_parent','name'=>'Login'));?>
 
<TABLE cellSpacing=0 cellPadding=0 align=center border=0>
  <TBODY>
  <TR>
    <TD><IMG height=46 alt=网站管理系统 src="images/admin/login_r.gif" width=515
      border=0></TD></TR>
  <TR>
    <TD vAlign=top background=images/admin/login_l.gif height=211>
      <TABLE cellSpacing=5 cellPadding=0 width="60%" align=right border=0>
        <TBODY>
        <TR align=middle>
          <TD colSpan=2 height=38><SPAN class=STYLE3><FONT color=#000000>管 理 员
            登 录</FONT></SPAN> </TD></TR>
        <TR>
          <TD align=right><B>用户名称:</B></TD>
          <TD><INPUT id=UserName4
           
            style="BORDER-RIGHT: 1px solid; PADDING-RIGHT: 4px; BORDER-TOP: 1px solid; PADDING-LEFT: 4px; PADDING-BOTTOM: 1px; BORDER-LEFT: 1px solid; WIDTH: 160px; PADDING-TOP: 1px; BORDER-BOTTOM: 1px solid"
           
            maxLength=20
            name=UserName></TD></TR>
        <TR>
          <TD align=right><B>用户密码:</B></TD>
          <TD><INPUT
            style="BORDER-RIGHT: 1px solid; PADDING-RIGHT: 4px; BORDER-TOP: 1px solid; PADDING-LEFT: 4px; PADDING-BOTTOM: 1px; BORDER-LEFT: 1px solid; WIDTH: 160px; PADDING-TOP: 1px; BORDER-BOTTOM: 1px solid"
           
            type=password
            maxLength=20 name=Password></TD></TR>
        <TR>
          <TD align=right><B>验 证 码:</B></TD>
          <TD><INPUT
            style="BORDER-RIGHT: 1px solid; PADDING-RIGHT: 4px; BORDER-TOP: 1px solid; PADDING-LEFT: 4px; PADDING-BOTTOM: 1px; BORDER-LEFT: 1px solid; PADDING-TOP: 1px; BORDER-BOTTOM: 1px solid"
           
            maxLength=4 size=6
            name=CheckCode id="CheckCode">            <a href="javascript:reloadCode();"><img src="<?php echo site_url('admin/admin/yzm');?>" name="checkCodeImg" id="checkCodeImg" border="0" /></a></TD>
        </TR>
        <TR>
          <TD colSpan=2><span style="color:#FF0000"><?php echo $xinxi;?><br /> <?php echo "输入的验证码:".$old;?><br /><?php echo "生成的验证码:".$new;?></span></TD>
        </TR>
        <TR>
          <TD colSpan=2>
            <DIV align=center><INPUT style="BORDER-RIGHT: #e1f4ee 1px solid; BORDER-TOP: #e1f4ee 1px solid; FONT-SIZE: 9pt; BORDER-LEFT: #e1f4ee 1px solid; WIDTH: 60px; COLOR: #000000; BORDER-BOTTOM: #e1f4ee 1px solid; HEIGHT: 19px; BACKGROUND-COLOR: #e1f4ee" type=submit value=" 确 认 " name=Submit>
              <INPUT id=reset style="BORDER-RIGHT: #e1f4ee 1px solid; BORDER-TOP: #e1f4ee 1px solid; FONT-SIZE: 9pt; BORDER-LEFT: #e1f4ee 1px solid; WIDTH: 60px; COLOR: #000000; BORDER-BOTTOM: #e1f4ee 1px solid; HEIGHT: 19px; BACKGROUND-COLOR: #e1f4ee" type=reset value=" 清 除 " name=reset>
            <BR></DIV></TD></TR>
        <TR>
        <TD colSpan=2> </TD></TR></TBODY></TABLE></TD></TR></TBODY></TABLE><BR>
<TABLE cellSpacing=0 cellPadding=0 width="75%" align=center border=0>
  <TBODY>
  <TR>
    <TD> </TD></TR>
  <TR>
    <TD> </TD></TR>
  <TR>
    <TD></TD></TR></TBODY></TABLE>
< align=center><BR></P></FORM>
<SCRIPT language=JavaScript type=text/JavaScript>
CheckBrowser();
SetFocus();
</SCRIPT>
</BODY>
</HTML>
 
复制代码

1.jpg

2.jpg
生成的验证码不知怎么回事总是不能写入session里,请各位大大帮忙给看看,小弟感激不尽{:soso_e183:}{:soso_e183:}{:soso_e183:}
发表于 2011-10-2 17:30:27 | 显示全部楼层
你图片验证码的session使用的是php的原生Session,如下:

PHP复制代码
$_SESSION[$this->name]=$randcode;
 
复制代码

而CI默认的session库采用的是cookie或者数据库存储session值,实现上与php原生session不一样。

解决方案就二:

方案一(推荐):修改验证码库里面的session机制,将上述代码改成:

PHP复制代码
 
$CI = & get_instance();
$CI->session->set_userdata($this->name, $randcode);
 
复制代码


方案二(不推荐):修改获取图片中的代码session至原生session机制,如下:

PHP复制代码
session_start();
$code = $_SESSION['captcha'];
 
复制代码

发表于 2011-10-2 17:31:41 | 显示全部楼层
输出SESSION看看咯
发表于 2011-10-2 17:32:10 | 显示全部楼层
你的SESSION是使用COOIKE还是数据库的呀
 楼主| 发表于 2011-10-7 16:18:17 | 显示全部楼层
非常不好意思,这几天都不在,今天才刚刚上来,按照 saturn 方法修改就可以实现了,非常感谢 saturn
 楼主| 发表于 2011-10-7 16:20:49 | 显示全部楼层
~夜行侠~ 发表于 2011-10-2 17:32
你的SESSION是使用COOIKE还是数据库的呀

当时就是输出的session为空呀,貌似不是用的数据库的吧,不过现在已经解决了,也非常感谢 ~夜行侠~ 的热情帮助,谢谢谢谢
发表于 2011-11-2 20:42:38 | 显示全部楼层
学习下。坐等大家回答
发表于 2011-11-21 15:00:49 | 显示全部楼层
飞雪残剑 发表于 2011-10-7 16:18
非常不好意思,这几天都不在,今天才刚刚上来,按照 saturn 方法修改就可以实现了,非常感谢 saturn :victo ...

验证码那个我按他的改了还不好用啊
发表于 2012-4-17 08:51:15 | 显示全部楼层
学习一下,呵呵
发表于 2012-8-7 06:47:27 | 显示全部楼层
谢谢了啊。可以了2.10的版本

本版积分规则