2024 年 PHP Conference Japan

PostgreSQL 函式

注意事項

注意:

並非所有版本都支援所有函式。這取決於您的 libpq(PostgreSQL C 用戶端函式庫)版本以及 libpq 的編譯方式。如果 PHP PostgreSQL 擴充功能遺失,則表示您的 libpq 版本不支援它們。

注意:

大多數 PostgreSQL 函式都接受 connection 作為可選的第一個參數。如果未提供,則會使用最後開啟的連線。如果不存在,函式會返回 false

注意:

PostgreSQL 在物件建立時和查詢時會自動將所有識別符號(例如表格/欄位名稱)摺疊成小寫值。若要強制使用大小寫混合或大寫識別符號,您必須使用雙引號 ("") 將識別符號括起來。

注意:

PostgreSQL 沒有用於擷取資料庫結構描述資訊(例如目前資料庫中的所有表格)的特殊指令。相反地,在 PostgreSQL 7.4 及更高版本中有一個名為 information_schema 的標準結構描述,其中包含具有所有必要資訊的系統視圖,並且可以輕鬆查詢。詳情請參閱 » PostgreSQL 文件

目錄

新增註釋

使用者貢獻的註釋 17 則註釋

7
Tony Murray
12 年前
一維 PostgreSQL 陣列資料的簡單轉換

// =====
//範例 #1(IP 位址陣列)
<?php
$pgsqlArr
= '{192.168.1.1,10.1.1.1}';

preg_match('/^{(.*)}$/', $pgsqlArr, $matches);
$phpArr = str_getcsv($matches[1]);

print_r($phpArr);
}
// 輸出:
// Array
// (
// [0] => 192.168.1.1
// [1] => 10.1.1.1
// )
// =====

// =====
// 範例 #2(包含空格和逗號的字串陣列):
<?php
$pgsqlArr
= '{string1,string2,"string,3","string 4"}';

preg_match('/^{(.*)}$/', $pgsqlArr, $matches);
$phpArr = str_getcsv($matches[1]);

