实战jQuery和PHP CodeIgniter表单验证

会写code的凳子哥 2011-08-26

原文发表在http://tech.it168.com/a2011/0818/1234/000001234617.shtml

上,乃本人作品,转载请注明:

前言

在Web建站中,表单的合法性验证是十分重要的一个环节,其中包括客户端浏览器的Javascript的验证和服务端的验证。在本文中将指导读者使用jQuery中的validate验证框架实现浏览器端的验证代码编写工作,validate框架是一个十分简单实用的验证框架,能大大提高客户端验证代码的的编写工作,同时,本文使用的是php中十分流行的CodeIgniter框架进行服务端的验证编写工作。本文阅读对象为对jQuery及对PHPCodeIgniter框架有一定认识的读者。

准备工作

我们必须下载CodeIgniter及jQuery,版本如下:

1.CodeIgniter 2.0.2(下载地址:http://codeigniter.com/downloads/)

2.jQuery1.6.1(下载地址:http://code.jquery.com/jquery-1.6.1.min.js)

3.jQueryvalidate框架,(下载地址:http://bassistance.de/jquery-plugins/jquery-plugin-validation/)

设置CodeIgniter

我们需要自动加载url并且需要使用CodeIgniter中的form表单助手类,所以我们在应用的autoload.php中的第67行添加如下代码:

$autoload['helper']=array('url','form');

建立视图层文件

接下来,我们开始编写页面的HTML页代码,我们将用户填写的表单命名为form_view,当校验成功提交后,如果没任何错误,则显示成功提示信息的页面命名为success_view,当然,我们先编写页面的头部和尾部的代码如下:

Views/common/Header.php:

<!DOCTYPE>

<html>

<head>

<metacharset="UTF-8">

<title>FormValidation-Gazpo.com</title>

<linkrel="stylesheet"type="text/css"href="<?phpechobase_url();?>css/style.css"/>

<scripttype="text/javascript"src="<?phpechobase_url();?>js/jquery-1.6.1.min.js"></script>

<scripttype="text/javascript"src="<?phpechobase_url();?>js/jquery.validate.js"></script>

<scripttype="text/javascript"src="<?phpechobase_url();?>js/jquery.validate-rules.js"></script>

</head>

<body>

<divid="wrapper"><!--closeitinfooter-->

在header.php中,我们引入了必须引入的jquery类库和jquery validate框架类库文件。

Views/common/footer.php

<divid="footer">

TutorialbyGazpo.com.

</div>

</div><!--/wrapper-->

</body><!--closingbody-->

</html>

在form_view.php用户填写的表单页中,我们引入了CodeIgniter框架提供的表单助手类,

利用了其中的form_open标签,代码如下:

<!--includeheader-->

<?php$this->load->view('common/header');?>

<!--CodeIgniterFormtag-->

<?php$attributes=array('id'=>'form');

echoform_open('form/process',$attributes);?>

<h2>FormValidationwithCodeIgniterandjQuery</h2>

<divclass="field">

<labelfor="name">Name</label>

<inputclass="input"id="name"name="name"type="text"/>

</div>

<divclass="field">

<labelfor="password">Password</label>

<inputclass="input"id="password"name="password"type="password"/>

</div>

<divclass="field">

<labelfor="email">Email</label>

<inputclass="input"id="email"name="email"type="text"/>

</div>

<divclass="field">

<labelfor="gender">SelectGender</label>

<divclass="gender-fields">

<inputtype="radio"class="radio"name="gender"value="male">Male

<inputtype="radio"class="radio"name="gender"value="female">Female

</div>

</div>

<divclass="field">

<labelfor="state">SelectState</label>

<selectclass="state"name="state">

<optionclass="droplist"></option>

<optionclass="droplist">Alabama</option>

<optionclass="droplist">Alaska</option>

<optionclass="droplist">Arizona</option>

</select>

</div>

<divclass="field">

<labelfor="agree">Terms</label>

<inputtype="checkbox"class="checkbox"name="terms"value="agree"/>

</div>

<inputtype="submit"name="submit"class="submit"value="Submit">

</form>

<!--includefooter-->

<?php$this->load->view('common/footer');?>

Views/success_view.php

<!--loadheader-->

<?php$this->load->view('common/header');?>

<!--maincontent-->

<h3>Formwassubmittedsuccessfully!</h3>

<!--loadfooter-->

<?php$this->load->view('common/footer');?>

在显示成功页面中,只是简单显示一句成功提交的信息即可。

设置CSS

下面为了表单的美观,我们设置一下CSS,注意我们使用的是CSS3,代码如下:

body{

font-family:arial,verdana,sans-serif;

color:#333333;

font-size:13px;

margin:0auto;

background:#f5f5f5;

}

#wrapper{

margin:0auto;

position:relative;

background:#FFFFFF;

width:900px;

border:10pxsolid#eaeaea;

}

#form{

padding:10px;

}

#form.field{

margin-bottom:15px;

}

