In fact you can extract the size of the varchar field, by simply sending the following query:
"select a.atttypmod,a.attrelid from pg_attribute as a, pg_class as c where c.relname='$table' AND a.attrelid=c.oid AND a.attname='$field'"
here is a simple function that does that:
function get_field_size($table, $field, $link) {
$result = pg_query($link, "select a.atttypmod,a.attrelid from pg_attribute as a, pg_class as c where c.relname='$table' AND a.attrelid=c.oid AND a.attname='$field'");
$data = pg_fetch_object($result);
return ($data->atttypmod - 4);
}
returned value is a size of a given field (also varchar)
pg_field_name
(PHP 4 >= 4.2.0, PHP 5)
pg_field_name — フィールドの名前を返す
説明
string pg_field_name
( resource $result
, int $field_number
)
pg_field_name() は、指定した PostgreSQL result リソースの指定した field_number にあるフィールドの名前を 返します。フィールド番号は 0 から始まります。
注意: この関数は、以前は pg_fieldname() と呼ばれていました。
パラメータ
- result
-
pg_query(), pg_query_params() あるいは pg_execute() から返される PostgreSQL の クエリ結果リソース。
- field_number
-
フィールド番号。0 から始まります。
返り値
フィールド名を返します。エラー時には FALSE を返します。
例
例1 フィールド情報を取得する
<?php
$dbconn = pg_connect("dbname=publisher") or die("Could not connect");
$res = pg_query($dbconn, "select * from authors where author = 'Orwell'");
$i = pg_num_fields($res);
for ($j = 0; $j < $i; $j++) {
echo "column $j\n";
$fieldname = pg_field_name($res, $j);
echo "fieldname: $fieldname\n";
echo "printed length: " . pg_field_prtlen($res, $fieldname) . " characters\n";
echo "storage length: " . pg_field_size($res, $j) . " bytes\n";
echo "field type: " . pg_field_type($res, $j) . " \n\n";
}
?>
上の例の出力は以下となります。
column 0 fieldname: author printed length: 6 characters storage length: -1 bytes field type: varchar column 1 fieldname: year printed length: 4 characters storage length: 2 bytes field type: int2 column 2 fieldname: title printed length: 24 characters storage length: -1 bytes field type: varchar
pg_field_name
12-Aug-2004 05:01
ccasal at compuserve dot com
12-Jan-2001 07:51
12-Jan-2001 07:51
The pg_fieldname function only returns the unqualified name from the select statement. example:
select c.name, con.name from customer c, contacts con where con.customer_id = c.id;
pg_fieldname will return "name" for both fields instead of c.name and con.name.
This is a PostgreSQL limitation, not a PHP limitation.
if you need different field names you should use :
select c.name as customer_name, con.name as contact_name from customer c, contacts con where con.customer_id = c.id;
then pg_fieldname will return "customer_name" and "contact_name"