PostgreSQL 功能強大、標準兼容性好。PHP 通過 pgsql 擴展提供原生函數族(pg_connect、pg_query、pg_fetch_* 等)進行操作。本文提供從連接到增刪改查的完整可運行代碼。
<?php
// 1. 連接數據庫
$pg = @pg_connect("host=localhost user=postgres password=sa dbname=employes")
or die("can't connect to database.");
// 2. 執行查詢
$query = "SELECT * FROM employes ORDER BY serial_no";
$result = @pg_query($pg, $query) or die("can't run query to table.");
// 3. 獲取行數
echo "查詢到記錄數: " . pg_num_rows($result) . "
";
// 4. 遍歷結果集 - 方式一:pg_fetch_row (數字索引)
echo "<table border=1><tr><td>serial_no</td><td>name</td><td>birthday</td></tr>";
for ($i = 0; $i < pg_num_rows($result); $i++) {
$row = @pg_fetch_row($result) or die("can't fetch row.");
list($serial_no, $name, $birthday) = $row;
echo "<tr><td>$serial_no</td><td>$name</td><td>$birthday</td></tr>";
}
echo "</table>";
// 5. 方式二:pg_fetch_array (關聯/數字雙索引) - 註釋備用
/*
echo "<table border=1><tr><td>serial_no</td><td>name</td><td>birthday</td></tr>";
for ($i = 0; $i < pg_num_rows($result); $i++) {
$row = @pg_fetch_array($result);
echo "<tr><td>{$row['serial_no']}</td><td>{$row['name']}</td><td>{$row['birthday']}</td></tr>";
}
echo "</table>";
*/
// 6. 插入示例(預處理參數化寫法更安全,此處為演示)
/*
$newrow = [
"serial_no" => "1006",
"name" => "peter",
"birthday" => "1990-07-03",
"salary" => "90",
"bonus" => "80"
];
$res = @pg_insert($pg, "employes", $newrow) or die("can't insert data.");
if ($res) echo "插入成功!";
*/
// 7. 關閉連接
pg_close($pg);
?>
| 函數 | 用途 | 備註 |
|---|---|---|
pg_connect(conn_str) | 建立連接 | 支持 host/port/dbname/user/password/sslmode 等參數 |
pg_query(conn, sql) | 執行 SQL | 返回資源,失敗返回 false |
pg_num_rows(result) | 結果集行數 | 僅適用 SELECT |
pg_fetch_row(result) | 取一行(數字索引) | 適合性能敏感場景 |
pg_fetch_array(result, type) | 取一行(雙索引) | type: PGSQL_ASSOC/PGSQL_NUM/PGSQL_BOTH |
pg_fetch_assoc(result) | 取一行(關聯索引) | 最常用,可讀性好 |
pg_fetch_object(result, class) | 取一行映射為對象 | 可指定類名,自動實例化 |
pg_affected_rows(result) | 影響行數 | INSERT/UPDATE/DELETE |
pg_insert/pg_update/pg_delete | 便捷增刪改 | 自動轉義,但建議改用預處理 |
pg_prepare/pg_execute | 預處理語句 | 防注入、重複執行高效 |
pg_close(conn) | 關閉連接 | 腳本結束自動關閉,顯式調用更好 |
pg_prepare() + pg_execute(),徹底防止 SQL 注入。pg_set_error_verbosity(PGSQL_ERRORS_VERBOSE),記錄詳細錯誤日誌。pgsql.allow_persistent=On)。pg_query("BEGIN")、pg_query("COMMIT")/pg_query("ROLLBACK")。掌握原生函數是理解底層交互的基礎,實際項目建議封裝為 Repository 模式或引入 ORM,提升開發效率與代碼質量。