CodeIgniter 表单验证及表单提交示例
CodeIgniter 中的表单
表单提供了一种用户与应用程序交互并提交数据的方式。它可以用于“联系我们”表单,网站访问者可以填写此表单并将信息发送给我们。收到的信息通常存储在数据库中或通过电子邮件发送。
HTML 表单结构
以下代码展示了一个典型的 HTML 表单结构。
<form id="frmUsers" name="frmUsers" method="POST" action="create_user.php"> <input type="text" id="user_id" name="user_id"> <input type="password" id="password" name="password"> <input type="submit" value="Submit"> </form>
此处,
- <form>…</form> 是表单的开始和结束标签。id 和 name 属性指定了表单的名称和 ID。method 属性指定要使用的 HTTP 动词。这通常由 POST 动词指定。
- <input…> 指定表单元素。name 属性是提交给后端服务器进行处理的变量名。
CodeIgniter 表单助手
HTML 非常棒,易于理解和编写,但 CodeIgniter 让事情变得更加简单。CodeIgniter 具有创建 HTML 表单的内置函数。
让我们考虑以下使用表单助手创建表单的 CodeIgniter 表单提交代码:
<?php echo form_open('create_user.php', ['id' => 'frmUsers']); echo form_label('User Id', 'user_id'); echo form_input(['name' => 'user_id']); echo form_label('Password', 'password'); echo form_input(['type' => 'password', 'name' => 'password']); echo form_submit('btnSubmit', 'Create User'); echo form_close(); ?>
此处,
- echo form_open(‘create_user.php’, [‘id’ => ‘frmUsers’]); 创建表单的开始标签,将操作设置为 POST 动词,并将操作 URL 设置为 create_user.php。
- echo form_label(‘用户 ID’, ‘user_id’); 创建一个显示“用户 ID”的标签,用于名为 user_id 的输入字段。
- echo form_input([‘name’ => ‘user_id’]); 创建一个文本类型的输入字段,名为 user_id。
- echo form_submit(‘btnSubmit’, ‘创建用户’); 创建一个带有“创建用户”标签的提交按钮。
- echo form_close(); 关闭表单。
正如您从上面的 CodeIgniter 代码中看到的,表单助手使我们能够轻松地使用纯 PHP 创建表单。通过将属性传递给表单助手方法,我们可以自定义为表单生成的 HTML。
上面的代码会生成以下 HTML 表单代码:
<form action="https://:3000/index.php/create_user.php" id="frmUsers" method="post" accept-charset="utf-8"> <label for="user_id">User Id</label> <input type="text" name="user_id" value=""/> <label for="password">Password</label> <input type="password" name="password" value=""/> <input type="submit" name="btnSubmit" value="Create User"/> </form>
使用表单助手的最大优势在于它能生成符合 HTML 标准的语义正确的代码。
您可以在 CodeIgniter 官方文档中找到更多详细信息。
https://codeigniter.com/user_guide/helpers/form_helper.html
CodeIgniter 表单示例
在介绍完 CodeIgniter 的基础知识后,让我们回到我们一直在本 CodeIgniter 教程系列中进行的项目。总而言之,该教程项目构建了一个联系人管理应用程序,该应用程序会将详细信息存储在数据库中。
创建联系人
在上一个教程中,我们为应用程序创建了路由和简单的视图。打开 application/views/contacts/create.php。
将 create.php 的代码修改如下:
<div class="column"> <h2 class="title">Create Contact</h2> <form action="<?= base_url('contacts/store') ?>" method="POST"> <div class="field"> <label class="label">Contact Name</label> <div class="control"> <input id="name" name="name" class="input" type="text" placeholder="Type the contact name"> </div> </div> <div class="field"> <label class="label">Contact Number</label> <div class="control"> <input id="name" name="name" class="input" type="text" placeholder="Type the contact number"> </div> </div> <div class="field"> <label class="label">Email Address</label> <div class="control"> <input id="email" name="email" class="input" type="email" placeholder="Type the email address"> </div> </div> <div class="field is-grouped"> <div class="control"> <button class="button is-link">Save Contact</button> </div> </div> </form> </div>
注意: 上面的代码使用纯 HTML 创建表单。
现在让我们看看我们的表单在浏览器中的样子。
在浏览器中加载以下 URL。
https://:3000/contacts/create
如果您一直在进行教程项目,那么您应该能看到以下内容:
CodeIgniter 中的表单验证
验证在处理表单数据时起着至关重要的作用。假设用户正在网站上注册;我们希望确保他们填写了必需的详细信息和电子邮件地址。我们需要确保输入的电子邮件地址是有效的。如果我们处理日期值,那么我们希望确保日期范围有效。我们不会接受一个月有 32 天的日期等等。
验证可以解决上述问题。在处理 Web 应用程序时,CodeIgniter 的验证在两个方面进行。
客户端验证是在 Web 浏览器端进行的。这通常涉及 HTML 和 JavaScript 的使用。客户端验证可以提高性能,因为所有操作都在客户端完成。因此,无需将数据提交到服务器。客户端验证的缺点是用户可以控制它。如果您依赖 JavaScript 进行验证,而用户在浏览器中禁用了 JavaScript,那么您的验证就会失败。
服务器端验证是在服务器端进行的。此验证的缺点是用户必须将数据提交到服务器进行处理并等待响应。这会消耗网络资源并可能降低性能。服务器端验证的主要优点是您可以更好地控制,并且即使用户在浏览器中禁用了 JavaScript,也能确保您的验证规则正常工作。
更好的策略是使用客户端作为主要的验证策略,服务器端作为备用机制。
添加表单验证规则
CodeIgniter 具有内置的验证库。该库使用以下行加载:
$this->load->library('form_validation');
CodeIgniter 表单验证库可用于执行以下一些操作:
- 检查必填字段。这会检查提交的值,如果标记为必填的字段没有值,则会返回错误。
- 数据类型验证 – 某些字段可能只需要数字值。如果检测到非数字值,则库会返回错误。表单提交的执行也会中止。
- 长度验证 – 某些数据类型要求字段具有特定的最小或最大字符数。在这种情况下,验证库会派上用场。
- 数据清理 – 出于安全原因,验证库还具有从提交的数据中删除恶意代码的功能。例如,如果提交的值包含活动的 JavaScript 或 SQL 注入代码,验证库会剥离有害代码并使其无效。
- 验证唯一的数据库字段 – 假设您有一个用户通过电子邮件地址注册的表单。您需要确保电子邮件地址是唯一的。该库使您可以轻松地将提交的数据与数据库表和字段进行匹配。这可以帮助您知道该值已被占用。
验证规则使用以下格式设置:
$this->form_validation->set_rules('field','human readable field','rule',['custom message']);
此处,
- ‘field’ 指定要由库验证的表单字段名称。
- ‘human readable field’ 指定正在验证的字段的可读格式。当发生错误时,它会显示给用户。
- ‘rule’ 指定要应用的验证规则,例如 required、numeric、检查最小长度是否为……等。
- [‘custom message’] 是可选的,可用于设置自定义验证消息,当验证规则失败时应显示该消息。
以下是一个 CodeIgniter 中的表单提交示例,用于验证联系人姓名:
$this->form_validation->set_rules('contact_number', 'Contact Number', 'required');
此处,
- 上面的代码检查是否输入了 contact_number 字段。如果未设置,则返回一条错误消息,指出“联系人号码字段是必填项”。
要针对设置的规则运行验证,我们使用验证库的以下函数:
$this->form_validation->run()
如果上面的代码返回 false,则表示一个或多个设置的规则失败。如果返回 true,则表示所有验证规则都已通过,您可以继续进行后续操作。
让我们来看更多验证规则的示例。假设您想验证一些字段,例如联系人姓名、号码和电子邮件地址,您可以使用以下代码来完成此操作。
$rules = array( array( 'field' => 'contact_name', 'label' => 'Contact Name', 'rules' => 'required' ), array( 'field' => 'contact_number', 'label' => 'Contact Number', 'rules' => 'required', 'errors' => array( 'required' => 'You must provide a %s.', ), ), array( 'field' => 'email_address', 'label' => 'Email Address', 'rules' => 'required' ) ); $this->form_validation->set_rules($rules);
此处,
- 在上面的 CodeIgniter 电子邮件验证示例中,我们为 set_rules 函数提供了具有规则的字段数组。当您验证某些字段时,这会更容易。
唯一性验证
如果我们想验证联系电话以确保我们不会重复保存相同的号码,我们可以使用以下规则来执行此操作。
$this->form_validation->set_rules('contact_number', 'Contact Number','required|is_unique[contacts.contact_number]');
此处,
- | 用于管道连接多个规则。
- is_unique[contacts.contact_number] 检查 contact_number 的值是否与数据库表 contacts 中 contact_number 字段的值唯一。
显示表单验证错误消息
如果在表单处理过程中发生错误,您可以使用以下代码显示发生的验证错误:
<?php echo validation_errors(); ?>
此处,
- 上面的函数返回所有发生的错误。
填充提交的表单数据:粘性表单
有些表单有许多字段,如果发生错误,您希望确保已正确添加的数据得以保留。验证库具有实现此目的的机制。我们通过使用以下代码来实现这一点。
<?php echo set_value('field_name'); ?>
此处,
- 上面的代码显示了用户输入的内容。
有关验证库中可用方法的完整参考指南,您可以参考 CodeIgniter 官方用户指南中的 API 文档。
https://codeigniter.com/userguide3/libraries/form_validation.html
CodeIgniter 表单验证示例
在这些教程系列中,我们一直在向我们的教程项目添加更多代码,这是一个联系人管理应用程序。在本节中,我们将加载验证库,并使用真实的应用程序示例了解如何将其付诸实践。
修改路由代码如下以包含 store 方法:
$route['default_controller'] = 'welcome'; $route['contacts'] = 'contacts'; $route['create'] = 'contacts/create'; $route['store'] = 'contacts/store'; $route['edit/:id'] = 'contacts/edit'; $route['update/:id'] = 'contacts/update'; $route['delete/:id'] = 'contacts/delete'; $routes['users'] = 'welcome/users';
现在,让我们在 Contacts 控制器中加载表单验证库并设置一些验证规则。
将代码修改如下面表单验证 CodeIgniter 示例所示:
<?php defined('BASEPATH') OR exit('No direct script access allowed'); class Contacts extends CI_Controller { public function __construct() { parent::__construct(); $this->load->helper('url', 'form'); $this->load->library('form_validation'); } public function index() { $this->load->view('header'); $this->load->view('contacts/index'); $this->load->view('footer'); } public function create() { $this->load->view('header'); $this->load->view('contacts/create'); $this->load->view('footer'); } public function store() { $rules = array( array( 'field' => 'contact_name', 'label' => 'Contact Name', 'rules' => 'required' ), array( 'field' => 'contact_number', 'label' => 'Contact Number', 'rules' => 'required', 'errors' => array( 'required' => 'You must provide a %s.', ), ), array( 'field' => 'email_address', 'label' => 'Email Address', 'rules' => 'required' ) ); $this->form_validation->set_rules($rules); if ($this->form_validation->run() == FALSE) { $this->load->view('header'); $this->load->view('contacts/create'); $this->load->view('footer'); } else { redirect(base_url('contacts')); } } public function edit($id) { $this->load->view('header'); $this->load->view('contacts/edit'); $this->load->view('footer'); } public function update($id) { $this->load->view('header'); $this->load->view('contacts/update'); $this->load->view('footer'); } public function delete($id) { $this->load->view('header'); $this->load->view('contacts/delete'); $this->load->view('footer'); } }
此处,
- $rules = array(…) 设置定义了验证规则。
- $this->form_validation->set_rules($rules); 设置了验证规则。
- if ($this->form_validation->run() == FALSE) {…} 运行验证规则,如果失败,则表单会重新显示并带有验证错误。如果验证通过,我们只是重定向到列表联系人页面。在正常情况下,我们会将数据写入数据库。我们将在下一个教程中介绍 数据库时执行此操作。
按如下所示修改 application/contacts/create.php 中的 create 视图代码:
<div class="column"> <h2 class="title">Create Contact</h2> <div class="notification is-danger"> <?php echo validation_errors(); ?> </div> <form action="<?= base_url('contacts/store') ?>" method="POST"> <div class="field"> <label class="label">Contact Name</label> <div class="control"> <input id="contact_name" name="contact_name" class="input" type="text" value="<?php echo set_value('contact_name'); ?>" placeholder="Type the contact name"> </div> </div> <div class="field"> <label class="label">Contact Number</label> <div class="control"> <input id="contact_number" name="contact_number" class="input" type="text" value="<?php echo set_value('contact_number'); ?>" placeholder="Type the contact number"> </div> </div> <div class="field"> <label class="label">Email Address</label> <div class="control"> <input id="email_address" name="email_address" class="input" type="email" value="<?php echo set_value('email_address'); ?>" placeholder="Type the email address"> </div> </div> <div class="field is-grouped"> <div class="control"> <button class="button is-link">Save Contact</button> </div> </div> </form> </div>
此处,
- <?php echo validation_errors(); ?> 我们显示在验证过程中发生的任何错误。
- <?php echo set_value(‘contact_name’); ?> 设置之前设置的值(如果有)。
您需要将以下 URL 加载到您的浏览器中。然后点击“创建联系人”而不输入任何值。
摘要
- 表单提供了一种用户与应用程序交互并提交数据的方式。
- HTML 非常棒,易于理解和编写,但 CodeIgniter 让事情变得更加简单。CodeIgniter 具有创建 HTML 表单的内置函数。
- 验证在处理表单数据时起着至关重要的作用。
- 在本教程中,我们了解了主要的验证策略及其优缺点。我们还学习了如何使用 CodeIgniter 的内置验证库设置验证规则和自定义错误消息。我们通过在实际应用程序中实现所学的知识来结束课程。