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 Form

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 加载到您的浏览器中。然后点击“创建联系人”而不输入任何值。

CodeIgniter Form Validation

摘要

  • 表单提供了一种用户与应用程序交互并提交数据的方式。
  • HTML 非常棒,易于理解和编写,但 CodeIgniter 让事情变得更加简单。CodeIgniter 具有创建 HTML 表单的内置函数。
  • 验证在处理表单数据时起着至关重要的作用。
  • 在本教程中,我们了解了主要的验证策略及其优缺点。我们还学习了如何使用 CodeIgniter 的内置验证库设置验证规则和自定义错误消息。我们通过在实际应用程序中实现所学的知识来结束课程。