1、 用户登录
在使用和存储表单提的数据时,通常对这些数据进行验证,验证的方法很多,例如首先在客户端使用javaScript,但用户可以禁用JavaScript,甚至使用一个不支持JavaScript的浏览器,所以用此方法不够稳妥。
更为稳妥的方式是通过PHP来完成验证。验证表单元素是否为空,首先通过isset()函数检测变量是否赋值,然后通过empty()检测变量是否为空。
创建一个用户登录模块,应用isset()和empty()函数在本页完成对用户登录信息时验证操作,代码如下:
<form id="form1" name="form1" method="post" >
<tr>
<td height="30" align="center" class="STYLE1">用户名:
<input name="user" type="text" size="16" />
</td>
</tr>
<tr>
<td height="30" align="center" class="STYLE1">密$nbsp;码:
<input name="password" type="password" size="16" />
</td>
</tr>
<tr>
<td height="30" align="center"><input type="submit" name="Submit" value="登录"/></td>
</tr>
</form>
<?php
if(isset($_POST['Submit'])){ //判断登录按钮是否设置
$user=$_POST['user']; //获取用户名
$password=$_POST['password']; //获取密码
if(empty($user)||empty($password)){
echo "<script>alert('用户名和密码不能为空!');window.location.href='index.php';</script>";
}else{
echo "输入的用户名为:$user 密码为:$password</br>";
}
}
?>
2、号码匹配
通过PHP对具体的表单元素值进行验证,如果是单纯的数字、引文字符串、字符串大小写的区分等,则PHP中有相应的函数可以独立完成,如果是对电话号码、E-mail或IP地址等进行验证,则必须借助正则表达式的帮助。
通过preg_match()和preg_match_all()函数对表单中提交的手机号码和座机号码进行验证,并返回各自的匹配次数。操作步骤如下:
首先,创建form表单,添加表单元素,将电话号码提交到index.php。然后,编写PHP脚本,通过$_POST[]方法获取表单提交的电话号码。最后,通过preg_match()函数对座机号码惊喜匹配,通过preg_match_all()函数对手机号码进行匹配。代码如下:
<form id="form1" name="form1" method="post" action="/test/number_Validation.php">
<div >
座机号码: <input name="tel" type="text" size="16" />
<input type="submit" name="check_tel" value="提交"/>
</div>
<div>
手机号码:<input name="phone" type="text" "size="16" />
<input type="submit" name="check_phone" value="提交"/>
</div>
<?
//定义验证座机号码的正则表达式
$checktel="/^(\d{3}-)(\d{8})$|^(\d{4}-)(\d{7})$|^(\d{4}-)(\d{8})$/";
//定义验证手机号码的正则表达式
$checkphone="/^13(\\d{9})$|^15(\\d{9})$/";
if(isset($_POST['check_tel']) && !empty($_POST['check_tel'])){
$counts=preg_match($checktel, $_POST['check_tel']);
if($counts==1){
echo "<script>alert('座机号码格式正确!');window.location.href='number_Validation.php';</script>";
}else {
echo "<script>alert('座机号码格式不正确!');window.location.href='number_Validation.php';</script>";
}
}
if(isset($_POST['check_phone']) and !empty($_POST['check_phone'])){
$counts=preg_match_all($checkphone,$_POST['check_phone'],$arr);
if($counts==1){
echo "<script>alert('手机号码格式正确!');window.location.href='number_Validation.php';</script>";
}else {
echo "<script>alert('手机号码格式不正确!');window.location.href='number_Validation.php';</script>";
}
}
?>
</form>
3、检查用户信息输入
对于用户名、密码等需要事先设置一定限制,有些信息如电子邮箱地址还要求用户能够输入正确的格式,用户输入注册信息时,需要对输入的信息进行检查,这些检查信息集中在register.js里。
用户名检查:要求用户输入的用户名长度不少于3不大于20且不为空。
function checkuser(){
var username=document.getElementById("username");
var userid =document.getElementById("userid");
if(username.value.match(/^\s*$/)){
userid.innerHTML='<font color="red">用户名不能为空</font>';
return false;
}else if(username.value.length < 3){
userid.innerHTML='<font color="red">用户名的长度不能少于3位</font>';
return false;
}else if(username.value.length > 20){
userid.innerHTML='<font color="red">用户名的长度不能大于20位</font>';
return false;
}else{
loadAJAXTab("reg_new.php?action=che&uname="+username.value, userid);
return 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='<font color="red">两次密码不一致</font>';
return false;
}else if(userpwd.value.match(/^\s*$/)){
pwdokid.innerHTML='<font color="red">用户密码不能为空</font>';
return false;
}else if(userpwd.value.length < 3){
pwdokid.innerHTML='<font color="red">用户密码的长度不能少于3位</font>';
return false;
}else {
pwdokid.innerHTML='<font color="green">密码可以使用</font>';
return true;
}
}
电子邮箱地址检查:用正则表达式判断用户输入的电子邮箱地址格式是否正确
function checkemail(){
var email=document.getElementById("email");
var emailid =document.getElementById("emailid");
if(email.value.match(/^\s*$/)){
emailid.innerHTML='<font color="red">电子邮件不能为空</font>';
return false;
}else if(!email.value.match(/\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*/)){
emailid.innerHTML='<font color="red">不是合法的电子邮件格式</font>';
return false;
}else {
emailid.innerHTML='<font color="green">电子邮件可以使用</font>';
return true;
}
}
提交注册信息检查:提交注册信息时,检查前面所有的验证信息是否通过,若通过,则返回用户注册信息。
function validate(){
var result=true;
if(!checkuser()){
result=false;
}
if(!checkpwd()){
result=false;
}
if(!checkemail()){
result=false;
}
var vdcode=document.getElementById("vdcode");
if(vdcode.value.match(/^\s*$/)){
alert("请添写验证码");
result=false;
}
return result;
}
4、注册信息处理
当用户点击注册按钮,数据输入的信息都通过检查验证后,由服务器端负责用户注册信息的处理。reg_new.php界面用来讲用户信息插入到数据表USER中,插入之前还要验证用户名是否已经被注册过。
function validateForm($user=1){
$result=true;
if(!Validate::required($_POST['userName'])) {
$this->messList[] = "用户名称不能为空.";
$result=false;
}
if(!Validate::checkLength($_POST['userName'], 20)) {
$this->messList[] = "用户名称的长度不能大于20.";
$result=false;
}
if(!Validate::required($_POST['userPwd'])) {
$this->messList[] = "用户密码不能为空.";
$result=false;
}
if($_POST['userPwd']!=$_POST['userpwdok']) {
$this->messList[] = "两次密码输入不一致.";
$result=false;
}
if(!Validate::required($_POST['email'])) {
$this->messList[] = "用户电子邮件不能为空.";
$result=false;
}
if(!Validate::match($_POST['email'], "/\w+([-+.']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*/")) {
$this->messList[] = "不是正确的电子邮件格式.";
$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 userName='{$username}'");
if($result->num_rows>0){
return true;
}else{
return false;
}
}
5、文件上传
文件上传,即通过表单中的文件域提交上传文件。通过$_FILES数组处理文件,通过is_uploaded_file()函数验证上传文件,通过move_uploaded_file()函数完成文件上传。
在PHP中上传文件的大问题是对超大文件的处理。PHP有两种方法避免出现这种情况:一种是硬性限制,另一种是软性限制。
- 在php文件中可以对上传文件进行硬性限制。包括:是否支持上传、上传文件的临时目录、上传文件的大小、指令执行的时间、指令分配的内存空间。
- file_uploads:如果值为on,则说明服务器支持文件上传;如果值为off,则说明不支持。一般默认为支持,这个不用修改。
- upload_tmp_dir:文件上传临时目录。在文件被成功上传之前,文件首先存放到服务器的临时目录中。多数使用系统默认目录,但是也可以自行设置。
- upload_max_filesize:服务器允许上传文件的最大值,以MB为单位。系统默认为2MB,如果需要上传超过2MB的数据,那么就要修改这个值。
上述是php.ini的File_Uploads项中与上传相关选项参数设置说明,除了File_Uploads项中的内容外,在php.ini中还有其他几个选项会影响到文件的上传。
- max_execution_time:PHP中一个指令所能执行的最大时间,单位是秒。该选项在上传超大文件时必须要修改,否则即使上传文件在服务器允许的范围内,但是若超过了指令所能执行的最大时间,则仍然无法实现上传。
- miemory_limit:PHP中一个指令所分配的内存空间,单位为MB
- 在表单中,在文件域之前添加一个名称为MAX_FILE_SIZE的隐藏域,通过它的值可以实现上传文件大小的软限制。
$_FILES[]全局数组为一个多维数组,用于获取通过POST方法上传文件时的相关信息。如果是单文件上传,那么数组为二位数组;如果是多文件上传,那么数组为三位数组。
$_FILES数组中元素的含义如表1.0所示。
元素名 | 说明 |
$_FILES[filename][name] |
浏览器提供文件名。使用价值不大。因为客户端及其上的文件名的定有可能和Web服务器不同(例如,如果客户机位Windows系统,文件名可能为”C:\PHOTOS\ME.JPG”,而服务器为Unix系统,那么这个文件路径没什么意义) |
$_FILES[filename][size] |
已上传文件的大小单位为B。如果用户试图上传一个过大的文件,它的大小将被置为0 |
$_FILES[filename][tmp_name] | 文件上传到服务器后,在服务器中的临时文件名 |
$_FILES[filename][type] | 从客户端上传的文件类型。例如“image/gif”,主类型为“图像”,子类型为GIF格式的文件,“text/html”代表文本的HTML文件 |
$_FILES[filename][error] |
返回在上传过程中发生错误的错误代号。错误代号有5种,如下所示:
0:表示没有任何错误,文件上传成功 1:表示上传文件的大小超出了PHP配置文件指令upload_max_filesize选项限制的值 2:表示上传文件的大小超出了HTML表单中MAX_FILE_SIZE选项所指定的值 3:表示文件只被上传了一部分 4:表示没有上传任何文件 |
PHP中应用is_uploaded_file()函数判断制定的文件是否是通过HTTP POST上传的,如果是,返回True,则可以继续执行文件的上传操作;否则将不能够继续执行。其语法如下:
bool is_uploaded_file(string filename)
参数filename必须指定类似于$_FILES[‘filename’][‘tmp_name’]的变量,不可以使用客户端上传的文件名$_FILES[‘filename’][‘name’]。
通过is_uploaded_file()函数对上传文件进行判断,可以确保恶意的用户无法欺骗脚本去访问本不能访问的文件,例如/etc/passwd。
PHP中应用move_uploaded_file()函数将文件上传到服务器制定的位置。如果成功,返回True,否则返回false。其语法如下:
Bool move_upoaded_file(string filename,string destination)
参数filename指定上传文件的临时文件名,即$_FILES[tmp_name];参数destination指定文件上传后保存的新路径和名称。
编写一个文件上传的实例,步骤如下:
首先创建表单,设置enctype的属性值为multipart/form-data,是指隐藏域对上传文件的大小进行软限制、添加文件域和提交按钮,使用POST方法将数据提交到当前页面。然后,通过$_FILES全局数组获取上传文件的数据,并且对其惊醒判断,通过is_uploaded_file()函数判断指定的文件是否是通过HTPP POST上传的。最后应用move_upload_file()函数将上传文件移动到指定的文件夹中。其关键代码如下:
<div id="one">
<span class="three">文件上传</span>
<form action="upload.php" method="post" enctype="multipart/form-data">
<input type="hidden" name="MAX_FILE_SIZE" value="10000000" />
<input class="one" type="file" name="text" />
<input class="two" type="submit" name="sub" value="上传" />
</form>
<span class="four">
<?php
if(isset($_POST['sub'])){ //判断是否执行提交操作
if(!is_dir("images")){ //判断指定文件夹是否存在
mkdir("images"); //创建文件夹
}
$file=$_FILES['text']; //获取表单提交的文件名称
if($_FILES['text']['error']>0){ //判断文件是否可以上传到服务器
echo "上传错误:";
switch($_FILES['text']['error']){
case 1:
echo "上传文件大小超出配置文件规定值";
break;
case 2:
echo "上传文件大小超出表单中约定值";
break;
case 3:
echo "上传文件不全";
break;
case 4:
echo "没有上传文件";
break;
}
}else{
if(is_uploaded_file($file['tmp_name'])){ //对表单进行验证
$floatTime=time();
$str=substr($file['name'],-4,4);
$path="images/".$floatTime.$str;
if(move_uploaded_file($file['tmp_name'],$path)) //执行文件上传操作
{
echo "上传成功,文件名称为:".$floatTime.$str;
}
}
}
}
?>
</span>
</div>
6、给图片添加水印
给图片添加水印即在原有图片上加上所需的字符或者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->height, $alpha);
ImageFilledRectangle($this->newImg, 13, $this->height-21, 14, $this->height-6, $black);
$fontName=$this->picPath."simsun.ttc";
ImageTTFText($this->newImg, 6.0, 0, 20, $this->height-16, $black, $fontName, $this->toCode($text[0]));
ImageTTFText($this->newImg, 6.0, 0, 20, $this->height-6, $black, $fontName, $this->toCode($text[1]));
return $this->createNewImage($this->picPath.$this->newName);
}
7、图片缩略图
将图片按原比例缩小:
function makeThumb($maxWidth, $maxHeight, $new=true) {
$isThumb=false;
if($maxWidth < $this->imageInfo["width"]) {
$width=$maxWidth;
$isThumb=true;
}else{
$width=$this->imageInfo["width"];
}
if($maxHeight < $this->imageInfo["height"]) {
$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->width = $width;
$this->newImg = $this->kidOfImage($this->img, $srcW, $srcH);
if($new){
return $this->createNewImage($this->picPath.$this->newName);
}else{
return $this->createNewImage($this->picPath.$this->picName);
}
}else{
if($new){
copy($this->picPath.$this->picName, $this->picPath.$this->newName);
}
$this->newImg=$this->getImg($this->picPath.$this->picName);
$this->width=$width;
$this->height=$height;
}
return true;
}
8、PHP中GD库的使用
①PHP中处理图像的前提条件
在PHP中大多数要处理的图像,都需要在编译php时加上图像函数的GD库,除了安装GD库外,还可能需要其他的库,这可以根据需要支持哪些图像格式而定。具体请参照文档LAMP环境配置中关于PHP中各种库文件的安装。
②PHP创建图像步骤
在PHP中,通过GD库处理图像是在内存中处理后,以文件流的方式输出到浏览器或者保存到服务器。创建一个图像步骤如下所示:
创建画布:即在内存中开辟一块临时区域,用于存储图像的信息;
绘制图像:基于创建好的画布,使用各种画像函数设置图像的颜色、绘制各种图形,以及向图像中添加文本等。
输出图像:将图像输出到浏览器或者保存在服务器。在输出到浏览器之前,需要使用header函数发送content-type告诉浏览器这次发送的是图片而不是文本。
释放资源:图像输出后,需要及时清除图片占有的内存资源。
9、绘制图像
①画布管理
常用的画布管理函数如下:
创建画布函数:
resource imagecreate(int $width,int $height)//新建一个基于调色版的图像
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 $filename][,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 $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)
绘制多边形并填充颜色:
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)
绘制椭圆并填充颜色:
bool imagefilledellipse(resource $image,int $cx,int $cy,int $w,int $h,int $color)
绘制圆弧线:
bool imagearc(resource $image,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 $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中,只要在创建对象时,为构造方法提供三个参数,包括创建验证码图片的宽度、高度及验证码字母个数,就可以成功创建一个验证码类的对象
<?php
/* 通过该类的对象可以动态获取验证码图片,和验证码字符串 */
class ValidationCode {
private $width; //验证码图片的宽度
private $height; //验证码图片的高度
private $codeNum; //验证码字符的个数
private $checkCode; //验证码字符
private $image; //验证码画布
/* 构造方法用来实例化验证码对象,并为一些成员属性初使化 */
/* 参数width: 设置验证码图片的宽度,默认宽度值为60像素 */
/* 参数height: 设置验证码图片的高度,默认高度值为20像素 */
/* 参数codeNum: 设置验证码中字母和数字的个数,默认个数为4个 */
function __construct($width=60, $height=20, $codeNum=4) {
$this->width=$width; //为成员属性width初使化
$this->height=$height; //为成员属性height初使化
$this->codeNum=$codeNum; //为成员属性codeNum初使化
$this->checkCode=$this->createCheckCode();//为成员属性checkCode初使化
}
function showImage(){ //通过访问该方法向浏览器中输出图像
$this->getCreateImage(); //调用内部方法创建画布并对其进行初使化
$this->outputText(); //向图像中输出随机的字符串
$this->setDisturbColor(); //向图像中设置一些干扰像素
$this->outputImage(); //生成相应格式的图像并输出
}
function getCheckCode(){ //访问该方法获取随机创建的验证码字符串
return $this->checkCode; //返回成员属性$checkCode保存的字符串
}
private function getCreateImage(){ //用来创建图像资源,并初使化背影
$this->image=imageCreate($this->width,$this->height);
$back=imageColorAllocate($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;$i<$this->codeNum;$i++) {
$number=rand(0,2);
switch($number){
case 0 : $rand_number=rand(48,57);break; //数字
case 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;$i<=50;$i++) {
$color = imagecolorallocate($this->image, rand(0,255), rand(0,255), rand(0,255));
imagesetpixel($this->image,rand(1,$this->width-2),rand(1,$this->height-2),$color);
}
}
private function outputText(){//随机颜色、随机摆放、随机字符串向图像中输出
for ($i=0;$i<=$this->codeNum;$i++) {
$bg_color = imagecolorallocate($this->image, rand(0,255), rand(0,128), rand(0,255));
$x = floor($this->width/$this->codeNum)*$i+3;
$y = rand(0,$this->height-15);
imagechar($this->image, 5, $x, $y, $this->checkCode[$i], $bg_color);
}
}
private function outputImage(){ //自动检测GD支持的图像类型,并输出图像
if(imagetypes() & IMG_GIF){ //判断生成GIF格式图像的函数是否存在
header("Content-type: image/gif"); //发送标头信息设置MIME类型为image/gif
imagegif($this->image); //以GIF格式将图像输出到浏览器
}elseif(imagetypes() & IMG_JPG){ //判断生成JPG格式图像的函数是否存在
header("Content-type: image/jpeg"); //发送标头信息设置MIME类型为image/jpeg
imagejpeg($this->image, "", 0.5); //以JPEN格式将图像输出到浏览器
}elseif(imagetypes() & IMG_PNG){ //判断生成PNG格式图像的函数是否存在
header("Content-type: image/png"); //发送标头信息设置MIME类型为image/png
imagepng($this->image); //以PNG格式将图像输出到浏览器
}elseif(imagetypes() & IMG_WBMP){//判断生成WBMP格式图像的函数是否存在
header("Content-type: image/vnd.wap.wbmp");//发送标头为image/wbmp
imagewbmp($this->image); //以WBMP格式将图像输出到浏览器
}else{ //如果没有支持的图像类型
die("PHP不支持图像创建!"); //不输出图像,输出一错误消息,并退出程序
}
}
function __destruct(){ //当对象结束之前销毁图像资源释放内存
imagedestroy($this->image); //调用GD库中的方法销毁图像资源
}
}
?>
③应用验证码类的实例对象
在脚本imagecode.php中,包含验证码类ValidationCode所在文件
<?php
session_start();
require_once 'ValidationCode.class.php';
$image=new ValidationCode(60,20,4);
$image->showImage();
$_SESSION['validationcode']=$image->getCheckCode();
?>
- 在表单中应用验证码类
在脚本image.php中,包含用户输入表单和匹配验证码两部分
<?php
session_start(); //开启session
if (isset($_POST['submit'])) { //判定用户是否提交了按钮
//判断用户在表单中输入的字符串与验证码图片中的字符串是否相同
if (trim($_POST['text'])==$_SESSION['validationcode']) {
echo '提交成功';
}else {
echo '<font color="red">验证码输入错误!!</font>';
}
}
?>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<title>Image</title>
<script type="text/javascript">
//当单击验证码时,将重新请求并获取新图片
function imagegdcode(obj,url){
obj.src=url+'?nowtime='+new Date().getTime();
}
</script>
</head>
<body>
<img src="imagecode.php" alt="看不清楚,换一张" style="cursor: pointer;" onclick="javascript:imagegdcode(this,this.src);">
<form action="image.php" method="post">
<input type="text" name="text">
<input type="submit" name="submit" value="提交">
</form>
</body>
</html>
10、发送短信
10.1 网页向手机发短信两种方式
通过网页向手机发送短信有两种方式:短信网关或者短信猫+SIM卡方式。
10.2 短信网关
10.2.1 短信网关概念
除了大量使用的手机用户到手机用户的点对点短信业务之外,从信息平台到手机用户的短信信息服务业务也在快速发展,该业务已经成为广大用户及时方便地获取信息的一种手段。
短信网关ISMG全称Internet Short Message Gateway,是为应用单位收发短信而提供的一个动态数据交换平台系统。通过该系统的接口软件,可以将短信平台与各种系统和软件进行无缝高效相连,将应用单位的系统随时产生的动态信息转变成手机短信,连接移动或者联通等的短信中心以端口特服号码进行实时中发送和接受,为各种系统(或软件)建立一个快速的短信双向通道,以便手机用户采用短信方式与SP双向通信,接收SP提供的信息服务。
10.2.2 短信网关工作原理
互联网短信网关(ISMG)是外部信息资源站实体(SP)与移动或联通网内短信中心之间的中介实体,互联网短信网关一方面负责接收SP发送给移动用户的信息和提交给短信中心。另一方面,移动用户点播SP业务的信息将由短信中心通过互联网短信网关发给SP。另外,为了减轻短信中心的信令负荷,互联网短信网关还应根据路由原则将SP提交的信息转发到相应的互联网短信网关。互联网短信网关通过向汇接网关(GNS)查询的方式获得网关间的转发路由信息。
10.2.3 通过短信接口由网页向手机发短信特点
①选择短信接口主要是看稳定性和速度方面。
②短信接口只收取短信充值费用,一般5-8分/条,向提供接口的服务商付费。当账户余额不足时,服务商会通知,当然,也可以自己查询。
③一般提供WebService短信接口和http短信接口,WebService适合群发短信,一次支持千条数据的提交,安全性相对高些。 http方式一次支持50。
④短信发送速度一般在50-100条/秒,每天发送短信没有限量。每条短信字数64个字左右,支持长短信,即发送200个字,收到的是一条,但是按照三条短信来扣。
⑤用户收到的短信号码是运营商分配的。手机端接收显示的是特服号码,如:106XXXXX
10.2.4 PHP调用http接口
核心代码如下:
<?php
//56短信网php短信接示例(http://www.56dxw.com)
session_start();
error_reporting(0);
header("content-type:text ml;charset=gb2312");
//帐号配置文件
$comid= "61"; //企业ID
$username= "test106"; //用户名
$userpwd= "adadad123"; //密码
$smsnumber= "1061"; //所用平台
function rstr($str){
if($str==1)
$error='代表发送成功';
else{
switch($str){
case -1:$error='手机号码不正确';break;
case -2:$error='除时间外,所有参数不能为空';break;
case -3:$error='用户名密码不正确';break;
case -4:$error='平台不存在';break;
case -5:$error='客户短信数量为0';break;
case -6:$error='客户账户余额小于要发送的条数';break;
case -8:$error='非法短信内容';break;
case -9:$error='未知系统故障';break;
case -10:$error='网络性错误';break;
default:$error='未知的错误';
}
}
print($error);
exit();
}
function sendnote($mobtel,$msg){
global $username,$userpwd,$smsnumber,$comid;
$url = "http://jiekou.56dxw.com/sms/HttpInterface.aspx?comid=$comid&username=$username&userpwd=$userpwd&handtel=$mobtel&sendcontent=$msg&sendtime=&smsnumber=$smsnumber";
$string = file_get_contents($url);
return rstr($string);
}
$_SESSION["code"]="12365";
$handtel =$_POST["Tel"];
$msg="手机验证码是:".$_SESSION["code"];
!$handtel && die('手机号必填');
!$msg && die('发生内容必填');
echo sendnote($_POST["Tel"],urlencode($msg));
?>
10.3 短信猫
10.3.1 短信猫概念和分类
所谓短信猫,其实是一种用来收发短信的设备,他和我们用的手机一样,需要手机SIM卡的支持,在需要收发短信的时候,在短信猫里面插入一张我们平时用的手机卡,插上电源,通过(USB或者串口、网口)数据线和电脑相连,在电脑的应用管理软件中就可以实现短信收发的功能。一般购买短信猫的时候会附赠一短信群发软件(桌面版),不过这个只能配合短信猫在Windows环境下运行。 短信猫从插入的SIM卡类型上可分为GSM、GPRS(移动或者联通卡)和CDMA Modem(电信卡),主要有串口、USB口和网口等类型。
10.3.2.通过短信猫由网页向手机发短信特点
①短信猫的发送速度其实不是短信猫自己所能决定的,而是由GSM网络所决定。单口短信猫平均每6秒可以成功发送出一条短信,每小时发送能力为600条。提高速度的办法是使用多台短信猫或多口短信猫池同时进行发送。
②号码显示:显示的是 SIM卡号
10.3.3.短信猫开发应用方式
基于短信猫的开发应用,有以下几种方式:
①直接使用AT指令:通过串口用AT指令驱动短信模块收发短信,这是最底层的开发模式,需要对短信模块的AT指令相当熟悉;
②短信猫开发包:短信猫厂商基于串口AT指令集成的二次开发包,开发商只需直接调用短信收发API即可;
③短信猫通信中间件:短信猫厂商提供的基于数据库接口的短信收发后台服务软件,是一种更高级的短信开发解决方案。
10.3.4.Linux系统下短信猫发短信解决方案
①短信猫+gnokii
Gnokii是一开源软件,可作为linux下短信包接口程序,即装好gnokii之后,可以直接使用其命令通过pc机上操作短信猫向手机发短信。 终端输入: echo -n “testing” | /usr/local/gnokii/bin/gnokii –sendsms 手机号
Gnokii-smsd-PHP:可通过网页向手机发短信
②PHP操作串口GSM MODEM发送短信
10.3.5.两种方式差异
①速度:SIM卡是通过无线信号发送信息的,理论速度每小时600条。企业网关,速度可以达到每秒几十条,也就是一小时发到10万条都没问题。
②号码:行业网关可以固定一个号码。但是短信猫为了保证速度,性能通常采用多号码并行,号码没有固定。
③发送量的限制:行业网关就是给企业发送上万短信用的。而SIM卡是给个人用的,所以运营商有限制,个人卡一天内发送超过多少条短信会被认为是垃圾短信,封卡。
④开发和维护:行业网关只要考虑调用一个接口就好了。短信猫需要协调很多东西,比如短信猫与计算机的通信,SIM卡的处理速度,多卡之间的任务协调,设备的运行状态,卡的信号等等。从开发难度上来看,短信猫方式工作量要大。