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