使用 Pomm2 从 PHP 访问 PostgreSQL
在低级别车手的肩膀上,有 pomm 。它提出了模块化方法,数据转换器,监听/通知支持,数据库检查器等等。
假设,Pomm 已经使用 composer 安装,这是一个完整的例子:
<?php
use PommProject\Foundation\Pomm;
$loader = require __DIR__ . '/vendor/autoload.php';
$pomm = new Pomm(['my_db' => ['dsn' => 'pgsql://user:pass@host:5432/db_name']]);
// TABLE comment (
// comment_id uuid PK, created_at timestamptz NN,
// is_moderated bool NN default false,
// content text NN CHECK (content !~ '^\s+$'), author_email text NN)
$sql = <<<SQL
SELECT
comment_id,
created_at,
is_moderated,
content,
author_email
FROM comment
INNER JOIN author USING (author_email)
WHERE
age(now(), created_at) < $*::interval
ORDER BY created_at ASC
SQL;
// the argument will be converted as it is cast in the query above
$comments = $pomm['my_db']
->getQueryManager()
->query($sql, [DateInterval::createFromDateString('1 day')]);
if ($comments->isEmpty()) {
printf("There are no new comments since yesterday.");
} else {
foreach ($comments as $comment) {
printf(
"%s has posted at %s. %s\n",
$comment['author_email'],
$comment['created_at']->format("Y-m-d H:i:s"),
$comment['is_moderated'] ? '[OK]' : '');
}
}
Pomm 的查询管理器模块转义查询参数以防止 SQL 注入。在转换参数时,它还将它们从 PHP 表示转换为有效的 Postgres 值。结果是一个迭代器,它在内部使用一个游标。每一行都是即时转换,布尔值转换为布尔值,时间戳转换为\ DateTime 等。