在PHP中处理Postgres输出函数参数


Handling Postgres output function parameters in PHP

我有一个想要访问的Postgres数据库。我需要调用数据库中存在的几个函数。我已经实现了与数据库的连接并运行查询。我也实现了调用我想要的函数。我的问题是,当Postgres函数有多个OUT参数时,它不是返回一个我可以用偏移量或行名访问的数组,而是返回一个同时包含OUT参数的字符串:

$query = "Select pg_function('" . Getenv("REMOTE_ADDR") . "')";
$result = pg_query($query);
$line = pg_fetch_array($result, NULL, PGSQL_ASSOC);
var_dump($line);

var_dumb返回的是:

array
    'ua_bl_session_request' => string '(c6787f5f2b2c885168162c8c8ffff220,8fe04393-c188-0e08-b710-a2ce89066768)' (length=71)

我当然可以解析那个字符串,但有没有一种方法可以实现我想要的,而我却错过了它?

SELECT * FROM pg_function(REMOTE_ADDR);

也许您使用pg_fetch_array()不正确,因为您应该在第二个参数中给出行号。例如:

// To get the first row (Rows are numbered from 0 upwards)
$line = pg_fetch_array($result, 0, PGSQL_ASSOC);
// To get the second row
$line = pg_fetch_array($result, 1, PGSQL_ASSOC);

但是,如果你知道自己在做什么,你可以使用regexp_split_table(),它是一个Posgtres字符串函数,可以使用POSIX正则表达式作为分隔符将字符串拆分为行。例如:

$query  = "select regexp_split_to_table(
               pg_function('" . Getenv("REMOTE_ADDR") . "'), ','
           )";

在您的情况下,它将使用','作为分隔符来分割函数的结果。它应该返回一个包含两行的结果集,如下所示:

c6787f5f2b2c885168162c8c8ffff220
8fe04393-c188-0e08-b710-a2ce89066768