使用 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 等。