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

[HELP] $_SESSION接收不到值是怎么回事呀

[复制链接]
发表于 2017-9-26 23:32:06 | 显示全部楼层 |阅读模式
用$_SESSION来做了一个对验证码输入是否正确的验证,但是在上一个方法里面定义了$_SESSION的值,在下面的方法里面$_SESSION的值却没有接收过来是怎么回事呀。。代码是这个样子的。求大神帮帮忙。
class Houtaidenglu extends CI_Controller
{
    public function index()
    {
      
        // $this->load->library('session');
        //定义一个验证码方法,这里我们使用CI框架自带的验证码辅助函数
        //首先载入辅助函数
         $this->load->helper('captcha');
        
         //自己定义一个总个数为4个字母数字组合的验证码
         //定义一个$ku 把验证码中要用到的字母和数字赋给$ku
        $ku = 'qwertyuiopasdfghjklzxcvbnm1234567890';
        //定义一个$word 暂时不赋给其值
        $word = '';
        //运用for循环,在$ku 中随机的取出4个字符,拼成一个验证码
        for($i=0;$i<1;$i++)
        {
            $word .= $ku[mt_rand(0,strlen($ku)-1)];
        }

        //进行配置,验证码的配置项需要用一个数组来接收
        $yanzhengma = array(
            'word' => $word,
            'img_path' => './captcha/', //定义图片存入的路径
            'img_url' => base_url().'/captcha/', //定义获取图片的路径
            'img_width' => 80,
            'img_height' => 25,
            'expiration' => 60 //定义验证码在文件夹保存的时间 以秒为单位
            
        );
        //创建验证码,把我们的配置项填入括号里,这里返回一个数组,用$ver接收
       $ver = create_captcha($yanzhengma);
        //判断session是否开启,如果没有开启,就使用session_start()进行开启
     // $this->load->library('session');
    if(!isset($_SESSION))
        {
                session_start();
        }
        $_SESSION['code'] = $ver['word'];

        $data['cap'] = $ver['image'];

        $this->load->view('admin/login.html',$data);
    }
        public function login_in()
        {
                $code = $this->input->post('captcha');
                if(!isset($_SESSION))
                {
                        session_start();
                }

                if(strtoupper($code) != $_SESSION['code'])
                {
                        echo"验证码错误";
                }
        }
   
   
}
发表于 2017-9-27 09:44:13 | 显示全部楼层
本帖最后由 wangyouworld 于 2017-9-27 10:55 编辑

1、首先确定 CI 的 session 扩展是否自动加载了。
2、确定下第37行,
PHP复制代码
if(!isset($_SESSION))
复制代码

在之前
PHP复制代码
var_dump($_SESSION)
复制代码
是什么内容?

如果是空值的话,不要使用,
PHP复制代码
复制代码
因为 PHP SESSION 机制和 CI 的SESSION机制略有不同

3、程序目录下,config/config.php 中,值是多少,
$config['sess_cookie_name'] = 'ci_session';

session_start();后,会生成一个名为,PHPSESSID的cookie,
而CI 的 session 扩展,生成的名为,$config['sess_cookie_name'] 指定的名称。


因为cookie名不同,因此,调取不到 SESSION内容。

发表于 2017-9-27 09:46:18 | 显示全部楼层
抱歉,CI 的验证码插件没用过

如果上述没解决问题,建议你一步一步调试看看,看哪个地方写入了 SESSION,哪个地方读取的时候没读取到。
 楼主| 发表于 2017-9-27 11:02:02 | 显示全部楼层
本帖最后由 哈喽小公主 于 2017-9-27 11:05 编辑

大神你好,我在37行之前加了 var_dump($_SESSION) 显示出来是有内容的
array(4) { ["__ci_last_regenerate"]=> int(1506480709) ["code"]=> string(1) "x" ["de"]=> string(1) "8" ["co"]=> string(1) "g" }


直接访问控制器  login_in ,查看$_SESSION里面也有也有内容
Array ( [__ci_last_regenerate] => 1506480709 [code] => x [de] => 8 [co] => g )

但是用表单点击登录跳转到 login_in去,就没有内容了。
Array (    [__ci_last_regenerate] => 1506481034 )

我的config/config.php 中  $config['csrf_cookie_name'] = 'csrf_cookie_name';
刚学CI没多久。。 在这个问题上卡了好久了。。求大神帮帮忙 。
发表于 2017-9-27 14:22:38 | 显示全部楼层
本帖最后由 wangyouworld 于 2017-9-27 14:25 编辑

时间戳,
2017/9/27 10:51:49
2017/9/27 10:57:14

SESSION 怎么会丢失呢?

在浏览器里,按 F12,调出调试工具,查看当前页面的 Cookie 信息,(如火狐的Firebug,有个Cookies选项卡,在里面可以看到 Cookie信息)
而Cookie名,即你定义的,$config['sess_cookie_name'] 。

你分别,在
直接访问控制器  login_in,看下 Cookie 都有哪些

但是用表单点击登录跳转到 login_in去,就没有内容了。,看下 Cookie 都有哪些

留意下,跨域问题,简单的说,确定访问的地址是否相同。
你手动打开的地址,和 提交表单登录跳转的地址,域名是否相同。
 楼主| 发表于 2017-9-27 16:16:39 | 显示全部楼层
直接访问控制器的Cookie是 2fob535g2cme5t06m0461l3ouvl5nbdl
在表单内点击登录的Cookie是 gs5grivnheor47gk29m171vun3hc44fo
两个不一样。。
对了大神,我可能晓得是什么原因了 当点击表单里面的登录的话,域名最前面的localhost变成了[::1],如果我把login_in前面的localhost改成[::1]的话也会报同样的错,但是这是为什么呀,localhost不是就代表[::1]的么。。而且我一点击登录就会变成[::1] ,这个要怎么改呀。。
 楼主| 发表于 2017-9-27 16:39:58 | 显示全部楼层
弄好了 哈哈哈哈哈哈哈哈,谢谢大神!。 上次没注意改了hosts文件里面的东西,结果搞忘了改回来。
 楼主| 发表于 2017-9-27 18:26:13 | 显示全部楼层
。。 还是不对,还是因为这个[::1]的问题,把[::1]手动改成localhost就没问题,但是点击登录按键域名自动就变成了[::1]。。 这个怎么破呀。。
发表于 2017-9-28 09:54:03 | 显示全部楼层
本帖最后由 wangyouworld 于 2017-9-28 09:56 编辑

程序目录,config/config.php 中 $config['base_url'] = '';,项看看值是什么,保证这个值和你域名是一样的。
| 如果没有设置,那么CodeIgniter会尝试猜测协议和路径
| 你的安装,但是由于安全考虑,主机名将被设置
| 到$ _SERVER ['SERVER_ADDR']如果可用,否则为localhost。
| 自动检测机制只是为了方便起见
| 不得在生产中使用!
|
| 如果您需要允许多个域名,请记住该文件仍然存在
| 一个PHP脚本,你可以轻松地做到这一点。

另外,表单提示时,你看下,POST地址是多少,如果存在域名的话,不建议使用域名,
直接为 /Login/save 类似的地址。
 楼主| 发表于 2017-9-28 10:29:56 | 显示全部楼层
恩恩,对的,确实是$config['base_url']没有设置的问题,按照大神说的去设置了就好了。谢谢啦。这次是真的解决这个问题了。 谢谢大神。嘿嘿嘿。

本版积分规则