PHP入门基础之简单留言本(三)
增加的修改删除操作当然应该只有管理员才能使用,现在就说说怎么实现用户登录的功能。用户登录和验证是大部分网站都具备的功能,我们当然应该学一学怎样实现。
添加登录表单
1、关于Session。
一个web网站的用户登录及验证,通常是通过服务器设置和检查Session变量完成的。Session义为会话,顾名思义是服务器与客户端之间的一种协议,由服务器创建并只能由服务器访问、修改。客户端浏览器关闭后Session变量自动注销,服务器也可手动注销。客户端无法获取得到任何Session变量名和变量值,这就保障了Session机制的安全性。
在php中,要使用Session变量必须先在代码页的开始处调用函数
session_start();
来开启Session功能。php4之后的版本推荐直接使用
$_SESSION["user"]="admin";
的方式直接创建使用Session变量,用
unset($_SESSION["user"]);
注销Session变量,用
isset($_SESSION["user"])
检查Session变量是否被使用。
2、在index.php中添加登录表单代码。
<?
// index.php
require("functions.php");
session_start();
$conn=mysql_open();
?>
...
<h3>管理登录</h3>
<? if(!isset($_SESSION["user"])): ?>
<form name="login" method="post" action="login.php">
用户名:<input name="username" type="text" maxlength="20" />
密码:<input name="password" type="password" maxlength="32" />
<input type="submit" name="submit" value="登录" />
<input type="reset" name="reset" value="重置" />
</form>
<? else: ?>
已登录用户:<?= $_SESSION["user"] ?>
<a href="logout.php">退出登录</a>
<? endif; ?>
...
这里对于用户登录与否的不同情况应该显示不同的内容,未登录用户显示登录表单,已登录用户则显示用户名和管理功能按钮。
另外,这里的if-else控制结构使用了另一种替代语法,即
if(condition1):
statement1;
elseif(condition2):
statement2;
else:
statement3;
endif;
这种语法对于执行部分是html代码的混合结构十分有用,正如上面的登录表单代码。类似的,while、for等控制结构也有相应的替代语法。
实现登录及退出操作
1、在数据库phpEx_1中建立数据表user。
表格式为:username VARCHAR(10) PRIMARY KEY, password VARCHAR(32)。
添加一个新行,username='admin',password='21232f297a57a5a743894a0e4a801fc3'。其中password的值是字符串"admin"的MD5值,关于MD5在下一部分“密码及身份验证”中将具体说明。
2、建立文件login.php实现登录操作。
<?
// login.php
require("functions.php");
session_start();
$conn=mysql_open();
$query="select * from user where username='$username'";
$result=mysql_query($query);
$rs=mysql_fetch_object($result);
if($rs==false)
error("用户名不存在!");
elseif($rs->password!=md5($password))
error("密码不正确!");
else
{
$_SESSION["user"]=$rs->username;
noerr(NULL,"index.php");
}
?>
其中md5($password)函数返回$password字符串的MD5值,关于这里的密码验证机制在下一部分“密码及身份验证”中将具体说明。
打开数据库,查询表单提交的用户名,如果查找不到则用户名不存在;查找到则比较提交密码的MD5值与数据库中保存的MD5值,不相同则是密码输入错误;用户名密码正确,设置Session变量,页面跳转返回主页。
3、建立文件logout.php实现退出登录操作。
<?
// logout.php
require("functions.php");
session_start();
unset($_SESSION["user"]);
noerr(NULL,"index.php");
?>
密码及身份验证
1、关于MD5。
MD5是一个Hash函数(又称散列函数、哈希函数),对于任意的数据串,均生成一个128位的MD5值。这个函数有三个主要性质:(1) 对于数据串的一个细微改变,都会引起函数值的巨大改变,这被称为雪崩效应;(2) 对于任意的两个不同的数据串,几乎不可能产生相同的MD5值;(3) 由一个MD5值不可能用反向的数学推导得到原始字符串。基于(1)(2)这两个重要性质,我们可以使用它来验证两个数据串是否相等而不必知道这两个数据串的具体内容,只需比较它们的MD5值是否相等即可。
2、密码验证体制。
一般的web用户登录验证系统都只在数据库中存储密码的MD5值,而在用户登录的时候比较输入密码的MD5值与数据库中存储的值是否相等。这就使得任何人包括系统管理员也无法得知用户的密码,因为根据性质(3),由密码的MD5值无法反向推导得到密码的原始值。
3、身份验证方法。
只需要检查相应的Session变量是否被设置即可。在需要进行身份验证的地方添加如下代码:
if(!isset($_SESSION["user"]))error("您还没有登录!");
在Session未设置的情况下,提示错误并返回。
注意如果没有开启Session功能,还必须在该代码页首添加代码:
session_start();
例如我们可以修改index.php中[修改|删除]链接只在用户已登录的时候显示:
<?
// index.php
...
while($rs=mysql_fetch_object($result))
{
echo "$rs->name 在 $rs->posttime 说:$rs->content\n";
if(isset($_SESSION["user"]))
{
echo "[<a href=modify.php?id=$rs->id>修改</a>|";
echo "<a href=remove.php?id=$rs->id";
echo " onclick='javascript:return confirm(\"确定删除?\");'>删除</a>]\n";
}
if($rs->posttime!=$rs->modtime)
echo "<font color=gray>[该留言于 $rs->modtime 被修改过]</font>\n";
echo "<br>\n";
}
...
?>
[注] 以上代码缩进全部使用全角空格,直接复制粘贴必然出错,需替换为制表符或空格。
最新评论及回复