作为Web应用程序开发人员,表单验证是您工作的关键部分,因此不应低估它,因为它可能导致应用程序中的安全漏洞。 如果您正在努力提供专业的最终用户体验,则应该考虑这是必须的。
在本文中,我们将遍历CodeIgniter框架中的内置表单验证库。
这是今天文章的重点:
- 基本表格验证
- 级联和准备
- 自定义错误消息
- 自定义验证回调
- 验证配置
通过基本验证规则
在本节中,我们将介绍CodeIgniter中的基本表单验证概念。
作为其中的一部分,我们需要创建控制器并查看文件。 控制器文件将加载验证库并针对提交的表单数据运行验证规则。 视图文件包含XHTML形式的代码,我们将根据需要对其进行简化。
让我们继续创建这两个文件。
使用以下内容创建控制器文件application/controllers/Validation.php
。
<?php
// application/controllers/Validation.php
defined('BASEPATH') OR exit('No direct script access allowed');
class Validation extends CI_Controller {
public function __construct()
{
parent::__construct();
// load form and url helpers
$this->load->helper(array('form', 'url'));
// load form_validation library
$this->load->library('form_validation');
}
public function basic()
{
// basic required field
$this->form_validation->set_rules('text_field', 'Text Field One', 'required');
// basic required field with minimum length
$this->form_validation->set_rules('min_text_field', 'Text Field Two', 'required|min_length[8]');
// basic required field with maximum length
$this->form_validation->set_rules('max_text_field', 'Text Field Three', 'required|max_length[20]');
// basic required field with exact length
$this->form_validation->set_rules('exact_text_field', 'Text Field Four', 'required|exact_length[12]');
// basic required field but alphabets only
$this->form_validation->set_rules('alphabets_text_field', 'Text Field Five', 'required|alpha');
// basic required field but alphanumeric only
$this->form_validation->set_rules('alphanumeric_text_field', 'Text Field Six', 'required|alpha_numeric');
// basic email field with email validation
$this->form_validation->set_rules('valid_email_field', 'Email Field', 'required|valid_email');
// password field with confirmation field matching
$this->form_validation->set_rules('password_field', 'Password One', 'required');
$this->form_validation->set_rules('password_confirmation_field', 'Password Confirmation Field', 'required|matches[password_field]');
// basic required field with IPv4 validation
$this->form_validation->set_rules('valid_ip_field', 'Valid IP Field', 'required|valid_ip[ipv4]');
if ($this->form_validation->run() == FALSE)
{
$this->load->view('validate_form');
}
else
{
// load success template...
echo "It's all Good!";
}
}
public function cascade()
{
// basic required field with cascaded rules
$this->form_validation->set_rules('text_field', 'Text Field One', 'required|alpha|min_length[8]|max_length[20]');
if ($this->form_validation->run() == FALSE)
{
$this->load->view('validate_form');
}
else
{
// load success template...
echo "It's all Good!";
}
}
public function prep()
{
// basic required field with trim prepping applied
$this->form_validation->set_rules('min_text_field', 'Text Field Two', 'trim|required|min_length[8]');
if ($this->form_validation->run() == FALSE)
{
$this->load->view('validate_form');
}
else
{
// load success template...
echo "It's all Good!";
}
}
public function custom_message()
{
// basic required field with trim prepping applied
$this->form_validation->set_rules('alphabets_text_field', 'Text Field Five', 'required|alpha',
array('required'=>'Please enter Text Field Five!','alpha'=>'Only alphabets please!'));
if ($this->form_validation->run() == FALSE)
{
$this->load->view('validate_form');
}
else
{
// load success template...
echo "It's all Good!";
}
}
public function custom_rule()
{
// basic required field with trim prepping applied
$this->form_validation->set_rules('text_field', 'Text Field Five', 'callback_custom_validation');
if ($this->form_validation->run() == FALSE)
{
$this->load->view('validate_form');
}
else
{
// load success template...
echo "It's all Good!";
}
}
public function custom_validation($field_value)
{
if ($field_value == '' || $field_value == 'demo')
{
$this->form_validation->set_message('custom_validation', "Come on, don't act like spammer!");
return FALSE;
}
else
{
return TRUE;
}
}
public function configuration()
{
// if you pass group id, only elements in that group will be validated
// $this->form_validation->run('group_one')
if ($this->form_validation->run() == FALSE)
{
$this->load->view('validate_form');
}
else
{
// load success template...
echo "It's all Good!";
}
}
}
接下来,如下所示创建视图文件application/views/validate_form.php
。
<html>
<head>
<title>Form Validation Example</title>
<style>
.field_title{font-size: 13px;font-family:Arial;width: 300px;margin-top: 10px}
.form_error{font-size: 13px;font-family:Arial;color:red;font-style:italic}
</style>
</head>
<body>
<div class="form_error">
<?php echo validation_errors(); ?>
</div>
<?php echo form_open(); ?>
<h2>Form Validation Example</h2>
<div>
<div class="field_title">Text Field One (Required)</div>
<input type="text" name="text_field" value="<?php echo set_value('text_field'); ?>" size="30" />
</div>
<div>
<div class="field_title">Text Field Two (Minimum length)</div>
<input type="text" name="min_text_field" value="<?php echo set_value('min_text_field'); ?>" size="30" />
</div>
<div>
<div class="field_title">Text Field Three (Maximum length)</div>
<input type="text" name="max_text_field" value="<?php echo set_value('max_text_field'); ?>" size="30" />
</div>
<div>
<div class="field_title">Text Field Four (Exact length)</div>
<input type="text" name="exact_text_field" value="<?php echo set_value('exact_text_field'); ?>" size="30" />
</div>
<div>
<div class="field_title">Text Field Five (Alphabets only)</div>
<input type="text" name="alphabets_text_field" value="<?php echo set_value('alphabets_text_field'); ?>" size="30" />
</div>
<div>
<div class="field_title">Text Field Six (Alphanumeric only)</div>
<input type="text" name="alphanumeric_text_field" value="<?php echo set_value('alphanumeric_text_field'); ?>" size="30" />
</div>
<div>
<div class="field_title">Email Field</div>
<input type="text" name="valid_email_field" value="<?php echo set_value('valid_email_field'); ?>" size="30" />
</div>
<div>
<div class="field_title">Password Field</div>
<input type="password" name="password_field" value="" size="30" />
</div>
<div>
<div class="field_title">Password Confirmation Field</div>
<input type="password" name="password_confirmation_field" value="" size="30" />
</div>
<div>
<div class="field_title">IP Field</div>
<input type="text" name="valid_ip_field" value="<?php echo set_value('valid_ip_field'); ?>" size="30" />
</div>
<div class="field_title">
<input type="submit" value="Submit" />
</div>
</form>
</body>
</html>
使用此设置,在浏览器中运行http:// your-codeigniter-site / validation / basic时,您应该会看到一个表单。 尝试提交它而不填写任何表单字段,您将看到错误消息列表! 如果您不了解它是如何工作的,请不要担心,因为我们将详细介绍每段代码。
故事从__construct
方法开始。
public function __construct()
{
parent::__construct();
// load form and url helpers
$this->load->helper(array('form', 'url'));
// load form_validation library
$this->load->library('form_validation');
}
我总是喜欢在控制器本身的构造函数中加载公共库和帮助程序,因为这是避免在控制器方法中其他地方重复代码的好习惯。 这正是我们上面所做的—我们加载form
和url
帮助器,以便我们可以在应用程序的其余部分中使用这些帮助器提供的实用程序方法。
接下来,我们加载表单验证库,以便它允许我们将表单验证规则绑定到表单元素上,正如我们将在下一节中看到的那样。
让我们看一下basic
方法的代码。 这种方法有什么作用? 如果使用GET
方法调用它,它将显示该表单,如果使用POST
方法调用它,它将对提交的数据应用验证规则,并在表单中显示错误消息(如果有)。
public function basic()
{
// basic required field
$this->form_validation->set_rules('text_field', 'Text Field One', 'required');
// basic required field with minimum length
$this->form_validation->set_rules('min_text_field', 'Text Field Two', 'required|min_length[8]');
// basic required field with maximum length
$this->form_validation->set_rules('max_text_field', 'Text Field Three', 'required|max_length[20]');
// basic required field with exact length
$this->form_validation->set_rules('exact_text_field', 'Text Field Four', 'required|exact_length[12]');
// basic required field but alphabets only
$this->form_validation->set_rules('alphabets_text_field', 'Text Field Five', 'required|alpha');
// basic required field but alphanumeric only
$this->form_validation->set_rules('alphanumeric_text_field', 'Text Field Six', 'required|alpha_numeric');
// basic email field with email validation
$this->form_validation->set_rules('valid_email_field', 'Email Field', 'required|valid_email');
// password field with confirmation field matching
$this->form_validation->set_rules('password_field', 'Password One', 'required');
$this->form_validation->set_rules('password_confirmation_field', 'Password Confirmation Field', 'required|matches[password_field]');
// basic required field with IPv4 validation
$this->form_validation->set_rules('valid_ip_field', 'Valid IP Field', 'required|valid_ip[ipv4]');
if ($this->form_validation->run() == FALSE)
{
$this->load->view('validate_form');
}
else
{
// load success template...
echo "It's all Good!";
}
}
由于我们已经在构造函数中加载了表单验证库,因此可以使用$this->form_validation
约定来访问它。
set_rules
方法用于在表单字段上绑定验证规则。 通常,它需要三个参数:
- 第一个参数是表单字段的名称。
- 第二个参数是一个标签,用于在显示该字段的错误消息时引用该字段。
- 第三个参数是要应用于表单字段的规则。 表单验证库带有许多内置规则,您已经可以使用它们。
在基本方法中使用它们时,让我们仔细研究其中一些规则。
最常用的规则之一是required
规则,它使表单字段成为required
字段。
// basic required field
$this->form_validation->set_rules('text_field', 'Text Field One', 'required');
接下来,如果要创建一定长度的表单字段,则可以使用min_length
和max_length
规则。
// basic required field with minimum length
$this->form_validation->set_rules('min_text_field', 'Text Field Two', 'required|min_length[8]');
// basic required field with maximum length
$this->form_validation->set_rules('max_text_field', 'Text Field Three', 'required|max_length[20]');
第一个确保min_text_field
表单字段是min_text_field
字段,并且用户必须在其中至少输入八个字符。 第二个限制了max_text_field
文本字段中可以输入的最大字符数,并使其成为max_text_field
字段。
您可能已经注意到我们使用了|
操作员一次应用多个规则。 这称为级联,稍后我们将再讨论。
在另一方面,如果你想确切长度的表单域,您可以使用exact_length
规则。
// basic required field with exact length
$this->form_validation->set_rules('exact_text_field', 'Text Field Four', 'required|exact_length[12]');
如果您只想将表单字段验证为字母或字母数字怎么办?
// basic required field but alphabets only
$this->form_validation->set_rules('alphabets_text_field', 'Text Field Five', 'required|alpha');
// basic required field but alphanumeric only
$this->form_validation->set_rules('alphanumeric_text_field', 'Text Field Six', 'required|alpha_numeric');
下一个候选者是电子邮件验证。
// basic email field with email validation
$this->form_validation->set_rules('valid_email_field', 'Email Field', 'required|valid_email');
接下来, matches
规则允许您将一个表单字段的值与另一个表单字段的值进行比较。 最好的例子是密码字段,当您提交表单时,该字段必须与密码确认字段匹配。
// password field with confirmation field matching rule
$this->form_validation->set_rules('password_field', 'Password One', 'required');
$this->form_validation->set_rules('password_confirmation_field', 'Password Confirmation Field', 'required|matches[password_field]');
我们基本方法中的最后一个示例是有关验证IP地址的。
valid_ip
规则根据传递的第一个参数验证IP地址。 在以下示例中,我们只在寻找ipv4类型的IP地址!
// basic required field with IPv4 validation
$this->form_validation->set_rules('valid_ip_field', 'Valid IP Field', 'required|valid_ip[ipv4]');
这样就可以在CodeIgniter中进行基本验证。
级联和准备工作如何进行
在本节中,我们将探索级联和准备,这使您可以一次组合多个验证规则。
实际上,我想说的是我们在先前的示例中已经完全使用了级联。 回忆一下曾经用来组合多个规则的管道运算符,是的,所谓的级联验证规则。
抓住cascade
方法的代码。
public function cascade()
{
// basic required field with cascaded rules
$this->form_validation->set_rules('text_field', 'Text Field One', 'required|alpha|min_length[8]|max_length[20]');
if ($this->form_validation->run() == FALSE)
{
$this->load->view('validate_form');
}
else
{
// load success template...
echo "It's all Good!";
}
}
如上例所示,我们应用了四个验证规则,并以|
分隔|
运算符到text_field
文本框。 因此,在这种情况下,必须通过每条规则才能使表单验证成功!
试试看,看看它是如何工作的!
接下来,有一个准备工作,使您可以对正在提交的数据进行某些操作。 通常,您希望删除用户提交的数据中的前导和尾随空格。 在这种情况下,您想到的第一件事可能是使用修剪功能,而且好消息是您可以使用它!
这正是我们的prep
方法所要做的。
public function prep()
{
// basic required field with trim prepping applied
$this->form_validation->set_rules('min_text_field', 'Text Field Two', 'trim|required|min_length[8]');
if ($this->form_validation->run() == FALSE)
{
$this->load->view('validate_form');
}
else
{
// load success template...
echo "It's all Good!";
}
}
如您所见,除了验证规则之外,我们还使用了trim
一词。 因此,首先对数据进行裁剪,然后再通过其他验证规则。 实际上,根据CodeIgniter文档,您可以使用任何带有单个参数的PHP函数。
尝试通过添加一些尾随空格来运行我们的示例,然后看看它如何进行。
自定义错误消息
如果您有机会运行以上示例,您可能已经注意到,显示给用户的错误消息非常系统化,并且是机器生成的。 也许您想更具创意,并在某些情况下进行更改。
让我们看看如何更改任何验证规则的错误消息。 输入custom_message
方法的代码。
public function custom_message()
{
// field with custom error message
$this->form_validation->set_rules('alphabets_text_field', 'Text Field Five', 'required|alpha',
array('required'=>'Please enter Text Field Five!','alpha'=>'Only alphabets please!'));
if ($this->form_validation->run() == FALSE)
{
$this->load->view('validate_form');
}
else
{
// load success template...
echo "It's all Good!";
}
}
请注意提供给set_rules
方法的第四个参数。 它包含每个验证规则的自定义验证消息数组,每个数组项的关键字是验证规则本身。
array(
'required'=>'Please enter Text Field Five!',
'alpha'=>'Only alphabets please!'
)
试试看,您应该会看到我们的自定义错误消息! 太酷了吧?
自定义验证回调
尽管内置的验证库已经提供了一些验证规则,但始终需要在日常开发工作中创建自定义代码。 这正是我们将在本节中讨论的内容。
为了演示这一点,我们将创建一个自定义验证回调,稍后我们将了解如何将其与set_rules
方法一起使用。
首先,让我们快速看一下custom_rule
方法。
public function custom_rule()
{
// field with custom validation callback passed
$this->form_validation->set_rules('text_field', 'Text Field Five', 'callback_custom_validation');
if ($this->form_validation->run() == FALSE)
{
$this->load->view('validate_form');
}
else
{
// load success template...
echo "It's all Good!";
}
}
它与通常的set_rules
方法调用没有什么不同,除了我们提供了自定义验证回调custom_validation
而不是任何核心验证规则。 这里要注意的重要一点是,在将自定义验证回调作为参数传递时,需要在其前面加上callback_
。
接下来,让我们实现自定义验证回调。
public function custom_validation($field_value)
{
if ($field_value == '' || $field_value == 'demo')
{
$this->form_validation->set_message('custom_validation', "Come on, don't act like spammer!");
return FALSE;
}
else
{
return TRUE;
}
}
调用自定义验证回调时,用户输入的值将作为第一个参数传递。 因此, $field_value
包含用户输入的值,您可以针对该值实现自定义验证逻辑。
在上面的示例中,如果在文本字段Text Field Five
输入空白值或demo
,则应该看到错误消息。 重要的是要注意,当您使用set_message
方法设置错误消息时,第一个参数是自定义验证回调方法本身的名称。
这就是自定义验证回调的故事。
最后但并非最不重要的一点是,当我们朝本文的结论迈进时,验证配置值得引起注意。
验证配置
作为CodeIgniter开发人员,您应该已经熟悉config
目录,该目录允许您配置CodeIgniter应用程序的不同方面。
例如, database.php
允许您定义与数据库相关的设置,而autoload.php
允许您定义在应用程序引导期间应自动加载的组件。
以同样的方式,您可以在config
目录下创建form_validation.php
文件,并使用该文件来定义可在全球范围内使用的应用程序级验证规则。 如果您觉得这很陌生,那么没有比实际查看实际示例更好的理解方法了。
使用以下内容创建文件application/config/form_validation.php
。
<?php
$config = array(
array(
'field' => 'text_field',
'label' => 'Text Field One',
'rules' => 'required'
),
array(
'field' => 'min_text_field',
'label' => 'Text Field Two',
'rules' => 'required|min_length[8]'
),
array(
'field' => 'max_text_field',
'label' => 'Text Field Three',
'rules' => 'required|max_length[20]'
)
);
现在,让我们快速查看一下我们的configuration
方法。
public function configuration()
{
// if you pass group id, only elements in that group will be validated
// $this->form_validation->run('group_one')
if ($this->form_validation->run() == FALSE)
{
$this->load->view('validate_form');
}
else
{
// load success template...
echo "It's all Good!";
}
}
尝试运行http:// your-codeigniter-site / validation / configuration并提交一个空白表格。 您将看到三个表单字段的错误消息! 但是,等等,它们来自哪里,因为我们首先没有在配置方法中设置任何验证规则?
敏锐的眼睛用户会注意到,它是从application/config/form_validation.php
定义的验证配置文件中自动application/config/form_validation.php
。 那不是很神奇吗? 它使您可以将规则集中在一处,并减少操作方法中的代码重复。
实际上,您可以对规则进行分组,并将验证仅应用于特定组的字段。 让我们看看如何做到这一点。
用以下代码替换application/config/form_validation.php
的代码。
<?php
$config = array(
'group_one' => array(
array(
'field' => 'text_field',
'label' => 'Text Field One',
'rules' => 'required'
)
),
'group_two' => array(
array(
'field' => 'min_text_field',
'label' => 'Text Field Two',
'rules' => 'required|min_length[8]'
),
array(
'field' => 'max_text_field',
'label' => 'Text Field Three',
'rules' => 'required|max_length[20]'
)
)
);
在您的configuration
方法中,找到以下行:
if ($this->form_validation->run() == FALSE)
并替换为:
if ($this->form_validation->run('group_one') == FALSE)
现在,尝试提交一个空表单,您将看到仅Text Field One
的错误。 那是因为我们已经将group_one
作为组ID传递了,所以只有该组中的元素会被验证。
最后,让我们看一下允许您根据URL定义规则的配置类型。
用以下代码替换application/config/form_validation.php
中的代码。
$config = array(
'validation/configuration' => array(
array(
'field' => 'max_text_field',
'label' => 'Text Field Three',
'rules' => 'required|max_length[20]'
)
)
);
在这种类型的配置中,您需要使用控制器名称和方法名称(以/
字符分隔)的组合。 这样,您可以一次为多个操作方法定义规则。
现在,如果您尝试在http:// your-codeigniter-site / validation / configuration提交空表单,则应该看到Text Field Three
的错误消息。
到此为止,验证配置和本文的故事也结束了!
结论
在本文中,我们彻底讨论了CodeIgniter中的表单验证。
我们从基本验证规则开始我们的旅程,然后转到更高级的主题,例如级联,准备和配置验证。
希望您喜欢这篇文章,并且可以使用下面的feed分享您的宝贵意见!
翻译自: https://code.tutsplus.com/tutorials/codeigniter-form-validation-from-start-to-finish--cms-28768