月度归档 2015年2月25日

通过清心醉

PHP无法跨页获取$_SESSION值

作者利用新年休息时间在模拟控制器的OOP思想来写个小论坛。结果做到登陆这一块的时候,因为保存的$_SESSION[“user”]值一直无法获取,网上的也是过时的教程。

先来说说作者产生问题的点吧:

作者在安装的配置文件实例了PDO的连接,并且存放在$_SESSION里。用户登陆的时候,也是存在了$_SESSION里。

因为PDO连接是被包含的,SESSION值是存在的(但在SESSION临时目录里是看不到),而且用户登陆之后,是实实在在存在SESSION的值。

总的来说,第一就是检查使用session_start()启动。

不过现在的apache默认都是打开了的。直接可以$_SESSION,一个动态网站,没有SESSION/COOKIE的会话,能叫网站吗?

第二就是针对LINUX系统的,phpinfo()看下SESSION的目录位置,检查下权限,最简单的就是测试赋个值给SESSION,看目录下是否会生成文件,如果不行权限开755吧。

还有一个估计就是和作者一样,使用方法的不当。作者的小OOP框架(最简单的MVC分层)从开写到问题解决都有,自学的朋友有需要的可以直接留言作者。

通过清心醉

PHP同步邮箱及用户名登陆的方法思路

首先假设我们有个user表,里面包含user,password,email主要3个字段
class loginModel extends BBS_SYSTEM
{
private $user;private $password; #用于接收POST过来的参数
protected $login_type; #登陆类型

private $mailtype; #邮件类型判断
protected function email_type($email) #判断邮件格式
{
$this->mailtype=$email;        /*
PHP5.3版本前使用以下语句
if(!ereg(“^([a-zA-Z0-9_-])+@([a-zA-Z0-9_-])+(.[a-zA-Z0-9_-])+”,$this->mailtype))
*/

if(preg_match(“/^([a-zA-Z0-9_-])+@([a-zA-Z0-9_-])+(.[a-zA-Z0-9_-])+/”,$this->mailtype))
//PHP5.3以后版本方法,可以自己写个方法判断PHP的版本来调用.
{
return true;
}
else
{
return false;
}

}

public function login()
{
$this->user=@$_POST[“user_name”];$this->password=@$_POST[“user_passwd”];
#有GET或者POST的最好带个@,否则人家刷新页面数据不存在,会报错,目录会暴光.
$login_type;
#根据帐户的类型来判断用户登陆时要用用户字段还是邮件字段
if ($this->email_type($this->user)) #判断用户是否使用EMAIL登陆
{
$login_type=’mail’;  #为用户登陆的类型字段赋值
}
else
{
$login_type=’user’;
}

$sql=”SELECT *FROM user”; #必须是通过审核了的用户.
foreach ( $this->pdo->query($sql) as $login) #提取SQL数据

{
if (($this->user==$login[$login_type])&&(md5($this->password)==$login[‘password’])&&$login[‘yesno’]==1)
{   #如果帐号和MD5加密后的密码正确
if ($login_type==’mail’) #生成邮件登陆的方式给视图调用,提示用户使用的登陆方式.
{
$this->login_type=”邮件”;
}

else
{
$this->login_type=”用户名”;
}
$_SESSION[“user”]=$this->user;
$this->view(‘login’);
}

else

{                 $this->view(‘error’);             }         }

}

}

 

通过清心醉

PHP使用fopen()方法的文件控制说明

比如需要创建配置文件:

$file = ‘config.php’;
$fopen=fopen($file,’wb’);

在这会混乱的是,’wb’是干什么用的?什么时候要用?

r 以只读方式打开文件,该文件必须存在。
r+ 以可读写方式打开文件,该文件必须存在。
rb+ 读写打开一个二进制文件,允许读写数据,文件必须存在。
w 打开只写文件,若文件存在则文件长度清为0,即该文件内容会消失。若文件不存在则建立该文件。
w+ 打开可读写文件,若文件存在则文件长度清为零,即该文件内容会消失。若文件不存在则建立该文件。
a 以附加的方式打开只写文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾,即文件原先的内容会被保留。(EOF符保留)
a+ 以附加方式打开可读写的文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾后,即文件原先的内容会被保留。 (原来的EOF符不保留)
wb 只写打开或新建一个二进制文件;只允许写数据。
wb+ 读写打开或建立一个二进制文件,允许读和写。
ab+ 读写打开一个二进制文件,允许读或在文件末追加数据。
上述的形态字符串都可以再加一个b字符,如rb、w+b或ab+等组合,加入b 字符用来告诉函数库以二进制模式打开文件。如果不加b,表示默认加了t,即rt,wt,其中t表示以文本模式打开文件。由fopen()所建立的新文件会具有S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH(0666)权限,此文件权限也会参考umask值。
有些C编译系统可能不完全提供所有这些功能,有的C版本不用”r+”,”w+”,”a+”,而用”rw”,”wr”,”ar”等,读者注意所用系统的规定。

 

通过清心醉

PHP全局变量的使用

<?php
echo “全局变量的使用”.”</br>”;
$num=100; #定义全局变量

#方法1-直接使用
/*
class My_Class
{
function my_class_()
{
$i=99;
$o=$GLOBALS[‘num’]+$i; #直接使用全局变量
echo $o;
}
}
$main= new My_Class();
$main->my_class_();
*/

#方法2-构造方法赋值
/*
class My_Class
{
private $num; #定义个私有的成员$num
function __construct()
{
#利用构造方法,给私有成员$num赋值为全局变量的$num
$this->num=$GLOBALS[‘num’];
}
function my_class_()
{
$i=98;
$o=$this->num+$i;
#私有成员$num的参数已经从构造方法中获取
echo $o;
}
}
$main= new My_Class();
$main->my_class_();
*/

#方法3-继承一个初始类供其他方法extends(继承)使用

class My_Class_Construct
{
protected $num; #定义个保护成员$num
function __construct()
{
#利用构造方法,给保护成员$num赋值为全局变量的$num
$this->num=$GLOBALS[‘num’];
}
}

class My_Class extends My_Class_Construct
{
function my_class_()
{
$i=89;
$o=$this->num+$i;
#使用父类的保护成员$num
echo $o;
}
}
$main= new My_Class();
$main->my_class_();

 

#当然也可以使用下面用方法的方式

/*
class My_Class_Construct
{
protected $num;
function num()
{
return $this->num=$GLOBALS[‘num’];
}
}

class My_Class extends My_Class_Construct
{
function my_class_()
{
$i=111;
$o=$this->num()+$i;
echo $o;
}
}
$main= new My_Class();
$main->my_class_();
*/

?>

#使用面向对象的方式,需要在类方法里面使用,一般使用第一种,当然也可以在类方法里global $num来使用。不过建议封装起来,即第三种方法。