#formlabel{

display:block;

float:left;

font-weight:bold;

margin-right:10px;

text-align:right;

width:120px;

line-height:35px;

font-size:14px;

cursor:pointer;

}

#form.checkbox{

margin-top:10px;

}

#form.input{

-moz-border-radius:7px;

-webkit-border-radius:7px;

background-color:#eaeaea;

background:-moz-linear-gradient(top,#ffffff,#f2f2f2);

background:-webkit-gradient(linear,lefttop,leftbottom,

color-stop(0.0,#ffffff),color-stop(1.0,#f2f2f2));

border:1pxsolid#cacaca;

font-family:inherit;

color:#797979;

font-size:15px;

padding:8px10px;

width:300px;

font-weight:bold;

}

#form.state{

border:1pxsolid#b9bdc1;

padding:5px;

font-size:15px;

font-family:inherit;

font-weight:bold;

color:#797979;

}

#form:focus{

-webkit-box-shadow:0px0px4px#aaa;

-moz-box-shadow:0px0px4px#aaa;

box-shadow:0px0px4px#aaa;

}

#form.gender-fields{

padding-top:10px;

}

#formspan.error{

color:red;

padding-left:10px;

}

#form.info{

margin-left:130px;

font-size:12px;

font-style:italic;

color:#999;

}

#form.submit{

-moz-border-radius:15px;

-webkit-border-radius:15px;

font-family:arial,verdana,sans-serif;

background-color:#dedede;

background:-moz-linear-gradient(top,#ffffff,#eaeaea);

background:-webkit-gradient(linear,lefttop,leftbottom,

color-stop(0.0,#ffffff),color-stop(1.0,#eaeaea));

border:1pxsolid#dedede;

color:#484848;

font-size:14px;

font-weight:bold;

padding:8px10px;

cursor:pointer;

margin-left:220px;

}

/*--Tabledesigntodisplaydatainsuccessview--*/

#display_data{

padding:10px;

}

#display_data.name{

font-style:italic;

text-decoration:underline;

}

#display_datatable{

border:1pxsolid#e5eff8;

margin:10px0px;

border-collapse:collapse;

}

#display_datatr.even{

background:#f7fbff

}

#display_datatr.odd.title{

background:#f4f9fe;

}

#display_datatd{

border-bottom:1pxsolid#e5eff8;

border-right:1pxsolid#e5eff8;

color:#678197;

padding:5px8px;

}

#display_datatd.title{

font-weight:bold;

width:100px;

text-align:right;

}

#display_datatd.info{

font-style:italic;

width:200px;

}

#footer{

width:60%;

margin:20pxauto;

}

编写CodeIgniter的控制层文件

接下来,我们要在CodeIgniter中编写控制层文件,以加载视图文件,将控制层文件命名为form.php,放在applications/controller文件夹中,代码为:

