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>

这里,

  • …是表单的开始和结束标签。id 和 name 属性指定表单的名称和 id。method 属性指定要使用的 HTTP 动词。这通常由 POST 动词指定
  • 指定表单元素,name属性为提交给后端服务器处理的变量名。

CodeIgniter 表单助手

HTML 很棒,易于理解和编写,但是 使事情变得更加简单。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 Verb,并将操作 URL 设置为 create_user.php
  • echo form_label('User Id', 'user_id'); 为名称为 user_id 的输入字段创建一个名为“User Id”的标签。
  • echo form_input(['name' => 'user_id']); 创建一个名为 user_id 的文本类型的输入字段
  • echo form_submit('btnSubmit', '创建用户'); 创建一个带有创建用户标签的提交按钮
  • echo form_close(); 关闭表单

从上面的 CodeIgniter 代码中可以看出,表单助手让我们能够轻松地使用纯 PHP 创建表单。通过将属性传递给表单助手方法,我们可以自定义为表单生成的 HTML。

上述代码生成以下 HTML 表单代码

        <form action="http://localhost: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 加载到我们的网络浏览器中。

http://localhost:3000/contacts/create

如果你已经创建了教程项目,那么你应该能够看到以下内容

CodeIgniter 表单

CodeIgniter 中的表单验证

验证在处理表单数据时起着非常关键的作用。假设用户正在网站上注册;我们要确保他们填写了所需的详细信息和电子邮件地址。我们需要确保输入的电子邮件地址有效。如果我们使用日期值,那么我们要确保日期范围有效。我们不必接受一个月有 32 天的日期等。

验证解决了上述问题。在使用 Web 应用程序时,CodeIgniter 验证在两个方面完成。

客户端验证由 Web 浏览器完成。这通常涉及使用 HTML 和 Java脚本。客户端验证可以提高性能,因为一切都在客户端完成。因此,无需将数据提交到服务器。客户端验证的缺点是用户可以控制它。如果你依赖 Java脚本验证并且用户禁用 Java浏览器中的脚本,那么您的验证将会失败。

服务器端验证是在服务器端完成的。这种验证的缺点是用户必须将数据提交给服务器进行处理并等待响应。这会占用网络资源并可能降低性能。服务器端验证的主要优点是您可以更好地控制,并且即使用户禁用,您也可以确保您的验证规则正常工作 Java浏览器中的脚本。

更好的策略是使用客户端作为主要验证策略,并使用服务器端作为后备机制。

添加表单验证规则

CodeIgniter 有一个内置的验证库。使用以下代码加载该库

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

CodeIgniter 表单验证库可用于执行以下操作

  • 检查必填字段。这将检查提交的值,如果标记为必填的字段没有值,则返回错误
  • 数据类型验证——某些字段可能只需要数字值。如果检测到非数字值,则库将返回错误。表单提交的执行也会中止。
  • 长度验证——某些数据类型要求字段具有一定的最小或最大字符数。在这种情况下,验证库非常有用。
  • 数据清理——出于安全原因,验证库还具有从提交的数据中删除恶意代码的功能。例如,如果提交的值有活动 Java其中的脚本或 SQL 注入代码,验证库会剥离有害代码并使其无用。
  • 验证唯一数据库字段 – 假设您有一个表单,用户使用电子邮件地址进行注册。您需要确保电子邮件地址是唯一的。该库可让您轻松地根据数据库表和字段检查提交的数据。这样您就可以知道该值已被占用。

验证规则使用以下格式设置

$this->form_validation->set_rules('field','human readable field','rule',['custom message']);

这里,

  • ‘field’ 指定要由库验证的表单字段名称
  • 'human readable field' 指定验证字段的人性化格式。当发生错误时,会将其显示给用户。
  • ‘rule’ 指定要应用的验证规则,例如必需、数字、检查最小长度是否为……等等。
  • ['custom message'] 是可选的,可用于设置当验证规则失败时应显示的自定义验证消息。

以下是 CodeIgniter 中用于验证联系人姓名的表单提交示例

$this->form_validation->set_rules('contact_number', 'Contact Number', 'required');

这里,

  • 上述代码检查是否已输入字段 contact_number。如果未设置,则返回错误,提示“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';

现在让我们在联系人控制器中加载表单验证库并设置一些验证规则。

修改代码,如下面的 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 代码中的创建视图,如下面的表单验证 CodeIgniter 示例所示:

<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>

这里,

  • 我们会显示验证过程中发生的错误(如果有)
  • 设置先前设置的值(如果有)

您需要将以下 URL 加载到 Web 浏览器中。然后单击“创建联系人”,无需输入任何值

CodeIgniter 表单验证

结语

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