PostgreSQL 函数

注意事项

注意:

并非所有函数都由所有构建支持。它取决于你的 libpq(PostgreSQL C 客户端库)版本以及 libpq 的编译方式。如果缺少 PHP PostgreSQL 扩展,那是因为你的 libpq 版本不支持它们。

注意:

大多数 PostgreSQL 函数接受 connection 作为可选的第一个参数。如果未提供,则使用最后打开的连接。如果不存在,函数将返回 false

注意:

PostgreSQL 在对象创建时和查询时会自动将所有标识符(例如表/列名称)折叠为小写值。要强制使用混合大小写或大写标识符,必须使用双引号("")转义标识符。

注意:

PostgreSQL 没有用于获取数据库模式信息的特殊命令(例如当前数据库中的所有表)。相反,在 PostgreSQL 7.4 及更高版本中,有一个名为 information_schema 的标准模式,其中包含包含所有必要信息的系统视图,以易于查询的形式。有关完整详细信息,请参见 » PostgreSQL 文档

目录

添加注释

用户贡献注释 18 个注释

Tony Murray
12 年前
一个简单的 1D 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);
}
// 输出:
// 数组
// (
// [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);
}
// 输出:
// 数组
// (
// [0] => string1
// [1] => string2
// [2] => string,3
// [3] => string 4
// )
// =====
abondi at ijk dot it
20 年前
我找到了另一个函数来模拟以下 mysql 列出表函数 (https://php.net/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));
}
1413 at blargh dot com
18 年前
这里有一些快速且脏的代码将 Postgres 返回的数组转换为 PHP 数组。可能存在数十亿个错误,但由于我只有处理整数的变深变长数组,所以它适用于我的需求。

最值得注意的是,任何可能包含逗号的数据都无法正常工作...

<?php
function PGArrayToPHPArray($pgArray)
{
$ret = array();
$stack = array(&$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 = array();
while(
substr($elem,0,1) != "{")
{
$newSub[] = $elem;
$elem = array_pop($ret);
}
$newSub[] = substr($elem,1);
$ret[] = array_reverse($newSub);
}
else
$ret[] = $elem;
}
return
$ret;
}
?>
74012 dot 2773 at compuserve dot com
20 年前
对于仅列出表,此方法适用于 postgresql-7.2.1

function pg_list_tables($db) {
$sql = "select relname from pg_stat_user_tables order by relname;";
return pg_query($db, $sql);
}
daniel at bichara dot com dot br
21 年前
在启用了 suexec 的 RedHat Linux 和 Apache 上运行,您必须在每个使用 dl("pgsql.so") 的 .php 文件中包含 pgsql.so,并从 php.ini 中删除“extension=pgsql.so”,否则 Apache (httpd) 将无法启动。
saberit at home dot com
22 年前
我尝试使用 PostgreSQL 支持从源代码编译 PHP(./configure --with-pgsql=/usr/local/pgsql),并在尝试“make”时遇到了很多问题。问题是当我从源代码安装 PostgreSQL 时,一些 PostgreSQL 标头没有默认安装。在安装 PostgreSQL 时,请确保在“make install”后运行“make install-all-headers”。
WillowCatkin at hotmail dot com
19 年前
这里有一个例子
<?php
/*
* 定义 PostgreSQL 数据库服务器连接参数。
*/
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','抱歉,现在无法连接数据库服务器!');

/*
* 合并连接字符串并使用默认参数连接数据库服务器。
*/
pg_pconnect('host=' . PGHOST . ' port=' . PGPORT . ' dbname=' . PGDATABASE . ' user=' . PGUSER . ' password=' . PGPASSWORD);

