CakePHP数据库教程展示了如何使用CakePHP的数据库包在PHP中对数据库进行编程。
$ php -v php -v PHP 8.1.2 (cli) (built: Aug 8 2022 07:28:23) (NTS) ...
我们使用PHP版本8.1.2。
CakePHP数据库
CakePHP数据库是一个灵活而强大的数据库抽象库,具有熟悉的类PDOAPI。该库可帮助程序员构建查询、防止SQL注入、检查和更改模式,以及将调试和分析查询发送到数据库。
CakePHP数据库支持MySQL/MariaDB、PostgresSQL、SQLite和MicrosoftSQLServer。
MariaDB数据库
在本教程中,我们使用MariaDB数据库
DROP TABLE IF EXISTS countries; CREATE TABLE countries(id BIGINT NOT NULL PRIMARY KEY AUTO_INCREMENT, name VARCHAR(255), population INT); INSERT INTO countries(name, population) VALUES('China', 1382050000); INSERT INTO countries(name, population) VALUES('India', 1313210000); INSERT INTO countries(name, population) VALUES('USA', 324666000); INSERT INTO countries(name, population) VALUES('Indonesia', 260581000); INSERT INTO countries(name, population) VALUES('Brazil', 207221000); INSERT INTO countries(name, population) VALUES('Pakistan', 196626000); INSERT INTO countries(name, population) VALUES('Nigeria', 186988000); INSERT INTO countries(name, population) VALUES('Bangladesh', 162099000); INSERT INTO countries(name, population) VALUES('Nigeria', 186988000); INSERT INTO countries(name, population) VALUES('Russia', 146838000); INSERT INTO countries(name, population) VALUES('Japan', 126830000);
这些SQL命令创建一个countries
表。
安装CakePHP数据库
$ composer require cakephp/database
使用上述命令安装CakePHP数据库。
CakePHP执行
execute
执行查询。
<?php require __DIR__ . '/vendor/autoload.php'; use Cake\Database\Connection; use Cake\Database\Driver\Mysql; $driver = new Mysql([ 'database' => 'mydb', 'username' => 'root', 'password' => 's$cret', ]); $conn = new Connection([ 'driver' => $driver, ]); $stm = $conn->execute('SELECT VERSION()'); $version = $stm->fetch()[0]; echo $version . "\n";
该示例打印MariaDB数据库的版本。
$driver = new Mysql([ 'database' => 'mydb', 'username' => 'root', 'password' => 's$cret', ]);
创建了一个新的MySQL驱动程序。我们提供数据库名称、用户名和密码。
$conn = new Connection([ 'driver' => $driver, ]);
一个连接对象被创建。
$ php version.php 10.1.36-MariaDB
这是输出。
CakePHP获取
fetch
方法在执行SQL语句后返回结果集的下一行。可以获取行以包含列作为名称或位置。如果结果集中没有留下任何行,则返回false。
<?php require __DIR__ . '/vendor/autoload.php'; use Cake\Database\Connection; use Cake\Database\Driver\Mysql; $driver = new Mysql([ 'database' => 'mydb', 'username' => 'root', 'password' => 's$cret', ]); $conn = new Connection([ 'driver' => $driver, ]); $stm = $conn->execute('SELECT * FROM countries'); while ($row = $stm->fetch('assoc')) { echo "{$row['id']} {$row['name']} {$row['population']}\n"; }
该示例从countries
表中获取所有行。
$stm = $conn->execute('SELECT * FROM countries');
使用execute
执行查询。
while ($row = $stm->fetch('assoc')) { echo "{$row['id']} {$row['name']} {$row['population']}\n"; }
我们在while循环中使用fetch
获取所有行。
$ php fetch_rows.php 1 China 1382050000 2 India 1313210000 3 USA 324666000 4 Indonesia 260581000 5 Brazil 207221000 6 Pakistan 196626000 7 Nigeria 186988000 8 Bangladesh 162099000 9 Nigeria 186988000 10 Russia 146838000 11 Japan 126830000
这是输出。
CakePHP插入
使用insert
将新行添加到数据库中。
<?php require __DIR__ . '/vendor/autoload.php'; use Cake\Database\Connection; use Cake\Database\Driver\Mysql; $driver = new Mysql([ 'database' => 'mydb', 'username' => 'root', 'password' => 's$cret', ]); $conn = new Connection([ 'driver' => $driver, ]); $conn->insert('countries', ['name' => 'Ethiopia', 'population' => 102403196]);
该示例将一个新行插入到countries
表中。
参数化查询
参数化查询可防止SQL注入攻击。execute
方法在第二个参数中获取要绑定的值,在第三个参数中获取值的类型。
<?php require __DIR__ . '/vendor/autoload.php'; use Cake\Database\Connection; use Cake\Database\Driver\Mysql; $driver = new Mysql([ 'database' => 'mydb', 'username' => 'root', 'password' => 's$cret', ]); $conn = new Connection([ 'driver' => $driver, ]); $stm = $conn->execute('SELECT * FROM countries WHERE id = :id', ['id' => 1], ['id' => 'integer']); $row = $stm->fetch(); echo "$row[0] $row[1] $row[2]\n";
该示例使用参数化查询选择特定行。
$stm = $conn->execute('SELECT * FROM countries WHERE id = :id', ['id' => 1], ['id' => 'integer']);
:id
是一个占位符,它与第二个参数中指定的值绑定。要绑定的参数的类型在第三个参数中给出。
$ php parametrized.php 1 China 1382050000
这是输出。
CakePHP查询生成器
查询构建器为创建和运行数据库查询提供了一个方便、流畅的界面。它是对运行SQL语句的低级细节的抽象。它使程序员免受复杂过程的影响。
<?php require __DIR__ . '/vendor/autoload.php'; use Cake\Database\Connection; use Cake\Database\Driver\Mysql; $driver = new Mysql([ 'database' => 'mydb', 'username' => 'root', 'password' => 's$cret', ]); $conn = new Connection([ 'driver' => $driver, ]); $query = $conn->newQuery(); $query->select(['id', 'name']); $query->from('countries'); $query->where(['id >' => 4])->andWhere(['id <' => 10]); $rows = $query->execute(); foreach ($rows as $row) { echo "{$row[0]} {$row[1]}\n"; }
该示例从countries
表中检索ID大于4且小于10的行。
$query = $conn->newQuery();
查询构建器是使用newQuery
创建的。
$query->select(['id', 'name']); $query->from('countries'); $query->where(['id >' => 4])->andWhere(['id <' => 10]);
查询是使用流畅的方法调用构建的。
$ php query_builder.php 5 Brazil 6 Pakistan 7 Nigeria 8 Bangladesh 9 Nigeria
这是输出。
计算行数
可以使用func
方法创建许多常用函数。
<?php require __DIR__ . '/vendor/autoload.php'; use Cake\Database\Connection; use Cake\Database\Driver\Mysql; $driver = new Mysql([ 'database' => 'mydb', 'username' => 'root', 'password' => 's$cret', ]); $conn = new Connection([ 'driver' => $driver, ]); $query = $conn->newQuery(); $query->select(['count' => $query->func()->count('*')]); $query->from('countries'); $stm = $query->execute(); $n = $stm->fetch()[0]; echo "There are {$n} countries in the table\n";
该示例计算表格中的行数。
$ php count_rows.php There are 12 countries in the table
这是输出。
CakePHP表达式
in
表达式允许创建INSQL子句。
<?php require __DIR__ . '/vendor/autoload.php'; use Cake\Database\Connection; use Cake\Database\Driver\Mysql; $driver = new Mysql([ 'database' => 'mydb', 'username' => 'root', 'password' => 's$cret', ]); $conn = new Connection([ 'driver' => $driver, ]); $query = $conn->newQuery(); $query->select(['id', 'name', 'population']); $query->from('countries'); $query->where(function ($exp) { return $exp ->in('id', [2, 4, 6, 8, 10]); }); $rows = $query->execute(); foreach ($rows as $row) { echo "{$row[0]} {$row[1]} {$row[2]}\n"; }
该示例使用in
表达式从给定的ID数组中选择行。
$ php in_expr.php 2 India 1313210000 4 Indonesia 260581000 6 Pakistan 196626000 8 Bangladesh 162099000 10 Russia 146838000
这是输出。
在本教程中,我们使用了CakePHP数据库库。
列出所有PHP教程。