(PHP 4 >= 4.2.0, PHP 5)
pg_field_prtlen — Gibt die Länge des Feldes zurück
pg_field_prtlen() gibt die aktuelle Länge (Anzahl der Zeichen) eines bestimmten Wertes in einem PostgreSQL result zurück. Die Feldnummerierung beginnt bei 0. Die Funktion liefert bei einem Fehler -1 zurück.
field_name_or_number kann als integer oder als string übergeben werden. Ein integer wird von PHP als Feldnummer interpretiert, ein string als Feldname.
Sehen Sie sich dazu das Beispiel bei pg_field_name() an.
Hinweis:
Diese Funktion ersetzt die Funktion pg_fieldprtlen()().
PostgreSQL Verbindungskennung, die (unter anderem) von den Funktionen pg_query(), pg_query_params() oder pg_execute() zurückgegeben wurde.
Die Nummer der Zeile im Abfrageergebnis. Die Nummerierung beginnt bei 0. Fehlt dieser Parameter, so wird jeweils die nächste Zeile geholt.
Die Anzahl der Zeichen in dem Feld oder FALSE, falls ein Fehler auftrat.
Beispiel #1 Informationen über Spalten ermitteln
<?php
$dbconn = pg_connect("dbname=publisher") or die("Verbindungsaufbau fehlgeschlagen");
$res = pg_query($dbconn, "select * from authors where author = 'Orwell'");
$i = pg_num_fields($res);
for ($j = 0; $j < $i; $j++) {
echo "Spalte $j\n";
$fieldname = pg_field_name($res, $j);
echo "Spaltenname: $fieldname\n";
echo "Anzahl Druckzeichen: " . pg_field_prtlen($res, $fieldname) . " characters\n";
echo "Anzahl Bytes im speicher: " . pg_field_size($res, $j) . " bytes\n";
echo "Spaltentyp: " . pg_field_type($res, $j) . " \n\n";
}
?>
Das oben gezeigte Beispiel erzeugt folgende Ausgabe:
Spalte 0 Spaltenname: author Anzahl Druckzeichen: 6 characters Anzahl Bytes im speicher: -1 bytes Spaltentyp: varchar Spalte 1 Spaltenname: year Anzahl Druckzeichen: 4 characters Anzahl Bytes im speicher: 2 bytes Spaltentyp: int2 Spalte 2 Spaltenname: title Anzahl Druckzeichen: 24 characters Anzahl Bytes im speicher: -1 bytes Spaltentyp: varchar
Or even easier to keep things simple on fetching
SELECT a.attname AS name, t.typname AS type, a.attstorage AS i,
CASE WHEN a.attlen = -1 THEN a.atttypmod ELSE a.attlen END AS size
FROM pg_attribute a , pg_class c, pg_type t
WHERE c.relname = 'moo_members'
AND a.attrelid = c.oid AND a.atttypid = t.oid and a.attnum > 0 and not a.attisdropped
If you update the query to this:
$s = "SELECT a.attname AS name, t.typname AS type, a.attlen AS size, a.atttypmod AS len, a.attstorage AS i
FROM pg_attribute a , pg_class c, pg_type t
WHERE c.relname = '$TABLE'
AND a.attrelid = c.oid AND a.atttypid = t.oid and a.attnum > 0 and not a.attisdropped";
You get postgres to filter out the 'postgres' columns and get only your columns back.
mysql_field_len () function and more for postgres ...
problems ...
* pg_field_prtlen ... gives the actual size of the field back (it shows the count of the content allready inside the field - not the possible max-len)
* pg_filed_size ... can't be used for varchar or bpchar fields
...but there is a way to get the real-max-length of a field in postgreSQL via the system tables:
//returns an array with infos of every field in the table (name, type, length, size)
function SQLConstructFieldsInfo($TABLE, $DBCON)
{
$s="SELECT a.attname AS name, t.typname AS type, a.attlen AS size, a.atttypmod AS len, a.attstorage AS i
FROM pg_attribute a , pg_class c, pg_type t
WHERE c.relname = '$TABLE'
AND a.attrelid = c.oid AND a.atttypid = t.oid";
if ($r = pg_query($DBCON,$s))
{
$i=0;
while ($q = pg_fetch_assoc($r))
{
$a[$i]["type"]=$q["type"];
$a[$i]["name"]=$q["name"];
if($q["len"]<0 && $q["i"]!="x")
{
// in case of digits if needed ... (+1 for negative values)
$a[$i]["len"]=(strlen(pow(2,($q["size"]*8)))+1);
}
else
{
$a[$i]["len"]=$q["len"];
}
$a[$i]["size"]=$q["size"];
$i++;
}
return $a;
}
return null;
}
// usage
$DBCON=pg_connect("host=YOUR-HOST port=YOUR-PORT dbname=YOUR-DB user=YOUR-USER password=YOUR-PASS");
$TABLE="YOUR-TABLENAME";
$RET=SQLConstructFieldsInfo($TABLE, $DBCON);
$j = count($RET);
for ($i=0; $i < $j; $i++)
{
echo "<br>$i name=".$RET[$i]["name"]." type=".$RET[$i]["type"]." length=".$RET[$i]["len"]." size=".$RET[$i]["size"]." bytes";
}