原文: https://zetcode.com/php/cakephpdatabase/

CakePHP 数据库教程展示了如何使用 CakePHP 的数据库包在 PHP 中编程数据库。

CakePHP 数据库

CakePHP 数据库是一个灵活而强大的数据库抽象库,它具有类似 PDO 的 API。 该库可帮助程序员构建查询,防止 SQL 注入,检查和更改模式,以及将调试和配置文件查询发送到数据库。

CakePHP 数据库支持 MySQL/MariaDB,PostgresSQL,SQLite 和 Microsoft SQL Server。

MariaDB 数据库

在本教程中,我们将使用 MariaDB 数据库

countries_mariadb.sql

  1. DROP TABLE IF EXISTS countries;
  2. CREATE TABLE countries(id BIGINT NOT NULL PRIMARY KEY AUTO_INCREMENT,
  3. name VARCHAR(255), population INT);
  4. INSERT INTO countries(name, population) VALUES('China', 1382050000);
  5. INSERT INTO countries(name, population) VALUES('India', 1313210000);
  6. INSERT INTO countries(name, population) VALUES('USA', 324666000);
  7. INSERT INTO countries(name, population) VALUES('Indonesia', 260581000);
  8. INSERT INTO countries(name, population) VALUES('Brazil', 207221000);
  9. INSERT INTO countries(name, population) VALUES('Pakistan', 196626000);
  10. INSERT INTO countries(name, population) VALUES('Nigeria', 186988000);
  11. INSERT INTO countries(name, population) VALUES('Bangladesh', 162099000);
  12. INSERT INTO countries(name, population) VALUES('Nigeria', 186988000);
  13. INSERT INTO countries(name, population) VALUES('Russia', 146838000);
  14. INSERT INTO countries(name, population) VALUES('Japan', 126830000);

这些 SQL 命令创建一个countries表。

安装 CakePHP 数据库

  1. $ composer require cakephp/database

CakePHP 数据库是使用上述命令安装的。

CakePHP 执行

execute()执行查询。

version.php

  1. <?php
  2. require __DIR__ . '/vendor/autoload.php';
  3. use Cake\Database\Connection;
  4. use Cake\Database\Driver\Mysql;
  5. $driver = new Mysql([
  6. 'database' => 'mydb',
  7. 'username' => 'root',
  8. 'password' => 's$cret',
  9. ]);
  10. $conn = new Connection([
  11. 'driver' => $driver,
  12. ]);
  13. $stm = $conn->execute('SELECT VERSION()');
  14. $version = $stm->fetch()[0];
  15. echo $version . "\n";

该示例打印 MariaDB 数据库的版本。

  1. $driver = new Mysql([
  2. 'database' => 'mydb',
  3. 'username' => 'root',
  4. 'password' => 's$cret',
  5. ]);

创建一个新的 MySQL 驱动程序。 我们提供数据库名称,用户名和密码。

  1. $conn = new Connection([
  2. 'driver' => $driver,
  3. ]);

创建一个连接对象。

  1. $ php version.php
  2. 10.1.36-MariaDB

这是输出。

CakePHP 获取

fetch()方法在执行 SQL 语句后返回结果集的下一行。 可以提取行以包含列作为名称或位置。 如果结果集中没有剩余行,则返回false

fetch_rows.php

  1. <?php
  2. require __DIR__ . '/vendor/autoload.php';
  3. use Cake\Database\Connection;
  4. use Cake\Database\Driver\Mysql;
  5. $driver = new Mysql([
  6. 'database' => 'mydb',
  7. 'username' => 'root',
  8. 'password' => 's$cret',
  9. ]);
  10. $conn = new Connection([
  11. 'driver' => $driver,
  12. ]);
  13. $stm = $conn->execute('SELECT * FROM countries');
  14. while ($row = $stm->fetch('assoc')) {
  15. echo "{$row['id']} {$row['name']} {$row['population']}\n";
  16. }

该示例从countries表中提取所有行。

  1. $stm = $conn->execute('SELECT * FROM countries');

使用execute()执行查询。

  1. while ($row = $stm->fetch('assoc')) {
  2. echo "{$row['id']} {$row['name']} {$row['population']}\n";
  3. }

我们在while循环中使用fetch()获取所有行。

  1. $ php fetch_rows.php
  2. 1 China 1382050000
  3. 2 India 1313210000
  4. 3 USA 324666000
  5. 4 Indonesia 260581000
  6. 5 Brazil 207221000
  7. 6 Pakistan 196626000
  8. 7 Nigeria 186988000
  9. 8 Bangladesh 162099000
  10. 9 Nigeria 186988000
  11. 10 Russia 146838000
  12. 11 Japan 126830000

This is the output.

CakePHP 插入

使用insert()将新行添加到数据库。

insert_row.php

  1. <?php
  2. require __DIR__ . '/vendor/autoload.php';
  3. use Cake\Database\Connection;
  4. use Cake\Database\Driver\Mysql;
  5. $driver = new Mysql([
  6. 'database' => 'mydb',
  7. 'username' => 'root',
  8. 'password' => 's$cret',
  9. ]);
  10. $conn = new Connection([
  11. 'driver' => $driver,
  12. ]);
  13. $conn->insert('countries', ['name' => 'Ethiopia', 'population' => 102403196]);

