1、 PHP 简单实例版本历史1文档属性文件状态 文档编号版本号 1.0文档密级 公开 初稿 发布 修订采纳标准2版本历史序号 日期 版本 作者 修订说明1 2012.6.12 1.02版权声明版权所有,保留一切权利。未经本公司书面许可,任何单位和个人不得擅自摘抄、复制本文档的部分或全部,并以任何形式传播。2012 NANJING XINDA HIGH TECH DEVELOPMENT COLTO第一章 表单验证11.1 用户登录 .11.2 号码匹配 .2第二章 用户注册52.1 注册界面设计 .52.2 检查用户信息输入 .72.3 用户表 USER 设计 .92.4 注册信息处理界面 .9第
2、三章 图片上传、添加水印和缩小113.1 文件上传 .113.2 给图片添加水印 .153.3 图片缩略图 .15第四章 绘图、验证码174.1 PHP 中 GD 库的使用 174.2 绘制图像 .18第五章 发送短信235.1 网页向手机发短信两种方式 .235.2 短信网关 .235.2.1 短信网关概念 .235.2.2 短信网关工作原理 .235.2.3 通过短信接口由网页向手机发短信特点 .245.2.4 PHP 调用 http 接口 .245.3 短信猫 .255.3.1 短信猫概念和分类 .255.3.2.通过短信猫由网页向手机发短信特点 265.3.3.短信猫开发应用方式 26
3、5.3.4.Linux 系统下短信猫发短信解决方案 .265.3.5.两种方式差异 26第六章 留言薄配置276.1 配置编译环境 276.2 使用 PHP 语言编写程序 .276.2.1 建立 index.php .276.2.2 建立 send.php.286.2.3 建立 reply.php306.2.4 建立 manage.php .326.2.5 建立 logout.php346.3 配置数据库 346.4 效果图 351 / 40第一章 表单验证在使用和存储表单提的数据时,通常对这些数据进行验证,验证的方法很多,例如首先在客户端使用 javaScript,但用户可以禁用 JavaS
4、cript,甚至使用一个不支持 JavaScript 的浏览器,所以用此方法不够稳妥。更为稳妥的方式是通过 PHP 来完成验证。验证表单元素是否为空,首先通过 isset()函数检测变量是否甚至,然后通过 empty()检测变量是否为空。1.1 用户登录创建一个用户登录模块,应用 isset()和 empty()函数在本页完成对用户登录信息时验证操作,代码如下:用户名: 密$nbsp;码:alert(用户名和密码不能为空!);window.location.href=index.php;“;elseecho “输入的用户名为:$user 密码为:$password“ ;?运行效果:2 / 40
5、1.2 号码匹配通过 PHP 对具体的表单元素值进行验证,如果是单纯的数字、引文字符串、字符串大小写的区分等,则 PHP 中有相应的函数可以独立完成,如果是对电话号码、E-mail 或 IP 地址等进行验证,则必须借助正则表达式的帮助。通过 preg_match()和 preg_match_all()函数对表单中提交的手机号码和座机号码进行验证,并返回各自的匹配次数。操作步骤如下:首先,创建 form 表单,添加表单元素,将电话号码提交到 index.php。然后,编写 PHP脚本,通过$_POST方法获取表单提交的电话号码。最后,通过 preg_match()函数对座机号码惊喜匹配,通过 p
6、reg_match_all()函数对手机号码进行匹配。代码如下:座机号码: 手机号码: alert(座机号码格式正确!);window.location.href=number_Validation.php;“;else echo “alert(座机号码格式不正确!);window.location.href=number_Validation.php;“;if(isset($_POSTcheck_phone) and !empty($_POSTcheck_phone)$counts=preg_match_all($checkphone,$_POSTcheck_phone,$arr);if($
7、counts=1)echo “alert(手机号码格式正确!);window.location.href=number_Validation.php;“;else echo “alert(手机号码格式不正确!);window.location.href=number_Validation.php;“;?运行效果图:4 / 405 / 40第二章 用户注册网站中常需要用户注册功能,主要包括用户名、密码、电子邮箱或者或者安全问题等内容。2.1 注册界面设计上图为注册界面 register.html,用*提醒用户此项为必填内容。在页面的最顶端,用 js 代码获取当前客户端日期和时间显示出来。对于底部
8、验证码的设计,具体请参照第三章验证码设计部分。会员注册会员注册window.onload=function ()setInterval(“document.getElementById(time).innerHTML=new Date().toLocaleString()+ 星期+ 日一二三四五六 .charAt(new Date().getDay();“,1000);“(带 * 号的表示为必填项目,用户名必须大于3位小于20位,密码必须大于 3位)用户名: * (可以使用中文,但禁止除. 以外的特殊符号)登录密码: *确认密码: * 电子邮箱: * (请正确添写你的电子邮件地址 )安全问题:
9、 没安全提示问题你最喜欢的格言什么?你家乡的名称是什么?你读的小学叫什么?你的父亲叫什么名字?你的母亲叫什么名字?你最喜欢的偶像是谁?你最喜欢的歌曲是什么?(忘记密码时重设密码用)问题答案: 性别: 男7 / 40女 保密验证码: 看不清?点击图片更换2.2 检查用户信息输入对于用户名、密码等需要事先设置一定限制,有些信息如电子邮箱地址还要求用户能够输入正确的格式,用户输入注册信息时,需要对输入的信息进行检查,这些检查信息集中在register.js 里。用户名检查:要求用户输入的用户名长度不少于 3 不大于 20 且不为空。function checkuser()var username=d
10、ocument.getElementById(“username“);var userid =document.getElementById(“userid“);if(username.value.match(/s*$/)userid.innerHTML=用户名不能为空;return false;else if(username.value.length 用户名的长度不能少于3位;return false;else if(username.value.length 20)userid.innerHTML=用户名的长度不能大于20位;return false;elseloadAJAXTab(“r
11、eg_new.php?action=che8 / 40return true;密码检查:密码长度不少于三位,两次输入的密码要相同,且不能为空值。function checkpwd()var userpwd=document.getElementById(“txtPassword“);var pwdok =document.getElementById(“userpwdok“);var pwdokid =document.getElementById(“pwdokid“);if(userpwd.value != pwdok.value)pwdokid.innerHTML=两次密码不一致 ;ret
12、urn false;else if(userpwd.value.match(/s*$/)pwdokid.innerHTML=用户密码不能为空 ;return false;else if(userpwd.value.length 用户密码的长度不能少于3位;return false;else pwdokid.innerHTML=密码可以使用 ;return true;电子邮箱地址检查:用正则表达式判断用户输入的电子邮箱地址格式是否正确function checkemail()var email=document.getElementById(“email“);var emailid =docum
13、ent.getElementById(“emailid“);if(email.value.match(/s*$/)emailid.innerHTML=电子邮件不能为空 ;return false;else if(!email.value.match(/w+(-+.w+)*w+(-.w+)*.w+(-.w+)*/)emailid.innerHTML=不是合法的电子邮件格式 ;return false;else emailid.innerHTML=电子邮件可以使用 ;return true;提交注册信息检查:提交注册信息时,检查前面所有的验证信息是否通过,若通过,则返回用户注册信息。functio
14、n validate()var result=true;if(!checkuser()9 / 40result=false;if(!checkpwd()result=false;if(!checkemail()result=false;var vdcode=document.getElementById(“vdcode“);if(vdcode.value.match(/s*$/)alert(“请添写验证码“);result=false;return result;2.3 用户表 USER 设计用户表中记录用户的信息,ID 作为主键,唯一标识用户信息。其结构定义如下表所示:字段名 数据类型 主键
15、 非空 备注id INT(11) Y Y 用户 id,唯一标示,自动增长userName VARCHAR(20)Y 用户登录名userPwd VARCHAR(40)Y 用户密码email VARCHAR(60)Y 用户电子邮箱地址safequestion SAMLLINT(3) Y 是否有安全问题提示safeanswer VARCHAR(60)Y 安全问题回答regTime INT(10) Y 用户注册时间sex CHAR(2) Y 用户性别2.4 注册信息处理界面当用户点击注册按钮,数据输入的信息都通过检查验证后,由服务器端负责用户注册信息的处理。reg_new.php 界面用来讲用户信息插
16、入到数据表 USER 中,插入之前还要验证用10 / 40户名是否已经被注册过。function validateForm($user=1)$result=true;if(!Validate:required($_POSTuserName) $this-messList = “用户名称不能为空.“ ;$result=false;if(!Validate:checkLength($_POSTuserName, 20) $this-messList = “用户名称的长度不能大于20.“ ;$result=false;if(!Validate:required($_POSTuserPwd) $thi
17、s-messList = “用户密码不能为空.“ ;$result=false;if($_POSTuserPwd!=$_POSTuserpwdok) $this-messList = “两次密码输入不一致.“ ;$result=false;if(!Validate:required($_POSTemail) $this-messList = “用户电子邮件不能为空.“ ;$result=false;if(!Validate:match($_POSTemail, “/w+(-+.w+)*w+(-.w+)*.w+(-.w+)*/“) $this-messList = “不是正确的电子邮件格式.“
18、;$result=false;if($user)if($this-getUserName($_POST“userName“) $this-messList = “该用户已经存在.“ ;$result=false;if(!$this-checkCode($_POST“vdcode“) $this-messList = “验证码输入错误.“ ;$result=false;return $result;function getUserName($username)$result=$this-mysqli-query(“SELECT userName FROM $this-tabName WHERE
19、userName=$username“);if($result-num_rows0)11 / 40return true;elsereturn false;第三章 图片上传、添加水印和缩小3.1 文件上传文件上传,即通过表单中的文件域提交上传文件。通过$_FILES 数组处理文件,通过is_uploaded_file()函数验证上传文件,通过 move_uploaded_file()函数完成文件上传。12 / 40在 PHP 中上传文件的大问题是对超大文件的处理。PHP 有两种方法避免出现这种情况:一种是硬性限制,另一种是软性限制。1. 在 php 文件中可以对上传文件进行硬性限制。包括:是否
20、支持上传、上传文件的临时目录、上传文件的大小、指令执行的时间、指令分配的内存空间。 file_uploads:如果值为 on,则说明服务器支持文件上传;如果值为 off,则说明不支持。一般默认为支持,这个不用修改。 upload_tmp_dir:文件上传临时目录。在文件被成功上传之前,文件首先存放到服务器的临时目录中。多数使用系统默认目录,但是也可以自行设置。 upload_max_filesize:服务器允许上传文件的最大值,以 MB 为单位。系统默认为2MB,如果需要上传超过 2MB 的数据,那么就要修改这个值。上述是 php.ini 的 File_Uploads 项中与上传相关选项参数设
21、置说明,除了 File_Uploads 项中的内容外,在 php.ini 中还有其他几个选项会影响到文件的上传。 max_execution_time:PHP 中一个指令所能执行的最大时间,单位是秒。该选项在上传超大文件时必须要修改,否则即使上传文件在服务器允许的范围内,但是若超过了指令所能执行的最大时间,则仍然无法实现上传。 miemory_limit:PHP 中一个指令所分配的内存空间,单位为 MB2. 在表单中,在文件域之前添加一个名称为 MAX_FILE_SIZE 的隐藏域,通过它的值可以实现上传文件大小的软限制。$_FILES全局数组为一个多维数组,用于获取通过 POST 方法上传文
22、件时的相关信息。如果是单文件上传,那么数组为二位数组;如果是多文件上传,那么数组为三位数组。$_FILES 数组中元素的含义如表 1.0 所示。元素名 说明$_FILESfilenamename浏览器提供文件名。使用价值不大。因为客户端及其上的文件名的定有可能和 Web 服务器不同(例如,如果客户机位 Windows 系统,文件名可能为”C:PHOTOSME.JPG”,而服务器为 Unix 系统,那么这个文件路径没什么意义)$_FILESfilenamesize已上传文件的大小单位为 B。如果用户试图上传一个过大的文件,它的大小将被置为 013 / 40$_FILESfilenametmp_n
23、ame文件上传到服务器后,在服务器中的临时文件名$_FILESfilenametype 从客户端上传的文件类型。例如“image/gif”, 主类型为“图像” ,子类型为 GIF 格式的文件, “text/html”代表文本的 HTML 文件$_FILESfilenameerror返回在上传过程中发生错误的错误代号。错误代号有 5 种,如下所示:0:表示没有任何错误,文件上传成功1:表示上传文件的大小超出了 PHP 配置文件指令 upload_max_filesize选项限制的值2:表示上传文件的大小超出了 HTML 表单中 MAX_FILE_SIZE 选项所指定的值3:表示文件只被上传了一部
24、分4:表示没有上传任何文件PHP 中应用 is_uploaded_file()函数判断制定的文件是否是通过 HTTP POST 上传的,如果是,返回 True,则可以继续执行文件的上传操作;否则将不能够继续执行。其语法如下:bool is_uploaded_file(string filename)参数 filename 必须指定类似于 $_FILESfilenametmp_name的变量,不可以使用客户端上传的文件名$_FILESfilenamename。通过 is_uploaded_file()函数对上传文件进行判断,可以确保恶意的用户无法欺骗脚本去访问本不能访问的文件,例如/etc/pa
25、sswd。PHP 中应用 move_uploaded_file()函数将文件上传到服务器制定的位置。如果成功,返回 True,否则返回 false。其语法如下:Bool move_upoaded_file(string filename,string destination)参数 filename 指定上传文件的临时文件名,即 $_FILEStmp_name;参数 destination 指定文件上传后保存的新路径和名称。编写一个文件上传的实例,步骤如下:首先创建表单,设置 enctype 的属性值为 multipart/form-data,是指隐藏域对上传文件的大小进行软限制、添加文件域和提
26、交按钮,使用 POST 方法将数据提交到当前页面。然后,通过$_FILES 全局数组获取上传文件的数据,并且对其惊醒判断,通过is_uploaded_file()函数判断指定的文件是否是通过 HTPP POST 上传的。最后应用move_upload_file()函数将上传文件移动到指定的文件夹中。其关键代码如下:文件上传0) /判断文件是否可以上传到服务器echo “上传错误:“;switch($_FILEStexterror)case 1:echo “上传文件大小超出配置文件规定值 “;break;case 2:echo “上传文件大小超出表单中约定值“;break;case 3:echo
27、 “上传文件不全“;break;case 4:echo “没有上传文件“;break;elseif(is_uploaded_file($filetmp_name) /对表单进行验证$floatTime=time();$str=substr($filename,-4,4);$path=“images/“.$floatTime.$str;if(move_uploaded_file($filetmp_name,$path) /执行文件上传操作echo “上传成功,文件名称为:“.$floatTime.$str;?运行效果:15 / 403.2 给图片添加水印给图片添加水印即在原有图片上加上所需的字符
28、或者logo 等标志后,重新生成一张图片。function waterMark($text) $white = imageColorAllocate($this-newImg, 255, 255, 255);$black = imageColorAllocate($this-newImg, 0, 0, 0);$alpha = imageColorAllocateAlpha($this-newImg, 230, 230, 230, 40);ImageFilledRectangle($this-newImg, 0, $this-height-26, $this-width, $this-heigh
29、t, $alpha);ImageFilledRectangle($this-newImg, 13, $this-height-21, 14, $this-height-6, $black);$fontName=$this-picPath.“simsun.ttc“;16 / 40ImageTTFText($this-newImg, 6.0, 0, 20, $this-height-16, $black, $fontName, $this-toCode($text0);ImageTTFText($this-newImg, 6.0, 0, 20, $this-height-6, $black, $f
30、ontName, $this-toCode($text1);return $this-createNewImage($this-picPath.$this-newName);3.3 图片缩略图将图片按原比例缩小:function makeThumb($maxWidth, $maxHeight, $new=true) $isThumb=false;if($maxWidth imageInfo“width“) $width=$maxWidth;$isThumb=true;else$width=$this-imageInfo“width“;if($maxHeight imageInfo“height
31、“) $height=$maxHeight;$isThumb=true;else$height=$this-imageInfo“height“;if($isThumb)$srcW = $this-imageInfo“width“;$srcH = $this-imageInfo“height“; if ($srcW * $width $srcH * $height)$height = round($srcH * $width / $srcW);else$width = round($srcW * $height / $srcH); $this-height = $height;$this-wid
32、th = $width;$this-newImg = $this-kidOfImage($this-img, $srcW, $srcH);if($new)return $this-createNewImage($this-picPath.$this-newName);elsereturn $this-createNewImage($this-picPath.$this-17 / 40picName);elseif($new)copy($this-picPath.$this-picName, $this-picPath.$this-newName);$this-newImg=$this-getI
33、mg($this-picPath.$this-picName);$this-width=$width;$this-height=$height; return true;缩略图效果如图所示:第四章 绘图、验证码4.1 PHP 中 GD 库的使用PHP 中处理图像的前提条件在 PHP 中大多数要处理的图像,都需要在编译 php 时加上图像函数的 GD 库,除了安装GD 库外,还可能需要其他的库,这可以根据需要支持哪些图像格式而定。具体请参照文档18 / 40LAMP 环境配置中关于 PHP 中各种库文件的安装。PHP 创建图像步骤在 PHP 中,通过 GD 库处理图像是在内存中处理后,以文件流的
34、方式输出到浏览器或者保存到服务器。创建一个图像步骤如下所示:创建画布:即在内存中开辟一块临时区域,用于存储图像的信息;绘制图像:基于创建好的画布,使用各种画像函数设置图像的颜色、绘制各种图形,以及向图像中添加文本等。输出图像:将图像输出到浏览器或者保存在服务器。在输出到浏览器之前,需要使用header 函数发送 content-type 告诉浏览器这次发送的是图片而不是文本。释放资源:图像输出后,需要及时清除图片占有的内存资源。4.2 绘制图像画布管理常用的画布管理函数如下:创建画布函数:resource imagecreate(int $width,int $height)/新建一个基于调色
35、版的图像resource imagecreatetruecolor(int $width, int $height)/新建一个真彩色图像两函数的区别是容纳颜色总数不同。销毁画布资源函数:bool imagedestroy(resource $image)设置颜色函数:int imagecolorallocate(resource $image,int $red,int $green,int $blue)生成图像函数:bool imagegif(resource $image,string $filename)bool imagejpeg(resource $image,string $file
36、name,int $quality)bool imagepng(resource $image,string $filename)bool imagewbmp(resource $image,string $filename,foreground)通用图形区域填充函数:bool imagefill(resource $image,int $x,int $y,int $color)绘制图像绘制点:bool imagesetpixel(resource $image,int $x,int $y,int $color)绘制线段:bool imageline(resource $image,int $
37、x1,int $y1,int $x2,int $y2,int $color)绘制矩形:bool imagerectangle(resource $image,int $x1,int $y1,int $x2,int $y2,int $color)绘制矩形并填充颜色:bool imagefilledrectangle(resource $image,int $x1,int $y1,int $x2,int $y2,int $color) 绘制多边形:bool imagepolygon(resource $image,array $points,int $num_points,int $color)绘
38、制多边形并填充颜色:bool imagefilledpolygon(resource $image,array $points,int $num_points,int $color)绘制椭圆:bool imageellipse(resource $image,int $cx,int $cy,int $w,int $h,int $color)19 / 40绘制椭圆并填充颜色:bool imagefilledellipse(resource $image,int $cx,int $cy,int $w,int $h,int $color)绘制圆弧线:bool imagearc(resource $i
39、mage,int $cx,int $cy,int $w,int $h,int $s,int $e,int $color)绘制并填充圆弧:bool imagefilledarc(resource $image,int $cx,int$cy,int $w,int$h,int$s,int $e,int $color)在图像中绘制文字:/水平画一行字符串bool imagestring(resource $image,int $font,int $x,int $y,string $s,int $color) /垂直画一行字符串bool imagestringup(resource $image,int
40、 $font,int $x,int $y,string $s,int $color) /水平画一个字符bool imagechar(resource $image,int $font,int $x,int $y,string $c,int $color) /垂直画一个字符bool imagescharup(resource $image,int $font,int $x,int $y,string $c,int $color) s设计验证码类 ValidationCode该类声明在文件 ValidationCode.php 中,只要在创建对象时,为构造方法提供三个参数,包括创建验证码图片的宽度
41、、高度及验证码字母个数,就可以成功创建一个验证码类的对象width=$width; /为成员属性width初使化$this-height=$height; /为成员属性height 初使化$this-codeNum=$codeNum; /为成员属性codeNum初使化$this-checkCode=$this-createCheckCode();/为成员属性checkCode初使化function showImage() /通过访问该方法向浏览器中输出图像$this-getCreateImage(); /调用内部方法创建画布并对其进行初使20 / 40化$this-outputText();
42、/向图像中输出随机的字符串$this-setDisturbColor(); /向图像中设置一些干扰像素$this-outputImage(); /生成相应格式的图像并输出function getCheckCode() /访问该方法获取随机创建的验证码字符串return $this-checkCode; /返回成员属性$checkCode保存的字符串private function getCreateImage() /用来创建图像资源,并初使化背影$this-image=imageCreate($this-width,$this-height);$back=imageColorAllocate(
43、$this-image, 255, 255, 255);$border=imageColorAllocate($this-image, 0, 0, 0);imageRectangle($this-image,0,0,$this-width-1,$this-height-1,$border);private function createCheckCode() /随机生成用户指定个数的字符串for($i=0;$icodeNum;$i+) $number=rand(0,2);switch($number)case 0 : $rand_number=rand(48,57);break; /数字cas
44、e 1 : $rand_number=rand(65,90);break; /大写字母case 2 : $rand_number=rand(97,122);break; /小写字母$ascii=sprintf(“%c“,$rand_number);$ascii_number=$ascii_number.$ascii;return $ascii_number;private function setDisturbColor() /设置干扰像素,向图像中输出不同颜色的100 个点for ($i=0;$iimage, rand(0,255), rand(0,255), rand(0,255);ima
45、gesetpixel($this-image,rand(1,$this-width-2),rand(1,$this-height-2),$color);private function outputText()/随机颜色、随机摆放、随机字符串向图像中输出for ($i=0;$icodeNum;$i+) $bg_color = imagecolorallocate($this-image, rand(0,255), rand(0,128), rand(0,255);$x = floor($this-width/$this-codeNum)*$i+3;21 / 40$y = rand(0,$thi
46、s-height-15);imagechar($this-image, 5, $x, $y, $this-checkCode$i, $bg_color);private function outputImage() /自动检测GD支持的图像类型,并输出图像if(imagetypes() /发送标头信息设置MIME 类型为image/gifimagegif($this-image); /以GIF格式将图像输出到浏览器elseif(imagetypes() /发送标头信息设置MIME类型为image/jpegimagejpeg($this-image, “, 0.5); /以JPEN格式将图像输出
47、到浏览器elseif(imagetypes() /发送标头信息设置MIME类型为image/pngimagepng($this-image); /以PNG格式将图像输出到浏览器elseif(imagetypes() /发送标头为image/wbmpimagewbmp($this-image); /以WBMP格式将图像输出到浏览器else /如果没有支持的图像类型die(“PHP不支持图像创建!“); /不输出图像,输出一错误消息,并退出程序function _destruct() /当对象结束之前销毁图像资源释放内存imagedestroy($this-image); /调用GD库中的方法销毁图像资源?应用验证码类的实例对象在脚本 imagecode.php 中,包含验证码类 ValidationCode 所在文