print_r($phpArr);
}
// 輸出:
// Array
// (
// [0] => string1
// [1] => string2
// [2] => string,3
// [3] => string 4
// )
// =====
3
abondi at ijk dot it
20 年前
我找到了另一個函式來模仿以下 MySQL 列出資料表函式 (https://php.dev.org.tw/manual/en/function.mysql-list-tables.php),這對我的目標更有用

function pg_list_tables() {
$sql = "SELECT a.relname AS Name
FROM pg_class a, pg_user b
WHERE ( relkind = 'r') and relname !~ '^pg_' AND relname !~ '^sql_'
AND relname !~ '^xin[vx][0-9]+' AND b.usesysid = a.relowner
AND NOT (EXISTS (SELECT viewname FROM pg_views WHERE viewname=a.relname));";
return(pg_query($conn, $sql));
}
0
1413 at blargh dot com
19 年前
以下是一些快速且簡略的程式碼,可將 Postgres 返回的陣列轉換為 PHP 陣列。可能有一堆錯誤,但由於我只處理可變深度和長度的整數陣列,它可以滿足我的需求。

最值得注意的是,任何可能包含逗號的資料都無法正常運作...

<?php
函數 PGArrayToPHPArray($pgArray)
{
$ret = 陣列();
$stack = 陣列(&$ret);
$pgArray = substr($pgArray, 1, -1);
$pgElements = explode(",", $pgArray);

ArrayDump($pgElements);

foreach(
$pgElements as $elem)
{
if(
substr($elem,-1) == "}")
{
$elem = substr($elem,0,-1);
$newSub = 陣列();
while(
substr($elem,0,1) != "{")
{
$newSub[] = $elem;
$elem = array_pop($ret);
}
$newSub[] = substr($elem,1);
$ret[] = array_reverse($newSub);
}
else
$ret[] = $elem;
}
return
$ret;
}
?>
0
74012 dot 2773 at compuserve dot com
20 年前
若只需要表格列表,這個方法適用於 postgresql-7.2.1

函數 pg_list_tables($db) {
$sql = "select relname from pg_stat_user_tables order by relname;";
返回 pg_query($db, $sql);
}
0
daniel at bichara dot com dot br
21 年前
在啟用 suexec 的 RedHat Linux 和 Apache 上運行時,您必須在每個 .php 檔案中使用 dl("pgsql.so") 包含 pgsql.so,並從 php.ini 中移除 "extension=pgsql.so",否則 Apache (httpd) 將無法啟動。
0
saberit at home dot com
23 年前
我嘗試從原始碼編譯支援 PostgreSQL 的 PHP (./configure --with-pgsql=/usr/local/pgsql),並在嘗試 'make' 時遇到一堆問題。問題在於,當我從原始碼安裝 PostgreSQL 時,預設情況下並未安裝一些 PostgreSQL 標頭檔。安裝 PostgreSQL 時,請確保在 'make install' 之後執行 'make install-all-headers'。
-1
WillowCatkin at hotmail dot com
19 年前
這裡有一個例子
<?php
/*
* Define PostgreSQL database server connect parameters.
*/
define('PGHOST','10.0.0.218');
define('PGPORT',5432);
define('PGDATABASE','example');
define('PGUSER', 'root');
define('PGPASSWORD', 'nopass');
define('PGCLIENTENCODING','UNICODE');
define('ERROR_ON_CONNECT_FAILED','Sorry, can not connect the database server now!');

/*
* Merge connect string and connect db server with default parameters.
*/
pg_pconnect('host=' . PGHOST . ' port=' . PGPORT . ' dbname=' . PGDATABASE . ' user=' . PGUSER . ' password=' . PGPASSWORD);

/*
* generate sql statements to call db-server-side stored procedure(or function)
* @parameter string $proc stored procedure name.
* @parameter array $paras parameters, 2 dimensions array.
* @return string $sql = 'select "proc"(para1,para2,para3);'
* @example pg_prepare('userExists',
* array(
* array('userName','chin','string'),
* array('userId','7777','numeric')
* )
* )
*/
function pg_prepare($proc, $paras)
{
$sql = 'select "' . $proc . '"(';
$sql .= $paras[0][2] == 'numeric' ? $paras[0][1] : "'" . str_replace("'","''",$paras[0][1]) . "'";
$len = count($paras);
for (
$i = 1; $i < $len; $i ++)
{
$sql .= ',';
$sql .= $paras[$i][2] == 'numeric' ? $paras[$i][1] : "'" . str_replace("'","''",$paras[$i][1]) . "'";
}
$sql .= ');';
return
$sql;
}
?>
-1
mystran at wasteland dot pp dot htv dot fi
22 年前
很高兴知道一個這裡沒有記載的事實。

PHP 會將 PostgreSQL 布林資料類型的值以單字元字串 "t" 和 "f" 返回,而不是 PHP 的 true 和 false。

[編者註]
't' 或 'f' 是 PostgreSQL 的有效布林運算式。

所有來自 PostgreSQL 的值都是字串,因為 PostgreSQL 的整數、浮點數可能遠大於 PHP 原生 int、double 可以處理的範圍。PostgreSQL 陣列不受支援。
-1
匿名
18 年前
很多關於預存程序的建議對我來說都沒用。這個有效

<?php
$response
= pg_query( $connection, "BEGIN; DECLARE s CURSOR FOR SELECT get_consumer('harry'); FETCH ALL IN s; END;" );
?>

... 其中 harry 看起來像這樣

CREATE OR REPLACE FUNCTION get_consumer( varchar )
RETURNS refcursor
AS '
DECLARE
_name ALIAS FOR $1;
r refcursor;
BEGIN
OPEN r FOR SELECT name FROM consumer
WHERE
consumer.name = _name
;
RETURN r;
END
' LANGUAGE 'plpgsql';
-2
anonymous at unknown dot com
22 年前
我只想補充我之前的文章,我的系統已經啟動並運行。
環境:Windows XP、Apache 1.3.23、PHP 4.3 RC2、PostgreSQL beta4 Windows 原生版本

安裝相當容易
1. 閱讀 readme.txt
2. 按照 readme 中的描述編輯 setenv.bat
3. 執行 'initdb'
所有執行檔都在 /bin 中
使用 <command> --help 獲取幫助
4. 啟動 psql 常駐程式 - 您可能需要建立一個批次檔,例如
'D:\postgres_beta4\bin\postmaster -h localhost -D D:/postgres_beta4/data'

--常駐程式現在應該已啟動並運行--

您可以從控制台登入 shell,例如
'psql -h localhost -d <使用者名稱>'

您必須透過編輯 php.ini 並重新啟動 Apache 來載入 PostgreSQL 擴充功能,才能使用 PHP 存取 PostgreSQL。

最後一點:執行時
$dbconn = pg_connect ("host=localhost port=5432 dbname=$dbname user=$user");
請記住 $user 和/或 $dbname 有區分大小寫。

喔,對了,我手動建立了資料目錄 - 不知道是否有必要

Grtz Vargo
-2
anis_wn at gawab dot com
19 年前
設定 PostgreSQL 以提高 PHP 連線的安全性。

案例
我們想要使用網路使用者在登入時提供的使用者名稱和密碼連線到 PostgreSQL 資料庫。

事實 (Linux)
Apache(可能還有其他伺服器)以 apache 使用者帳戶(預設)執行伺服器。因此,如果您使用預設使用者連線到 PostgreSQL,則會將 apache 指派給它。如果您在 PHP 指令碼中硬編碼使用者和密碼,您將失去 PostgreSQL 的安全限制。

解決方案
(假設您有足夠的權限執行這些操作)
1. 編輯 pg_hba.conf 以包含如下所示的行
host db_Name [網頁伺服器 IP 位址] [IP 位址遮罩] md5
2. 在您的指令碼中新增提交使用者名稱和密碼的登入頁面。
3. 使用這些資訊登入 PostgreSQL,如下所示...
<?
$conn = "host=$DBHost port=$DBPort dbname=$DBName ".
"user='{$_POST['dbUsername']}' password='{$_POST['dbPassword']}'";
$db = pg_connect ($conn);
[您的其他程式碼放在這裡...]
?>
4. 您必須在 PostgreSQL 中正確新增使用者。
5. 為了方便起見,您可以將使用者名稱和密碼儲存到 $_SESSION 變數中。

祝您好運。
Anis WN
-2
adaml at mimuw edu pl
20 年前
是的,PHP 支援預存程序
您必須在程序名稱前新增 "select"
就像這樣

$result = pg_query($conn, "SELECT procedure_x($aa)");

如果程序返回一個游標,您可以這樣做

$result = pg_query($conn, "SELECT procedure_x('rcursor'); FETCH ALL IN rcursor");
-2
hubert at hubertmuller dot com
23 年前
尋找資料表、序列、鍵值等獨立列表的最佳方法是

SELECT relname FROM pg_class WHERE relkind='<value>' AND relname !~ '^pg_';

<value> 可接受以下值:
i 代表鍵值 (keys),
r 代表關聯 (relations),
S 代表序列 (sequences)

請注意,所有以 'pg_' 開頭的資料表名稱都是 PostgreSQL 的內部資料表(這解釋了為什麼我使用 AND relname !~ '^pg_' 條件)。
-2
!spamcraig at ahdore dot com
23 年前
如果您想從 select 語句中提取數據,您需要儲存結果索引,然後將 pg_result 應用於該值。基本上,這樣做:

$resultIdx = pg_query ($database, "select * from tablename");
$mySelect = pg_fetch_result($resultIdx, 0, 0); // 取得第 0 個 tuple 的第 0 個欄位
echo("My select: [".$mySelect."]");

我對 php 還很陌生,必須做一些調整才能解決這個問題。這相當基本,但在這些頁面的範例中沒有示範。希望它對其他人有用。
-2
bleach at chek dot com
24 年前
如果您想查看資料庫中的所有物件,您可以在 pg_class 資料表中找到該資訊。

SELECT * FROM pg_class;

現在,要了解 psql 命令如何處理 \d 和其他事情,這將會有點冗長和複雜。使用語法: psql -E <資料庫名稱>,例如 psql -E mydatabase

這樣做會顯示用於所有操作的 SQL 命令。因此,當您輸入 \d 或其他指令時,它會顯示用於產生結果的 SQL 查詢。
-3
passion at monkey dot org
23 年前
我試圖模仿以下用於 postgres 的 mysql 資料庫連線函式。
https://php.dev.org.tw/manual/en/function.mysql-list-dbs.php
https://php.dev.org.tw/manual/en/function.mysql-list-tables.php

這些函式假設您傳入的 $link 是 pg_connect 的結果

function pg_list_dbs($link)
{
$sql = 'SELECT datname FROM pg_database';
return (pg_query($link, $sql));
}

function pg_list_tables($link)
{
$sql = "SELECT relname FROM pg_class WHERE relname !~ '^pg_'";
return (pg_query($link, $sql));
}
-3
Chris KL
19 年前
這是一個適用於 PHP 的更好的陣列解析器。它僅適用於一維陣列。與下面的範例不同,它適用於所有情況。

/**
* 將資料庫陣列轉換為 PHP 陣列
* @param $arr 表示資料庫陣列的字串
* @return PHP 陣列
*/
function phpArray($dbarr) {
// 去除第一個和最後一個字元(大括號)
$arr = substr($dbarr, 1, strlen($dbarr) - 2);

// 透過仔細解析來挑選陣列元素。這是必要的,以便
// 處理雙引號、逗號等。
$elements = array();
$i = $j = 0;
$in_quotes = false;
while ($i < strlen($arr)) {
// 如果目前字元是雙引號且未被跳脫,則
// 進入引號區塊
$char = substr($arr, $i, 1);
if ($char == '"' && ($i == 0 || substr($arr, $i - 1, 1) != '\\'))
$in_quotes = !$in_quotes;
elseif ($char == ',' && !$in_quotes) {
// 將目前為止的文字添加到陣列
$elements[] = substr($arr, $j, $i - $j);
$j = $i + 1;
}
$i++;
}
// 將最後的文字添加到陣列
$elements[] = substr($arr, $j);

// 對 elements 陣列再進行一次迴圈,以移除雙引號
// 以及雙引號和反斜線的跳脫字元
for ($i = 0; $i < sizeof($elements); $i++) {
$v = $elements[$i];
if (strpos($v, '"') === 0) {
$v = substr($v, 1, strlen($v) - 2);
$v = str_replace('\\"', '"', $v);
$v = str_replace('\\\\', '\\', $v);
$elements[$i] = $v;
}
}

返回 $elements;
}
To Top