我一直在尝试从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特定答案也足够了。
答案 0 :(得分:3)
您可以使用以下查询找到您的元数据:
select * from information_schema.columns
where table_name = 'regions' and column_name = 'capital'
这应该提供mysql_fetch_field中的所有信息。我不是一个php编码器,所以也许有人知道包装这个查询的函数。
答案 1 :(得分: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
希望你喜欢!