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