haileCI 发表于 2011-3-23 16:49:02

关于$this? CI session 写入问题

1.在libraries中有个验证码类verify 里面的一个方法 public function code(){return $this->vCode}//返回验证码
在控制器common中 输出验证码:
function verify() {
      $this->load->library("Verify");//加载验证码类
      $verify = new Verify();//创建对象
      $verify->setCheckImageWH("60","20");//设置生成的验证码图片大小,145为宽度,20为高度
      $verify->outCheckImage();//输出图片
      $this->session->set_userdata('code',$verify->code());//问题:$verify->code()为空
    }
现在我只能在verify类中 输出图片的时候 写入session
请问这个原因是?
2.在APMs环境下,数据库带数字 如ci8cms 无法指定数据库。。。。但cicms又可以,请问跟ci有关系吗?
3.在CI中,总觉得类名和文件名的统一性很模糊,控制控制器加前缀时, 文件名又不需带前缀?

Hex 发表于 2011-3-26 23:57:09

Verify 不是 CI 自带的。CI 没有 Verify 这个类库。

haileCI 发表于 2011-3-28 14:37:09

回复 2# Hex


    Verify是自定义类 放在library

Hex 发表于 2011-3-28 14:40:29

verify 类库有问题吧。贴一下代码。

haileCI 发表于 2011-3-28 14:50:58

回复 4# Hex


    <?php if (!defined('BASEPATH')) exit('No direct script access allowed');
/**
* 驗證碼生成
*author:haile
*/

class Verify {
//验证码位数
    private $vCheckCodeNum   = 4;

//产生的验证码
    private $vCheckCode    = '';

//验证码的图片
    private $vCheckImage   = '';

//干扰像素
    private $vDisturbColor   = '';

//验证码的图片宽度
    private $vCheckImageWidth = '80';

//验证码的图片宽度
    private $vCheckImageHeight   = '20';

    /**
   *
   * @brief   产生验证码
   *
   */
    private function createCheckCode() {
      $this->vCheckCode = strtolower(substr(md5(rand()),0,$this->vCheckCodeNum));
      return $this->vCheckCode;
    }

    /**
   *
   * @brief   产生验证码图片
   *
   */
    private function createVerifyImage() {
      $this->vCheckImage = @imagecreate ($this->vCheckImageWidth,$this->vCheckImageHeight);
      imagecolorallocate ($this->vCheckImage, 255, 255, 255);
      return $this->vCheckImage;
    }

    /**
   *
   * @brief   设置图片的干扰像素
   *
   */
    private function setDisturbColor() {
      for ($i=0;$i<=128;$i++) {
            $this->vDisturbColor = imagecolorallocate ($this->vCheckImage,255, 255, 255);
            imagesetpixel($this->vCheckImage,rand(2,128),rand(2,38),$this->vDisturbColor);
         
      }
    }

    /**
   *
   * @brief   设置验证码图片的大小
   *
   * @param   $width   宽
   *
   * @param   $height 高
   *
   */

    public function setCheckImageWH($width,$height) {
      if($width==''||$height=='')return false;
      $this->vCheckImageWidth   = $width;
      $this->vCheckImageHeight = $height;
      return true;
    }

    /**
   *
   * @brief   在验证码图片上逐个画上验证码
   *
   */
    private function writeCheckCodeToImage() {
      for ($i=0;$i<$this->vCheckCodeNum;$i++) {
            $bg_color = imagecolorallocate ($this->vCheckImage, rand(0,255), rand(0,128), rand(0,255));
            $x = floor($this->vCheckImageWidth/$this->vCheckCodeNum)*$i+3;
            $y = rand(0,$this->vCheckImageHeight-15);
            imagechar ($this->vCheckImage, 5, $x, $y, $this->vCheckCode[$i], $bg_color);
      }
    }
    /**
   *
   * @brief   输出验证码图片
   *
   */
    public function outCheckImage() {
      
      $this ->createCheckCode();
      $this ->createVerifyImage();
      $this ->setDisturbColor();
      $this ->writeCheckCodeToImage();
      $this ->writeCheckCodeToSession();
      header('Content-Type:image/jpeg');
      imagejpeg($this->vCheckImage);
    }

    public function writeCheckCodeToSession()
    {
      $ci =& get_instance();
      $ci->session->set_userdata('verifycode',$this->vCheckCode);//本想在控制器才写入session 但返回不了code 只好在这里 在输出图片之前写入session
    }
    public function code()
    {
       return $this->vCheckCode;//这个原是想 在控制器应用到session的 但没有效果控制器里面得到是null,我只好增加 function writeCheckCodeToSession 在这个类里面
    }
}
?>
页: [1]
查看完整版本: 关于$this? CI session 写入问题