classFormextendsCI_Controller{

publicfunctionindex()

{

$this->load->view('form_view');

}

现在,我们已经可以看下表单的效果了,在浏览器中输入如下URL访问:

http://localhost/form_validation/index.php/form

即可看到如下图界面:

设置jQueryValidate插件进行验证

jQueryValidate插件设置了大量常见的验证规则,如验证email,电话,日期等。我们先看下如何定义设置jQueryValidate的验证规则,比如定义了两个规则,分别验证用户名和email:

 email:{

required:true,

email:true

},

name:{

required:true,

minlength:3,

maxlength:25,

},

其中,required属性设置为true,表明该字段需要进行验证。比如这里设置了名称字段需要验证,最小输入的长度为3,最长的长度为25。而如果我们要新增加自己的校验规则,比如要名称字段只能输入的是字母,则可以编写自己的校验方法,并且使用正则表达式,代码如下:

 $.validator.addMethod("lettersonly",function(value,element){

returnthis.optional(element)||/^[a-z]+$/i.test(value);

},"Pleaseenteronlyletters");

这里,通过addMethod方法,增加了一个名为lettersonly的校验方法,并且使用正则表达式。下面是完成的一个js校验文件,如下:  

(document).ready(function(){

jQuery.validator.addMethod("lettersonly",function(value,element){

returnthis.optional(element)||/^[a-z]+$/i.test(value);

},"Pleaseenteronlyletters");

//validatecontactformonkeyupandsubmit

$("#form").validate({

//settherulesforthefildnames

rules:{

name:{

required:true,

minlength:3,

maxlength:25,

lettersonly:true

},

email:{

required:true,

email:true

},

password:{

required:true,

minlength:5,

maxlength:15

},

gender:{

required:true

},

state:{

required:true

},

agree:{

required:true

},

},

//设置错误信息

messages:{

name:{

required:"Nameisrequired..",

},

password:{

required:"Pleaseprovideapassword.",

minlength:"Passwordmustbeatleast5characterslong",

maxlength:"Passwordcannotbemorethan15characters"

},

email:"Validemailisrequired.",

agree:"Youmustagreetoourterms.",

gender:"Genderisrequired",

state:"Selectstate"

},

//错误提示信息的放置位置

errorElement:"span",

errorPlacement:function(error,element){

error.appendTo(element.parent());

}

});

});

这里,通过设置messages来设置当用户填入非法数据时,要显示的提示信息,而errElement和errorPlacement中,则分别设置了当出现错误时,错误信息追加在页面上显示的位置

服务端CodeIgniter的验证

接下来,我们要编写服务端的验证。首先,我们要通过引入CodeIgniter中库文件的验证助手类,即:

$this->load->library('form_validation');

然后设置验证规则,比如象名称字段,设置规则为:

$this->form_validation->set_rules('name','Name','trim|required|alpha|min_length[3]|max_length[25]');

即名称字段必须为字母,最小长度为3,最大长度为25,该字段不能为空。

当服务端验证通过后,返回到成功页,验证失败后返回到失败提示信息页,如下:

 if($this->form_validation->run()===FALSE)

{

$this->load->view('form_view');

}

else

{

$this->load->view('success_view');

}

显示表单的错误信息

我们再在表单的每个字段中,添加显示服务端验证的出错信息的代码,比如:  

Name

CodeIgniter默认显示表单错误信息是用段落的形式,不大友好,我们修改下验证助手的设置方法,设置成在每个表单字段后,用进行分隔,即: 

$this->form_validation->set_error_delimiters('','');

在通过了客户端浏览器及服务端的双重验证后,就可以提交数据,保存到数据库了,我们这个例子中不保存到数据库,只是简单再次罗列出来,代码如下: 

$this->name=$this->security->xss_clean($this->input->post('name'));

$this->email=$this->security->xss_clean($this->input->post('email'));

//loadthedata

$data['name']=$this->name;

$data['password']=$this->password;

$this->load->vars($data);

$this->load->view('success_view');

注意这里,我们还调用了xss_clean方法防止跨站RSS攻击。

最后,完成的控制层代码如下: 

 application/controllers/form.php

classFormextendsCI_Controller{

publicfunctionindex()

{

$this->load->view('form_view');

}

publicfunctionprocess()

{

$this->load->library('form_validation');

$this->form_validation->set_error_delimiters('','');

$this->form_validation->set_rules('name','Name','trim|required|alpha|min_length[3]|max_length[15]');

$this->form_validation->set_rules('password','Password','trim|required|min_length[4]|max_length[15]');

$this->form_validation->set_rules('email','Emailaddress','trim|required|valid_email');

$this->form_validation->set_rules('gender','Gender','required');

$this->form_validation->set_rules('state','State','required');

$this->form_validation->set_rules('terms','Terms','required');

//设置校验显示信息

$this->form_validation->set_message('min_length','Minimumlengthfor%sis%scharacters');

$this->form_validation->set_message('max_length','Maximumlengthfor%sis%scharacters');

if($this->form_validation->run()===FALSE)

{

$this->load->view('form_view');

}

else

{

$this->name=$this->security->xss_clean($this->input->post('name'));

$this->password=$this->security->xss_clean($this->input->post('password'));

$this->email=$this->security->xss_clean($this->input->post('email'));

$this->gender=$this->input->post('gender');

$this->state=$this->input->post('state');

$this->terms=$this->input->post('terms');

$data['name']=$this->name;

$data['password']=$this->password;

$data['email']=$this->email;

$data['gender']=$this->gender;

$data['state']=$this->state;

$data['terms']=$this->terms;

//loadthedataandsuccessview.

$this->load->vars($data);

$this->load->view('success_view');

}

}

}

当用户的输入完全正确后,success_view的视图页面代码如下所示,显示用户输入的字段信息: 

views/success_view.php

load->view('common/header');?>

Thankyou,

Formwassubmittedsuccessfully!

Wehavereceivedfollowingdata:

Yourname:

Email:

Password:

Gender:

State:

Terms:

load->view('common/footer');?>

最后,读者可以在这里(http://gazpo.com/gazpo-files/tut10-form/form_validation.zip)下载本文的代码。

相关推荐