该示例在countries表中插入新行。

参数化查询

参数化查询可防止 SQL 注入攻击。 execute()方法采用第二个参数中要绑定的值和第三个参数中的值的类型。

parametrized.php

  1. <?php
  2. require __DIR__ . '/vendor/autoload.php';
  3. use Cake\Database\Connection;
  4. use Cake\Database\Driver\Mysql;
  5. $driver = new Mysql([
  6. 'database' => 'mydb',
  7. 'username' => 'root',
  8. 'password' => 's$cret',
  9. ]);
  10. $conn = new Connection([
  11. 'driver' => $driver,
  12. ]);
  13. $stm = $conn->execute('SELECT * FROM countries WHERE id = :id',
  14. ['id' => 1], ['id' => 'integer']);
  15. $row = $stm->fetch();
  16. echo "$row[0] $row[1] $row[2]\n";

该示例使用参数化查询选择特定行。

  1. $stm = $conn->execute('SELECT * FROM countries WHERE id = :id',
  2. ['id' => 1], ['id' => 'integer']);

:id是一个占位符,与第二个参数中指定的值绑定。 要绑定的参数的类型在第三个参数中给出。

  1. $ php parametrized.php
  2. 1 China 1382050000

This is the output.

CakePHP 查询构建器

查询构建器为创建和运行数据库查询提供了方便,流畅的接口。 它是对运行 SQL 语句的低级详细信息的抽象。 它可以使程序员避免过程的复杂性。

query_builder.php

  1. <?php
  2. require __DIR__ . '/vendor/autoload.php';
  3. use Cake\Database\Connection;
  4. use Cake\Database\Driver\Mysql;
  5. $driver = new Mysql([
  6. 'database' => 'mydb',
  7. 'username' => 'root',
  8. 'password' => 's$cret',
  9. ]);
  10. $conn = new Connection([
  11. 'driver' => $driver,
  12. ]);
  13. $query = $conn->newQuery();
  14. $query->select(['id', 'name']);
  15. $query->from('countries');
  16. $query->where(['id >' => 4])->andWhere(['id <' => 10]);
  17. $rows = $query->execute();
  18. foreach ($rows as $row) {
  19. echo "{$row[0]} {$row[1]}\n";
  20. }

该示例从countries表中检索 ID 大于 4 且小于 10 的行。

  1. $query = $conn->newQuery();

使用newQuery()创建查询构建器。

  1. $query->select(['id', 'name']);
  2. $query->from('countries');
  3. $query->where(['id >' => 4])->andWhere(['id <' => 10]);

该查询是使用流利的方法调用构建的。

  1. $ php query_builder.php
  2. 5 Brazil
  3. 6 Pakistan
  4. 7 Nigeria
  5. 8 Bangladesh
  6. 9 Nigeria

This is the output.

计数行

可以使用func()方法创建许多常用功能。

count_rows.php

  1. <?php
  2. require __DIR__ . '/vendor/autoload.php';
  3. use Cake\Database\Connection;
  4. use Cake\Database\Driver\Mysql;
  5. $driver = new Mysql([
  6. 'database' => 'mydb',
  7. 'username' => 'root',
  8. 'password' => 's$cret',
  9. ]);
  10. $conn = new Connection([
  11. 'driver' => $driver,
  12. ]);
  13. $query = $conn->newQuery();
  14. $query->select(['count' => $query->func()->count('*')]);
  15. $query->from('countries');
  16. $stm = $query->execute();
  17. $n = $stm->fetch()[0];
  18. echo "There are {$n} countries in the table\n";

该示例计算表中的行数。

  1. $ php count_rows.php
  2. There are 12 countries in the table

This is the output.

CakePHP 的表达方式

in()表达式允许创建IN SQL 子句。

in_expr.php

  1. <?php
  2. require __DIR__ . '/vendor/autoload.php';
  3. use Cake\Database\Connection;
  4. use Cake\Database\Driver\Mysql;
  5. $driver = new Mysql([
  6. 'database' => 'mydb',
  7. 'username' => 'root',
  8. 'password' => 's$cret',
  9. ]);
  10. $conn = new Connection([
  11. 'driver' => $driver,
  12. ]);
  13. $query = $conn->newQuery();
  14. $query->select(['id', 'name', 'population']);
  15. $query->from('countries');
  16. $query->where(function ($exp) {
  17. return $exp
  18. ->in('id', [2, 4, 6, 8, 10]);
  19. });
  20. $rows = $query->execute();
  21. foreach ($rows as $row) {
  22. echo "{$row[0]} {$row[1]} {$row[2]}\n";
  23. }

该示例使用in()表达式从给定的 ID 数组中选择行。

  1. $ php in_expr.php
  2. 2 India 1313210000
  3. 4 Indonesia 260581000
  4. 6 Pakistan 196626000
  5. 8 Bangladesh 162099000
  6. 10 Russia 146838000

This is the output.

您可能也对以下相关教程感兴趣: PHP PDO 教程Symfony 简介PHP 教程或列出所有 PHP 教程。

在本教程中,我们使用了 Doctrine QueryBuilder 和 PostgreSQL 数据库。