liquidbox/silex-pdo

Silex微框架的PDO服务提供者

v2.0.0 2017-11-30 07:36 UTC

This package is not auto-updated.

Last update: 2024-09-29 04:49:28 UTC


README

GitHub release license Build Status Code Coverage Scrutinizer Code Quality Packagist

您正在阅读Silex 2.x的文档。切换到Silex 1.x的文档。

PHP数据对象

PdoServiceProvider提供了与PHP数据对象(PDO)扩展的集成。

参数

  • pdo.dsn(可选):数据源名称(DSN),包含连接到数据库所需的信息。
  • pdo.driver(可选):要使用的PDO驱动实现。
  • pdo.connection(可选):指定连接字符串的特定于驱动的连接参数集合。
  • pdo.username(可选):DSN字符串的用户名。
  • pdo.password(可选):DSN字符串的密码。
  • pdo.options(可选):特定于驱动的连接选项集合。
  • pdo.attributes(可选):要设置的属性集合。

如果设置了pdo.dsn,则忽略参数pdo.driverpdo.connection

服务

  • pdo:PDO连接实例。与PDO交互的主要方式。
  • pdo.connections:PDO连接实例集合。有关使用多个数据库的详细信息,请参阅使用多个数据库部分。
  • pdo.connect:PDO连接实例的工厂。

注册

示例 #1 连接到MySQL

$app->register(new \LiquidBox\Silex\Provider\PdoServiceProvider(), array(
    'pdo.dsn' => 'mysql:host=localhost;dbname=test',
    'pdo.username' => $user,
    'pdo.password' => $passwd,
));

// or

$app->register(new \LiquidBox\Silex\Provider\PdoServiceProvider(), array(
    'pdo.connection' => array(
        'host'   => 'localhost',
        'dbname' => 'test'
    ),
    'pdo.username' => $user,
    'pdo.password' => $passwd,
));

注册的两个连接是等效的。

示例 #2 连接到SQLite

$app->register(new \LiquidBox\Silex\Provider\PdoServiceProvider(), array(
    'pdo.dsn' => 'sqlite::memory:',
));

// or

$app->register(new \LiquidBox\Silex\Provider\PdoServiceProvider(), array(
    'pdo.driver' => 'sqlite',
    'pdo.connection' => ':memory:',
));

示例 #3 使用Doctrine服务名称

$app->register(new \LiquidBox\Silex\Provider\PdoServiceProvider('db', 'dbs'), array(
    'pdo.driver' => 'pdo_pgsql',
    'pdo.connection' => array(
        'host'   => 'localhost',
        'dbname' => 'test',
    ),
    'pdo.username' => $user,
    'pdo.password' => $passwd,
));

服务pdopdo.connections将分别重命名为dbdbs

将PDO作为依赖项添加

composer require liquidbox/silex-pdo:^2.0

用法

示例 #1 展示查询

$sql = 'SELECT name, color, calories FROM fruit ORDER BY name';

foreach ($app['pdo']->query($sql) as $row) {
    echo implode("\t", $row) . PHP_EOL;
}

示例 #2 使用命名参数准备SQL语句

/* Execute a prepared statement by passing an array of values */
$sql = <<<heredoc
SELECT name, color, calories
    FROM fruit
    WHERE calories < :calories AND color = :color
heredoc;

$pdoStatement = $app['pdo']->prepare($sql, array(
    \PDO::ATTR_CURSOR => \PDO::CURSOR_FWDONLY,
));

$pdoStatement->execute(array(':calories' => 150, ':color' => 'red'));

$red = $pdoStatement->fetchAll();

$pdoStatement->execute(array(':calories' => 175, ':color' => 'yellow'));

$yellow = $pdoStatement->fetchAll();

使用多个数据库

PDO提供者可以允许访问多个数据库。为了配置数据源,使用pdo.dsn作为配置数组的键是连接名称,值是参数

$app->register(new LiquidBox\Silex\Provider\PdoServiceProvider(), array(
    'pdo.dsn' => array(
        'mysql_read' => array(
            'connection' => array(
                'host'    => 'mysql_read.someplace.tld',
                'dbname'  => 'my_database',
                'charset' => 'utf8mb4',
            ),
            'username' => 'my_username',
            'password' => 'my_password',
        ),
        'mysql_write' => array(
            'connection' => array(
                'host'    => 'mysql_write.someplace.tld',
                'dbname'  => 'my_database',
                'charset' => 'utf8mb4',
            ),
            'username' => 'my_username',
            'password' => 'my_password',
        ),
    ),
));

第一个注册的连接是默认连接,可以像只有一个连接一样简单访问。给定上述配置,这两行是等效的

$app['pdo']->query('SELECT * FROM table')->fetchAll();

$app['pdo.connections']['mysql_read']->query('SELECT * FROM table')->fetchAll();

可以为每个连接使用不同的驱动程序。

$app->register(
    new LiquidBox\Silex\Provider\PdoServiceProvider(null, 'pdo.dbs'),
    array(
        'pdo.dsn' => array(
            'member_db' => array(
                'driver'     => 'pdo_pgsql',
                'connection' => array(
                    'host'    => 'member_data.someplace.tld',
                    'dbname'  => 'membership',
                ),
                'username' => $pgsql_user,
                'password' => $pgsql_passwd,
            ),
            'content_db' => array(
                'connection' => array(
                    'host'    => 'content_data.someplace.tld',
                    'dbname'  => 'media_info',
                    'charset' => 'utf8',
                ),
                'username' => $mysql_user,
                'password' => $mysql_passwd,
            ),
            'session_storage' => array('dsn' => 'sqlite::memory:'),
        ),
    )
);

这注册了使用PostgreSQL、MySQL和SQLite驱动程序分别使用$app['pdo.dbs']['member_db']$app['pdo.dbs']['content_db']$app['pdo.dbs']['session_storage']

特质

LiquidBox\Silex\Application\PdoTrait添加以下快捷方式

  • prepare:准备一个语句以执行并返回一个语句对象。
/* Execute a prepared statement by passing an array of values */
$pdoStatement = $app->prepare('SELECT name, colour, calories
    FROM fruit
    WHERE calories < ? AND colour = ?');

$pdoStatement->execute(array(150, 'red'));

$red = $pdoStatement->fetchAll();

$pdoStatement->execute(array(175, 'yellow'));

$yellow = $pdoStatement->fetchAll();

有关更多信息,请参阅官方PDO文档