CodeIgniter Active Record:插入、更新、删除查询

⚡ 智能摘要

CodeIgniter Active Record 是一种设计模式,它允许模型使用简单、安全的方法链来读取和写入数据库。它支持跨不同数据库引擎的插入、选择、更新和删除操作,无需重写代码,并且通过参数化输入来防止 SQL 注入。

  • 🔗 核心理念: Active Record 将 SQL 封装在 insert、get、update 和 delete 等方法调用中。
  • 🛡️ 安全: 值以参数形式传递,这样可以防止 SQL 注入。
  • 🔄 便携式: 相同的代码可以跨平台运行。 MySQL,SQL Server 和其他服务器通过数据库驱动程序进行访问。
  • ⚙️ 建立: 配置 database.php 并自动加载数据库库。
  • 插: $this->db->insert('table', $data) 构建并运行 INSERT 语句。
  • 🔍 选择: $this->db->get('table') 返回要循环遍历的行。
  • ✏️ 更新和删除: WHERE 子句加上 UPDATE 或 DELETE 语句可以更改或删除行。

CodeIgniter Active Record CRUD

数据是大多数应用程序的命脉。数据需要存储,以便进行分析,从而提供洞察并辅助业务决策。数据通常存储在数据库中。与数据库交互时,主要关注点包括安全性、易用性以及数据库供应商对结构化查询语言 (SQL) 的特定实现。

Active Record 是一种设计模式,它能够以安全且简洁的方式轻松与数据库进行交互。Active Record 具有以下优点:

  • 使用简单的方法链插入、更新和删除记录。
  • 使用参数安全地提交用户输入。
  • 允许您使用多个数据库引擎,例如 MySQL 无需重写应用程序代码即可使用 SQL Server。
  • CodeIgniter 在后台使用针对每个数据库引擎的特定驱动程序。

如何使用 Active Record:示例

在本教程中,我们将使用一个包含两个表的示例数据库,一个表存储订单信息,另一个表存储详细信息。本教程假设您已拥有一个…… MySQL 数据库已安装并运行。运行以下脚本创建教程数据库:

CREATE SCHEMA ci_active_record;

USE ci_active_record;

CREATE TABLE `order_details` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`order_id` int(11) DEFAULT NULL,
`item` varchar(245) DEFAULT NULL,
`quantity` int(11) DEFAULT '0',
`price` decimal(10,2) DEFAULT '0.00',
`sub_total` decimal(10,2) DEFAULT '0.00',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT = 1;

CREATE TABLE `orders` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`date` timestamp NULL DEFAULT NULL,
`customer_name` varchar(245) DEFAULT NULL,
`customer_address` varchar(245) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT = 1;

上述代码创建了一个名为 ci_active_record 的数据库和两个表:orders 和 order_details。这两个表之间的关系由 orders 表中的 id 列和 order_details 表中的 order_id 列定义。

CodeIgniter 数据库配置

现在我们将配置应用程序以与此数据库通信。打开位于 application/config/database.php 的数据库配置文件,并找到以下几行:

'hostname' => 'localhost',
'username' => '',
'password' => '',
'database' => '',

将上述代码更新为以下内容:

'hostname' => 'localhost',
'username' => 'root',
'password' => 'letmein',
'database' => 'ci_active_record',

注意: 您需要将用户名和密码替换为您与您的用户名和密码匹配的用户名和密码。 MySQL 组态。

除了数据库配置详情之外,我们还需要告知 CodeIgniter 会在加载时加载数据库库。

步骤1) 打开以下文件:application/config/autoload.php。

步骤2) 找到 $autoload 数组键库,并按如下所示加载数据库库:

$autoload['libraries'] = array('database');

这里:

  • 上面的代码会在应用程序启动时加载数据库库。

Code点火器插入活动记录

为了进行测试,我们将创建一个控制器并定义路由,以便通过 Active Record 与我们的应用程序进行交互。创建一个新文件 application/controllers/ActiveRecordController.php,并添加以下代码:

<?php
defined('BASEPATH') OR exit('No direct script access allowed');
class ActiveRecordController extends CI_Controller {
public function store_order(){
$data = [
'date' => '2018-12-19',
'customer_name' => 'Joe Thomas',
'customer_address' => 'US'
];

$this->db->insert('orders', $data);

echo 'order has successfully been created';
}
}

这里:

  • $data = […] 定义了一个数组变量 data,它使用数据库表列名作为数组键,并为其赋值。
  • `$this->db->insert('orders', $data);` 调用数据库库的插入方法,传入表名 `orders` 和数组变量 `$data`。这行代码会生成 SQL INSERT 语句,其中数组键作为字段名,数组值作为要插入的值。

现在我们已经创建了控制器方法,接下来需要创建一个路由来调用它。打开 application/config/routes.php 文件,并添加以下代码行:

$route['ar/insert'] = 'activerecordcontroller/store_order';

