Start · Sprachen · PHP · Referenz · pg_field_num

pg_field_num

Funktion

Gibt die Spaltennummer (0-basiert) eines Feldes anhand seines Namens in einem PostgreSQL-Ergebnis zurück.

seit PHP 4.2.0 Kategorie: db

Signatur

pg_field_num(PgSql\Result $result, string $field): int

Beschreibung

pg_field_num() ermittelt den numerischen Index einer Ergebnisspalte anhand ihres Namens. Die Rückgabe ist 0-basiert, d. h. die erste Spalte hat den Index 0. Wird der Feldname nicht gefunden, gibt die Funktion -1 zurück.

Diese Funktion ist besonders nützlich, wenn man dynamisch auf Spalten zugreifen möchte, deren Position in der Ergebnismenge nicht vorab bekannt ist, aber deren Name bekannt ist. So kann beispielsweise pg_fetch_row() (die Daten als numerisch indiziertes Array liefert) zusammen mit pg_field_num() verwendet werden, um gezielt auf benannte Spalten zuzugreifen.

Der Feldname wird in der Regel in Kleinbuchstaben angegeben, da PostgreSQL Bezeichner standardmäßig in Kleinbuchstaben umwandelt. Bei Bezeichnern, die in der Abfrage explizit in Anführungszeichen gesetzt wurden, muss auf die genaue Schreibweise geachtet werden.

Parameter

Name Typ Default Beschreibung
$result Pflicht PgSql\Result Ein PostgreSQL-Ergebnis-Objekt, das von pg_query(), pg_query_params() oder pg_execute() zurückgegeben wurde.
$field Pflicht string Der Name des gesuchten Feldes (Spalte). Der Name ist in der Regel kleingeschrieben, da PostgreSQL Bezeichner standardmäßig in Kleinbuchstaben normalisiert.

Rückgabewert

Typ
int
Beschreibung
Gibt die 0-basierte Spaltennummer des angegebenen Feldes zurück. Wird das Feld nicht gefunden, wird -1 zurückgegeben.

Beispiele

Spaltennummer anhand des Feldnamens ermitteln

<?php
$conn = pg_connect('host=localhost dbname=testdb user=postgres password=secret');
if (!$conn) {
    die('Verbindung fehlgeschlagen.');
}

$result = pg_query($conn, 'SELECT id, username, email FROM users');
if (!$result) {
    die('Abfrage fehlgeschlagen: ' . pg_last_error($conn));
}

$numId       = pg_field_num($result, 'id');
$numUsername = pg_field_num($result, 'username');
$numEmail    = pg_field_num($result, 'email');
$numUnknown  = pg_field_num($result, 'nonexistent');

echo "Spaltennummer 'id':          $numId\n";       // 0
echo "Spaltennummer 'username':    $numUsername\n"; // 1
echo "Spaltennummer 'email':       $numEmail\n";    // 2
echo "Spaltennummer 'nonexistent': $numUnknown\n";  // -1

pg_free_result($result);
pg_close($conn);
Spaltennummer 'id': 0 Spaltennummer 'username': 1 Spaltennummer 'email': 2 Spaltennummer 'nonexistent': -1

Gezielter Zugriff auf Spalten mit pg_fetch_row()

<?php
$conn = pg_connect('host=localhost dbname=testdb user=postgres password=secret');
if (!$conn) {
    die('Verbindung fehlgeschlagen.');
}

$result = pg_query($conn, 'SELECT id, username, email FROM users LIMIT 3');
if (!$result) {
    die('Abfrage fehlgeschlagen: ' . pg_last_error($conn));
}

// Spaltennummern einmal vorab bestimmen
$colUsername = pg_field_num($result, 'username');
$colEmail    = pg_field_num($result, 'email');

if ($colUsername === -1 || $colEmail === -1) {
    die('Erwartete Spalte nicht vorhanden.');
}

while ($row = pg_fetch_row($result)) {
    echo 'Benutzer: ' . htmlspecialchars($row[$colUsername])
       . ' | E-Mail: ' . htmlspecialchars($row[$colEmail]) . "\n";
}

pg_free_result($result);
pg_close($conn);
Benutzer: alice | E-Mail: alice@example.com Benutzer: bob | E-Mail: bob@example.com Benutzer: carol | E-Mail: carol@example.com

// Wichtig · Fallstricke

Groß-/Kleinschreibung: PostgreSQL normalisiert nicht in Anführungszeichen gesetzte Bezeichner automatisch zu Kleinbuchstaben. Wurde ein Spaltenalias in der SQL-Abfrage in doppelten Anführungszeichen definiert (z. B. SELECT id AS "UserID"), muss der exakte Name inklusive Groß-/Kleinschreibung übergeben werden.

Rückgabe -1 prüfen: Es empfiehlt sich, den Rückgabewert immer auf -1 zu prüfen, bevor der Index weiterverwendet wird, um Laufzeitfehler beim Zugriff auf nicht existente Spalten zu vermeiden.

Ab PHP 8.1 ist der Parameter $result vom Typ PgSql\Result (Objekt) anstelle der älteren resource.