/*
* 生成 SQL 语句来调用数据库服务器端存储过程(或函数)
* @parameter string $proc 存储过程名称。
* @parameter array $paras 参数,二维数组。
* @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;
}
?>
匿名
17 年前
关于存储过程的许多建议对我来说都不管用。这有效

<?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
打开 r 进行选择名称 从消费者
哪里
consumer.name = _name
;
返回 r;
结束
' 语言 'plpgsql';
anonymous at unknown dot com
21 年前
我只想补充一下我之前发表的文章,我已经让系统运行起来了。
环境:Windows XP,Apache 1.3.23,Php 4.3 RC2,PostGreSQL beta4 原生 Windows 版本

安装相当容易
1. 阅读 readme.txt
2. 根据 readme 编辑 setenv.bat
3. 运行 'initdb'
所有 exec 都在 /bin 中
帮助可以像 <command> --help 那样访问
4. 启动 psql 守护进程 - 您可能需要创建类似于以下的批处理文件
'D:\postgres_beta4\bin\postmaster -h localhost -D D:/postgres_beta4/data'

-- 守护进程应该正在运行 --

您可以从控制台登录到 shell,例如
'psql -h localhost -d <username>'

您必须通过编辑 php.ini 并重新启动 Apache 来加载 postgresql 扩展才能使用 php 访问 psql。

最后一点说明:在运行时
$dbconn = pg_connect ("host=localhost port=5432 dbname=$dbname user=$user");
请记住 $user 或 $dbname 是区分大小写的。

哦,对了,我手动创建了数据目录 - 不知道这是否必要

Grtz Vargo
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 数组不受支持。
anis_wn at gawab dot com
19 年前
为更高安全性的 PHP 连接设置 PostgreSQL。

情况
我们希望使用 webuser 在登录时提供的用户名和密码连接到 PostgreSQL 数据库。

事实 (Linux)
Apache(也许其他服务器也是)以 apache 用户帐户运行服务器(默认为)。因此,如果您使用默认用户连接到 PostgreSQL,则 apache 将被分配给它。如果您在 PHP 脚本中硬编码用户和密码,您将失去 PostgreSQL 的安全限制。

解决方案
(假设您有足够的权限执行这些操作)
1. 编辑 pg_hba.conf 以包含以下行
host db_Name [web_server_ip_address] [ip_address_mask] 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
passion at monkey dot org
23 年前
我尝试了模仿以下 mysql 数据库连接函数以用于 postgres。
https://php.net/manual/en/function.mysql-list-dbs.php
https://php.net/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));
}
adaml at mimuw edu pl
19 年前
是的,PHP 支持存储过程
您必须在过程名称之前添加 "select"
过程,就像这样

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

如果过程返回游标,则执行以下操作

$result = pg_query($conn, "SELECT procedure_x('rcursor'); FETCH ALL IN rcursor");
hubert at hubertmuller dot com
23 年前
查找表格、序列、键等的最佳方法是

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

<value> 获取
i 用于键,
r 用于关系,
S 用于序列

请注意,所有以 'pg_' 开头的表名都是 PostgreSQL 内部表(这就是我使用 AND relname !~ '^pg_' 条件的原因)。
!spamcraig at ahdore dot com
23 年前
如果您想从 select 语句中提取数据,您需要存储结果索引,然后将 pg_result 应用于该值。基本上,执行以下操作

$resultIdx = pg_query ($database, "select * from tablename");
$mySelect = pg_fetch_result($resultIdx, 0, 0); // 获取元组 0 的列 0
echo("My select: [".$mySelect."]");

我刚开始接触 php,不得不做一些调整才能解决这个问题。这是相当基本的,但这些页面上的示例没有演示。希望它对其他人有用。
bleach at chek dot com
24 年前
如果您想查看数据库中的所有对象,您可以在 pg_class 表中找到这些信息。 <BR>
SELECT * FROM pg_class;<BR>
现在这将变得有点长和复杂,以了解 psql 命令如何处理 \d 及其他内容。使用语法。 psql -E <Database>,即 psql -E mydatabase <BR>
这样做的作用是显示用于所有内容的 SQL 命令。因此,当您键入 \d 或其他内容时,它将显示用于结果的 SQL 查询。
Chris KL
18 年前
这是一个更好的 PHP 数组解析器。它将仅适用于一维数组。与下面的示例不同,它将在所有情况下都能正常工作。

/**
* 将 db 数组转换为 PHP 数组
* @param $arr 表示 DB 数组的字符串
* @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;
}
}

return $elements;
}
Anonymous
17 年前
Chris KL:会解析 {"\\"} 吗?第二个 " 将被视为转义,但实际上不应该...
To Top