1

我一直在尝试从 php 中的 Postgresql 获取结果集中字段的完整元信息(类似于 mysql_fetch_field(),它提供了很多关于字段定义的信息)。虽然我可以使用以下功能来查找一些信息:

$name = pg_field_name($result, 1);
$table = pg_field_table($result, 1);
$type = pg_field_type($result, 1);

我找不到一种方法来获取有关该字段是否允许空值、是否包含 blob 数据(按字段定义)、是否是主要的、按定义的唯一键等的详细信息。mysql_fetch_field() 以某种方式提供了所有这些信息,即很有用。

我真的很想用某种方法直接从 php 获取该信息,但如果那不可能,那么也许有人创建了一个例程,它可能能够以某种方式从 pgsql 结果集中提取该信息。

PS:这看起来很有希望,但页面上的警告不是一个好兆头: http: //php.net/manual/en/pdostatement.getcolumnmeta.php

另外,我目前没有使用 PDO,但如果没有解决方案,那么 PDo 特定的答案也足够了。

4

2 回答 2

3

您可以使用如下查询在您的列上找到元数据:

select * from information_schema.columns 
where table_name = 'regions' and column_name = 'capital'

这应该提供在 mysql_fetch_field 中找到的所有信息。我不是 php 编码器,所以也许有人知道包装这个查询的函数。

于 2012-07-06T06:55:55.583 回答
2

全部;

惊讶地发现 pgsql 在 PHP 中没有列计数例程。我查找的所有帮助都从“information_schema.columns”中获得了总数,这不是您在逐个单元处理时想要的。

所以这里有几个快速使用的功能:

// Test Cell by Cell
echo "Testing Cell by Cell! <br>";
$sql   = "SELECT * FROM sometable;
$res   = pg_query($sql);
$r_cnt = pg_numrows($res) or die("Error: Row Count Failed!");
$c_cnt = pg_numcols($res) or die("Error: Col Count Failed!");
echo "C=> $c_cnt R=> $r_cnt <br>";
for ($n=1; $n<=$r_cnt; $n++) {
    for ($x=1; $x<=$c_cnt; $x++) {
       echo "Cell=> pg_result($res,$n,$x) <br>";
    }  // end while $x
}  // end while $n

function pg_numcols($res) {
    $spos   = strpos(strtoupper($this->db_sql),'SELECT')+6;
    $fpos   = strpos(strtoupper($this->db_sql),'FROM');
    $lenp   = $fpos - $spos;
    $t_str  = substr($this->db_sql,$spos,$lenp);
    $x_str  = explode(',',trim($t_str));
    $result = count($x_str);
    return $result;
}  // end function

希望你喜欢!

于 2012-12-21T19:18:19.307 回答