1 提交表单数据
表单数据的提交方法主要分为两种:POST方法和GET方法。
POST
<?php session_start(); session_destroy(); ?>方法是在HTTP请求中嵌入表单数据;GET方法则将表单数据附加到请求该页的URL中。
提交表单时要将表单标记<form>的属性method设为post或get,post表示使用POST方法提交,get表示使用GET方法提交。
属性action指定数据提交到的URL地址,提交后页面将跳转到这个地址。而用户输入的数据也将提交到该地址。例如:
<form method= "get" action= "test.php“>
2 接收表单数据
接收表单可以使用$_POST、$_GET和$_REQUEST来完成。$_REQUEST可以取得包括POST、GET和Cookie在内的外部变量
接收表单数据即指获取表单控件的value属性的值。不同的控件可以设置不同的name属性,在接收数据时根据name属性确定是哪个控件的值。
不同的控件设置value属性的方式也不一样
3. 常用表单数据的验证方法
有些表单数据填写时必须要符合一定的条件,例如,填写出生日期时必须要符合日期的格式,填写电话号码时必须要填写正确位数的数字。
这时就需要通过验证表单数据来判断用户所填写数据的正确性。
表单数据的验证一般可以使用正则表达式(见4.3节)来完成。例如,一个简单的验证日期的正则表达式可以写做“^\d{4}-(0?\d|1?[012])-(0?\d|[12]\d|3[01])$”。
验证E-mail格式的正则表达式可以写做“^[a-zA-Z0-9_\-]+@[a-zA-Z0-9\-]+\.[a-zA-Z0-9\-\.]+$”
4.实例--使用php处理表单数据
制作一个学生信息表单,包含学生学号、姓名、性别、出生日期、所学专业、备注、兴趣爱好等信息。要求学号必须为6位数字,出生日期必须符合日期格式,学号和姓名不允许为空。
表单数据以GET方法提交到另一个页面,在另一个页面判断表单数据的正确性并输出。
新建EX6_1_Hpage.php文件
<html> <head> <title>学生个人信息</title> </head> <body> <form method="get" action="EX6_1_Ppage.php"> <table width="400" border="0" align="center" bgcolor="#CCFFCC"> <tr> <td colspan="2"><div align="center">学生个人信息</div></td> </tr> <tr> <td width="120">学号:</td> <td><input name="XH" type="text" value=""></td> </tr> <tr> <td>姓名:</td> <td><input name="XM" type="text" value=""></td> </tr> <tr> <td>性别:</td><td> <input name="SEX" type="radio" value="男" checked="checked">男 <input name="SEX" type="radio" value="女">女</td> </tr> <tr> <td>出生日期:</td> <td><input name="Birthday" type="text" value=""></td> </tr> <tr> <td>所学专业:</td> <td><select name="ZY"> <option>计算机</option> <option>软件工程</option> <option>信息管理</option> </select></td> </tr> <tr> <td>备注:</td> <td><textarea name="BZ"></textarea></td> </tr> <tr> <td>兴趣:</td> <td><input name="XQ[]" type="checkbox" value="听音乐">听音乐 <input name="XQ[]" type="checkbox" value="看小说">看小说 <input name="XQ[]" type="checkbox" value="上网">上网</td> </tr> <tr> <td colspan="2" align="center"><input type="submit" name="BUTTON1" value="提交"> <input type="reset" name="BUTTON2" value="重置"></td> </tr> </table> </form> </body> </html>
新建EX6_1_Ppage.php文件
<?php $XH=$_GET['XH']; $XM=$_REQUEST['XM']; $XB=$_GET['SEX']; $CSSJ=$_GET['Birthday']; $ZY=$_GET['ZY']; $BZ=$_GET['BZ']; $XQ=@$_GET['XQ']; $checkbirthday=preg_match('/^\d{4}-(0?\d|1?[012])-(0?\d|[12]\d|3[01])$/',$CSSJ); if($XH==NULL) { echo "学号不能为空!"; } elseif(preg_match('/\d{6}/',$XH)==0) { echo "学号格式错误!"; } elseif($XM==NULL) { echo "姓名不能为空!"; } elseif($CSSJ&&$checkbirthday==0) { echo "日期格式错误!"; } else { echo "学号:".$XH."<br>"; echo "姓名:".$XM."<br>"; echo "性别:".$XB."<br>"; echo "出生日期:".$CSSJ."<br>"; echo "专业:".$ZY."<br>"; echo "备注:".$BZ."<br>"; if($XQ) { echo "兴趣爱好:"; foreach($XQ as $value) { echo $value." "; } echo "<br>"; } } ?>
2.获取URL参数
1.获取URL参数的方法
URL通常的格式为:“url?参数1=值1&参数2=值2&参数3=值3…”。
在页面中使用“$_GET['参数']”即可获得具体参数的值,例如:
<a href="?action=超链接&name=王林">单击</a> <?php echo @$_GET['action']; //单击超链接后输出"超链接" echo @$_GET['name']; //单击超链接后输出"王林" ?> 2.解析URL
在PHP中可以使用parse_url()函数解析一个URL,并返回包含其相关内容的数组。语法格式如下:
array parse_url(string $url)
说明:$url为要解析的URL地址字符串。本函数不是用于解析URL的合法性,不完整的URL也可接受。除了对于严重不合格的URL,该函数将返回FALSE并发出警告外,
函数将返回一个关联数组,包含URL中出现的各个组成部分。其组成部分为(至少有一个):
●scheme。如http。
●host。如www.php.net。
●port。端口号。
●user。用户名。
●pass。密码。
●path。路径。
●query。在问号“?”之后的内容。
●fragment。在散列符号#之后的内容。
<?php $url='http://username:password@www.php.net/index.php?arg=value#anchor'; print_r(parse_url($url)); /*输出:Array ( [scheme] => http [host] => www.php.net [user] => username [pass] => password [path] => /index.php [query] => arg=value [fragment] => anchor ) */ ?>
3.URL编码与解码
如果url参数中含有中文参数,为了防止在传递过程中出现乱码,需对URL进行编码.所谓的编码就是将字符串中除了”_”、“-”、“.”之外的所有非字母或数字字符都替换为一个以百分号
“%”开头跟2位十六进制数的3位字符串,空格被替换为加”+”
在php中对URL编码使用unlencode()函数
url编码后使用urldecode()函数解码
3.页面跳转
1. 使用haed()函数
<?php $var1="sa"; $var2="sa"; if($var1==$var2) { header("Location: http://www.php.net"); } else echo "页面不能跳转"; ?>
2. 使用html标记
最常用的方法是提交表单,将<form>标记的action属性设置为要跳转到的页面,提交表单后就跳转到该页面。
例如: <form method="post" action="index.php"> <input type="text" name="text"> <input type="submit" name="bt" value="提交"> </form>
用HTML的超链接标记<a>也能够实现跳转页面的功能,例如: <?php echo "<a href='index.php?id=1&name=david'>单击超链接</>"; ?>
使用按钮也可以进行页面跳转,只需要在按钮控件的onclick方法中设置执行的代码即可,例如: <?php echo '<input type="button" name="bt" value="
页面跳转" onclick="location=\'index.php\'">';
3.使用客户端脚本
在PHP中还可以使用客户端脚本实现页面的跳转,例如,在PHP中使用JavaScript跳转到index.php页面的代码如下:
<?php echo "<script>if(confirm('确认跳转页面?')) "; echo "window.location='index.php'</script>"; //上面一句也可写做echo "location.href='index.php'; </script>"; ?>
4.会话管理
会话管理的思想是指在网中通过一个会话跟综用户,记录下用户的信息,实现信息在页面间的传递
1.会话的工作原理
php的会话也称为sessionID.在用户登录或访问一引起初始页面时服务器会为客户端分配一个SessionID.它保存在客户端.它可以保存在用户机器的cookie也可通过URL在网络中进行传输
会话变量是用户通过SessionID注册一些特殊的变量,这些变量的数据保存在服务器端 。在一次特定的连接中,如果客户端通过cookie或url找到SessionID,那么服务器就可以根据客户端传来的
SessionID访问会话保存在服务器端的会话变量。
生命周期只能在一次特定的网站连接中有效,当关闭浏览器后,sessionID会自动失效,之前注册会话变量也不能使用。
2.实现会话
步骤如下:
1.初始化会话
2.注册会话变量
3.访问会话变量
4.注销并删除会话
1.初始化会话
在实现会话功能之前必须要初始化会话,初始化会话使用session_start()函数,语法格式如下:
bool session_start(void)
该函数将检查SessionID是否存在,如果不存在则创建一个,并且能够使用预定义数组$_SESSION进行访问。如果启动会话成功则函数返回TRUE,否则返回FALSE。
会话启动后就可以载入该会话已经注册的会话变量以便使用
2.注册会话变量
会话变量保存在预定义数组$_session中,可以直接定义数组单元的方式来定义一个会话变量
$_session[“键名”]=”值”
会话变量定义后被记录在服务器中,并对该变量的值进行跟进踪,直到会话结束或手动注销该变量。
3.访问会话变量
要在一个脚本访问会话变量,首先使用session_statr()函数启动一个会话,之后可以使用$_session数组访问变量了。
<?php session_start(); if(isset($_SESSION["name"])) { echo $_SESSION["name"]; } else echo "会话变量未注册"; ?>
可以使用isset()函数或empty()函数来判断会话变量是否存在。
4.销毁会话变量
会话变量使用完后,删除已注册的会话变量以减少对服务器资源占用。删除使用unset()函数,
void unset(mixed $var [, mixed $var [, $... ]])
说明:$var是要销毁的变量,可以销毁一个或多个变量
<?php $var="hello"; session_start(); $_SESSION["var"]=$var; //注册会话变量 unset($_SESSION["var"]); //删除会话变量 if(!isset($_SESSION["var"])) //判断是否存在会话变量 echo "删除成功"; ?>
5.销毁会话变量
使用完一个会话后,要注销所有的会话变量,然后再调用session_destroy()函数销毁会话,语法格式如下:
bool session_destroy ( void )
该函数将删除会话的所有数据并清除SessionID,关闭该会话。例如:
<?php session_start(); session_destroy(); ?>
例6.2 创建一个用户登录页面,设定的用户名和密码分别为administrator和123456。表单提交到本页面,当用户名和密码输入正确时,启动Session,将用户名和密码值传到用户管理员页面。如果不先登录而访问用户管理员页面则提示无权访问。
<html> <body> <form action="EX6_2_1.php" method="post"> <table border="0" align="center"> <tr><td colspan="2" align="center">用户登录</td></tr> <tr><td align="center">用户名</td> <td> <input name="username" type="text"></td></tr> <tr> <td align="center">密码</td> <td> <input name="password" type="password"> </td> </tr> <tr> <td colspan="2" align="center"> <input type="submit" name="Submit" value="登录"> <input type="reset" name="Submit2" value="重置"> </td> </tr> </table> </form> </body> </html> <?php session_start(); if(isset($_POST['Submit'])) { $username=$_POST['username']; $password=$_POST['password']; if($username=="administrator"&&$password=="123456") { $_SESSION['username']=$username; $_SESSION['password']=$password; header("location:EX6_2_2.php"); } else { echo "<script>alert('登录失败');location.href='EX6_2_1.php';</script>"; } } ?>
新建ex6_2_2.php文件,输入以下代码:
<?php session_start(); $username=@$_SESSION['username']; $password=@$_SESSION['password']; if($username) echo "欢迎管理员登录,您的密码为$password"; else echo "对不起,您没有权限登录本页"; ?>
3.在php中实现cookie
作用:解决了关闭ie时,seesion重新注册问题
缺点:
.多人共用一台计算机,cookie数据容易泄露
.一个站点存储的cookie信息有限
.有些浏览器不支持COOKIE;
.用户可以设置IE,禁用cookie;
由于上述局限,所以在进行会话管理时,sessionid通常会摆选择cookie和url两种方式来保存,而不是只保存在cookie中。
1.创建cookie
bool setcookie(string $name [, string $value [, int $expire [, string $path [, string $domain [, bool $secure [, bool $httponly ]]]]]])
注意:服务器php.ini文件输出缓存开启,
$name.表示cookie的名字
$value.保存在客户端的值
$expire.表示cookie保存时间,是一个UNIX时间戳,对于expire设置一般通过当前时间戳加上相应的秒数来决定。例如time()+1200表示cookie将在20分钟后失效。
如果不设置cookie将在浏览器关闭后失效。
$pah.表示在服务器上有效路径
$domain.表示在服务器上的有效域名
$secure.表示允许通过安全的https协议传输.0表示允许。
2.访问cookie
访问cookie的方法与session类似
例如
<?php setcookie("name","david"); if(isset($_COOKIE["name"])) echo $name; ?>
3.删除cookie
Cookie在创建时指定了一个过期时间,如果到了过期时间,Cookie将自动被删除。在PHP中没有专门的删除Cookie的函数。
如果为了安全方面的考虑,在Cookie过期之前就想删除Cookie,可以使用setcookie()函数或$_COOKIE数组将已知Cookie的值设为空。
例如:
<?php $_COOKIE["user"]="administrator"; setcookie("password","123456",time()+3600); $_COOKIE["user"]=""; //使用$_COOKIE清除Cookie setcookie("password",""); //使用setcookie()函数清除Cookie print_r($_COOKIE); //输出:Array ( [user] => ) ?>
例6.3 制作一个登录表单,将表单的值保存在Cookie中,并可以选择Cookie的有效时间。
<html> <body> <form action="EX6_3_1.php" method="post"> <table border="0" align="center"> <tr><td align="center">用户名</td><td><input name="username" type="text"></td></tr> <tr><td align="center">密码</td><td><input name="password" type="password"></td></tr> <tr><td>Cookie保存时间</td> <td><select name="time"> <option value="0" selected>不保存</option> <option value="1">保存一小时</option> <option value="2">保存一天</option> <option value="3">保存一星期</option> </select></td></tr> <tr><td colspan="2" align="center"> <input type="submit" name="Submit" value="登录"> <input type="reset" name="Submit2" value="重置"></td></tr> </table> </form> </body> </html> <?php setcookie("username"); if(isset($_POST['Submit'])) { $username=$_POST['username']; $password=$_POST['password']; $time=$_POST['time']; if($username=="administrator"&&$password=="123456") { switch($time) { case 0: setcookie("username",$username); break; case 1: setcookie("username",$username,time()+60*60); break; case 2: setcookie("username",$username,time()+24*60*60); break; case 3: setcookie("username",$username,time()+7*24*60*60); break; } header("location:EX6_3_2.php"); } else { echo "<script>alert('登录失败');location.href='EX6_3_1.php';</script>"; } } ?>
新建ex6_3_2.php
<?php if($username=@$_COOKIE['username']) { echo "欢迎管理员".$username."登录"; } else echo "您没有权限访问本页面"; ?>
6.5 实例--制作一个php互动网页
例4 制作一个智能问答系统,系统根据存储于文本文件中的用户信息判断用户是否是合法登录。
登录后可以进行智力问答,回答完后系统会计算其所得分数。
practice文件夹下新建一个EX6_4_info.txt文本文件,在其中保存用户的信息,有用户名、密码两个信息,中间用“|”隔开,如输入如下几行数据:
user1|123456
user2|654321
user3|111111
新建EX6_4_main.php文件(主页面),输入以下代码
<?php session_start(); $username=@$_GET['username']; //获取用户名 $password=@$_GET['password']; //获取密码 //本函数用于获取文本文件中的用户数据 function loadinfo() { $user_array=array(); $filename='EX6_4_info.txt'; //用户信息文件 $fp=fopen($filename,"r"); //打开文件 $i=0; while($line=fgets($fp,1024)) { list($user,$pwd)=explode('|',$line); //读取每行数据 $user=trim($user); //去掉首尾特殊符号 $pwd=trim($pwd); $user_array[$i]=array($user,$pwd); //将数组组成一个二维数组 $i++; } fclose($fp); return $user_array; //返回一个数组 } $user_array=loadinfo(); if($username) { //判断用户输入用户名和密码是否正确 if(!in_array(array($username,$password),$user_array)) echo "<script>alert('用户名或密码错误!');location='EX6_4_login.php';</script>"; else { foreach($user_array AS $value) //遍历数组 { list($user,$pwd)=$value; if($user==$username&&$pwd==$password) { $_SESSION['username']=$username; //使用Session将用户名和密码传到其它页面 $_SESSION['password']=$password; echo "<div>您的用户名为:".$user."</div>"; echo "<br>"; if($points=@$_SESSION['QA_points']) //得到EX6_4_QA.php中使用Session传来的值 { echo "您刚刚答题得到了".$points."分<br>"; echo "<input type='button' value='继续答题' onclick=window.location='EX6_4_QA.php'>"; } else { echo "您还没有答题记录<br>"; echo "<input type='button' value='开始答题' onclick=window.location='EX6_4_QA.php'>"; } } } } } else echo "您尚未登录,无权访问本页"; ?>
新建ex6_4_QA.PHP文件(答题页面),输入以下码:
<?php session_start(); $username=@$_SESSION['username']; $password=@$_SESSION['password']; if($username) { echo $username.",请回答以下题目:<br>"; ?> <form method="post" action=""> <div>1. 农夫有17只羊,除了9只以外都病死了,农夫还剩几只羊?<br> <input type="radio" name="q1" value="1">17 <input type="radio" name="q1" value="2">9 <input type="radio" name="q1" value="3">8</div><br> <div>2. 大月有31天,小月有30天,那么一年中几个月有28天?<br> <input type="radio" name="q2" value="1">1个 <input type="radio" name="q2" value="2">4年一个 <input type="radio" name="q2" value="3">12个</div><br> <div>3. 小明的妈妈有三个小孩,老大叫大毛,老二叫二毛,老三叫什么?<br> <input type="radio" name="q3" value="1">三毛 <input type="radio" name="q3" value="2">小明 <input type="radio" name="q3" value="3">不知道</div><br> <div>4. 英国有没有七月四日(美国独立纪念日)?<br> <input type="radio" name="q4" value="1">有 <input type="radio" name="q4" value="2">没有 <input type="radio" name="q4" value="3">不知道</div><br> <div>5. 医生给你3个药丸,要你每30分钟吃1个,这些药丸多久后会被吃完?<br> <input type="radio" name="q5" value="1">90分钟 <input type="radio" name="q5" value="2">60分钟 <input type="radio" name="q5" value="3">30分钟</div><br> <input type="submit" value="提交" name="submit"> </form> <?php if(isset($_POST['submit'])) { $q1=@$_POST['q1']; $q2=@$_POST['q2']; $q3=@$_POST['q3']; $q4=@$_POST['q4']; $q5=@$_POST['q5']; $i=0; if($q1=="1") $i++; if($q2=="3") $i++; if($q3=="2") $i++; if($q4=="1") $i++; if($q5=="2") $i++; $_SESSION['QA_points']=$i*20; //使用Session将答题所得分数传到其它页面 echo "<script>alert('您一共答对".$i."道题,得到".($i*20)."分');"; echo "if(confirm('返回继续答题?'))"; echo "window.location='EX6_4_QA.php';"; echo "else "; echo "window.location='EX6_4_main.php?username=$username&password=$password';"; //使用get方法提交本页面的用户信息 echo "</script>"; } } else echo "您尚未登录,无权访问本页"; ?>