这里:

  • 我们定义了一个路由 ar/insert,它调用 ActiveRecordController 的 store_order 方法。

现在让我们启动 Web 服务器来测试我们的方法。运行以下命令启动内置的 PHP 服务器:

cd C:\Sites\ci-app
php -S localhost:3000

这里:

  • 上面的命令会浏览到项目目录,并在端口 3000 启动内置服务器。

加载以下内容 URL 在浏览器中输入: http://localhost:3000/ar/insert您将得到以下结果:

order has successfully been created

打开 MySQL 打开教程数据库,查看订单表。你会看到新创建的行,如下图所示:

通过 Active Record 插入新的订单行

CodeIgniter 选择 Active Record

在本节中,我们将学习如何读取数据库中的记录,并将其作为无序列表显示在 Web 浏览器中。请将以下方法添加到 ActiveRecordController 中:

public function index() {
$query = $this->db->get('orders');

echo "<h3>Orders Listing</h3>";
echo "<ul>";

foreach ($query->result() as $row) {
echo "<li>$row->customer_name</li>";
}

echo "</ul>";
}

这里:

  • $query = $this->db->get('orders'); 对 orders 表执行 select 查询,选择所有字段。
  • 回声订单列表”;显示 HTML 标题。
  • 回声”; 打印无序列表的开始标签。
  • foreach ($query->result() as $row) {…} 循环遍历数据库返回的结果,并输出“ $row->customer_name ”; 打印 customer_name。

加载之前 URL您可以向数据库添加几条记录。现在让我们为 SELECT 查询定义一个路由。打开 application/config/routes.php 文件并添加以下路由:

$route['ar'] = 'activerecordcontroller';

这里:

  • 路由 ar 指向 ActiveRecordController 类的 index 方法。这是默认设置,因此我们没有像插入记录的路由那样指定 index 方法。

假设 Web 服务器已在运行,请加载以下内容 URL: http://localhost:3000/ar您应该会在浏览器中看到类似以下内容的结果:

通过 Active Record 选择的订单列表

CodeIgniter 更新 Active Record

本节将讨论如何使用 Active Record 更新数据库。假设我们要将客户姓名 Joe Thomas 更新为 Joe。请将以下方法添加到 ActiveRecordController 类中:

public function update_order() {
$data = [
'customer_name' => 'Joe',
];
$this->db->where('id', 1);
$this->db->update('orders', $data);
echo 'order has successfully been updated';
}

这里:

  • $data = […] 定义了我们希望在数据库表中更新的字段和值。
  • $this->db->where('id', 1); 设置更新查询的 where 子句。
  • $this->db->update('orders', $data); 生成 SQL 更新查询并针对我们的数据库执行它。

上述代码会生成以下 SQL 语句:

UPDATE orders SET customer_name = 'Joe' WHERE id = 1;

现在让我们更新 application/config/routes.php 文件,并添加以下路由:

$route['ar/update'] = 'activerecordcontroller/update_order';

保存更改并加载以下内容 URL 在网页浏览器中:

订单已成功更新消息

现在让我们显示数据库记录,看看更改是否生效。

订单列表显示更新后的名称

从上图可以看出,第一条记录已从 Joe Thomas 更新为 Joe。

CodeIgniter 删除 Active Record

现在我们将从数据库中删除一条记录。我们将删除 ID 为 3 的记录。请将以下方法添加到 ActiveRecordController 中:

public function delete_order() {
$this->db->where('id', 3);
$this->db->delete('orders');

echo 'order has successfully been deleted';
}

这里:

  • $this->db->where('id', 3); 设置 where 子句。
  • $this->db->delete('orders'); 根据 where 子句设置的条件删除 orders 表中的数据库行。

要执行上述代码,请加载以下内容。 URL 在您的网络浏览器中: http://localhost:3000/ar/delete.

常见问题

Active Record 将值绑定为参数,而不是将它们连接到 SQL 字符串中,因此用户输入无法更改查询结构。这可以避免ping 对于插入、更新和 WHERE 条件,此操作会自动执行。

是的。Active Record 通过每个引擎的驱动程序生成 SQL,因此从 MySQL 通常来说,迁移到 SQL Server 意味着更改配置,而不是模型代码,只要避免使用特定于供应商的 SQL 即可。

WHERE 子句限制了语句影响的行数。如果没有它,更新或删除操作将针对表中的每一行执行,这是一个常见且代价高昂的错误。

是的。AI 可以将 SELECT、INSERT、UPDATE 或 DELETE 语句重写为等效的 GET、INSERT、UPDATE 或 DELETE 链。请测试结果,因为复杂的连接可能需要使用查询构建器,而不是简单的 Active Record。

自动加载数据库库使得 `$this->db` 在每个控制器和模型中都可用,而无需每次都加载它。当应用程序的大部分操作都与数据库交互时,这非常方便。

总结一下这篇文章: