文档/容器/服务/DB

DB 服务 — 使用数据库

DB 服务提供了向数据库发送查询的初始能力。通过使用 PDOHLEB2 框架的数据库配置的包装器,该服务提供了简单的方法与各种数据库(由 PDO 支持)进行交互。

必须启用 PHP PDO 扩展和必要的数据库驱动程序才能让此服务工作。

要使用不同的连接方法,例如 ORM(对象关系映射),请根据框架的配置设置添加选择的 ORM 作为服务容器。

根据 HLEB2 框架提供的项目结构,DB 服务只能在模型类中使用。
一个模型类(其模板可以使用控制台命令创建)作为MVC(用于 Web 的 Action-Domain-Responder)中使用的基本框架。 可以根据需要调整或替换为选择的 AR(活动记录)ORM 库(然后调整控制台命令的模板)。

在模型中使用数据库查询的示例:

<?php
// File /app/Models/ExampleModel.php

namespace App\Models;

use 
Hleb\Base\Model;
use 
Hleb\Reference\DbInterface;
use 
Hleb\Static\DB;

class 
ExampleModel extends Model
{
    public static function 
get(): false|array
    {
        
$query '"SELECT * FROM table_name WHERE active=1';

        
// variant 1
        
$data self::container()->get(DbInterface::class)->dbQuery($query);

        
// variant 2
        
$data self::container()->db()->dbQuery($query);

        
// variant 3
        
$data DB::dbQuery($query);

        return 
$data;
    }
}

使用以下 DB 服务的方法来执行数据库查询。


#dbQuery()

dbQuery() 方法在上面的示例中用于直接创建 SQL 数据库查询。 在它中,查询和查询参数没有分开,因此必须使用特殊的 quote() 方法处理(正确地转义)每个可疑参数,尤其是来自 Request 的参数。

use Hleb\Static\DB;

$result DB::dbQuery(sprintf("SELECT * FROM users WHERE name='%s' AND address='%s'"DB::quote($name), DB::quote($address)));

转义查询参数可确保防止 SQL 注入。 这种攻击基于将任意 SQL 表达式注入为外部数据的一部分。

DB 服务的另一种方法更为通用并简化了参数处理。


#run()

成功执行后,run()方法将返回一个已初始化的PDOStatement对象。 该对象的所有方法,如fetch()fetchColumn(),都是PDO的标准方法。

use Hleb\Static\DB;

$result DB::run("SELECT * FROM users WHERE name=? AND address=?", [$name$address])->fetchAll();

PDOStatement的功能已在PDO文档中详细描述。


#异步查询

对于异步查询,使用该服务的方式类似,并取决于所使用的Web服务器配置。

此外,一些ORM库已适应此模式运行。

根据其文档,其中一个这样的库是Cycle ORM

Path Sessions

页面翻译:chatgpt 4-o
返回顶部