免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 4557 | 回复: 7
打印 上一主题 下一主题

Session_start必须写在前面的苦恼 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-03-06 22:00 |只看该作者 |倒序浏览
PHP手册中说,Session_start()之前应没有任何输出,否则就出错。那么我现在想做一个用户登录的类,这个类中有很多函数涉及Session_start(),如:初始化用户登录函数,判断是否已经登录函数。那么我怎么写这个Session_start()它才能不报错呢?

有个现成的class可以看一下效果:

<?php

class operateLogin
{
                var $username; //用户名
                var $userpass; //密码
                var $userid; //用户id
                var $userlevel; //用户级别

                var $authtable="account"; //验证用数据表

                var $usecookie=true; //使用cookie保存sessionid
                var $cookiepath='/'; //cookie路径
                var $cookietime=3600*24*365; //cookie有效时间

                var $err_mysql="MySQL错误"; //mysql出错提示
                var $err_username="无效用户名"; //用户名无效提示
                var $err_user="无效用户"; //用户无效提示(被封禁)
                var $err_password="密码错误"; //密码错误提示

                var $err; //出错提示
                var $errorreport=false; //显示错误

                function Login($dbserv,$dbport,$dbuser,$dbpass,$dbname) { //构造函数,连接数据库
                                if(@mysql_pconnect($dbserv.":".$dbport,$dbuser,$dbpass)) {
                                                mysql_select_db($dbname);
                                } else {
                                                $this->errReport($this->err_mysql);
                                                $this->err=$this->err_mysql;
                                }
                }

                function isLoggedin() { //判断是否登录
                                if(isset($_COOKIE['sid'])) { //如果cookie中保存有sid
                                        session_start();
                                        session_id($_COOKIE['sid']);
                                        $this->username=$_SESSION['username'];
                                        $this->userid=$_SESSION['userid'];
                                        $this->userlevel=$_SESSION['userlevel'];
                                        return true;
                                } else { //如果cookie中未保存sid,则直接检查session
                                                session_start();
                                                if(isset($_SESSION['username'])) return true;
                                }
                                return false;
                }

                function userAuth($username,$userpass) {//用户认证
                                $this->username=$username;
                                $this->userpass=$userpass;
                                $query="select * from `".$this->authtable."` where `username`='$username';";
                                $result=mysql_query($query);
                                if(mysql_num_rows($result)!=0) { //找到此用户
                                                $row=mysql_fetch_array($result);
                                                if($row['bannd']==1) { //此用户被封禁
                                                                                $this->errReport($this->err_user);
                                                                                $this->err=$this->err_user;
                                                                                return false;
                                                } elseif(md5($userpass)==$row['userpass']){ //密码匹配
                                                                        $this->userid=$row['id'];
                                                                        $this->userlevel=$row['userlevel'];
                                                                        return true;
                                                } else { //密码不匹配
                                                                        $this->errReport($this->err_password);
                                                                        $this->err=$this->err_password;
                                                                        return false;
                                                }
                                } else { //没有找到此用户
                                                $this->errReport($this->err_username);
                                                $this->err=$this->err_username;
                                                return false;
                                }
                }

                function setSession() { //置session
                                $sid=uniqid('sid'); //生成sid
                                session_id($sid);
                                session_start();
                                $_SESSION['username']=$this->username; //给session变量赋值
                                $_SESSION['userid']=$this->userid; //..
                                $_SESSION['userlevel']=$this->userlevel; //..
                                if($this->use_cookie) { //如果使用cookie保存sid
                                        if(!setcookie('sid',$sid,time()+$this->cookietime,$this->cookiepath))
                                        $this->errReport("set cookie failed");
                                } else {
                                                setcookie('sid','',time()-3600*24*365); //清除cookie中的sid
                                }
                }

                function userLogout() { //用户注销
                                session_start();
                                unset($_SESSION['username']); //清除session中的username
                                if(setcookie('sid','',time()-3600*24*365)) //清除cookie中的sid
                                return true;
                                else
                                return false;
                }

                function errReport($str) { //报错
                                if($this->error_report)
                                echo "ERROR: $str";
                }
}

?>

[ 本帖最后由 fisherjams 于 2008-3-6 22:12 编辑 ]

论坛徽章:
1
技术图书徽章
日期:2013-12-05 23:25:45
2 [报告]
发表于 2008-03-06 22:41 |只看该作者
session.auto_start boolean
session.auto_start 指定会话模块是否在请求开始时自动启动一个会话。默认为 0(不启动)。

论坛徽章:
0
3 [报告]
发表于 2008-03-06 23:44 |只看该作者
谢谢了。
我测试下,回头贴结果。

论坛徽章:
0
4 [报告]
发表于 2008-03-07 12:08 |只看该作者
我用的Xampp,更改了 \$XAMPP$\PHP\php.ini中session.auto_start为1,结果重启Xampp的apache还是不行,phpinfo.php中一直显示这个值为off.

上网查了也一头雾水。有人能帮我吗?

论坛徽章:
0
5 [报告]
发表于 2008-03-07 13:39 |只看该作者
在文件最开头写上就可以了

论坛徽章:
0
6 [报告]
发表于 2008-03-07 14:40 |只看该作者
是在这个php文件的开头写session_start();然后下面的$_SESSION[]之前都不要写吗?我这样测试过,PHP5环境,报错了。

论坛徽章:
0
7 [报告]
发表于 2008-03-07 16:29 |只看该作者
每个文件上面都写呗...

论坛徽章:
0
8 [报告]
发表于 2008-03-07 21:14 |只看该作者
问题解决了,确实写在类里面是可以的,是因为引用的时候,在session_start()之前有输出,所以报错了。谢谢楼上几位热心肠子。。。。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP