liquidbox / silex-pdo
Silex微框架的PDO服务提供者
v2.0.0
2017-11-30 07:36 UTC
Requires
- silex/silex: ^2.0
Requires (Dev)
- friendsofphp/php-cs-fixer: ^2.0
- phpunit/phpunit: ^4.0|^5.0
This package is not auto-updated.
Last update: 2024-09-29 04:49:28 UTC
README
您正在阅读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.driver
和pdo.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, ));
服务pdo
和pdo.connections
将分别重命名为db
和dbs
。
将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文档。