PHP soll Tabellen/Spaltenstruktur aus PostgresQL lesen?!

Hallo liebes pg-forum,

ich bin neu hier und wollte mal kräftig Hallo sagen.
Ich bin Anfänger in PHP, PostgresQL und Apache und diesen Dingen. Im Augenblick habe ich einen Apache zum Laufen gebracht und möchte nun auf meiner Maschine (hier auf der Arbeit) mittels PHP auf eine PostgresQL Datenbank zugreifen. Diese Datenbank besteht aus 10 Tabellen mit etwa je 10 Spalten und wurde in MySQL erstellt. Diese habe ich portiert und kann diese auch mittels phpPgAdmin aufrufen, verändern usw… d.h. es besteht einer Postgres Db Struktur, Version hier ist 8.3 - beim PHP über 5.0… und ein Apache 2.x… (leider muss ich hier Windows Vista benutzen (nutze zu Hause nur Mac) und ich habe auch noch Probleme mit einem Tool Excelfile in PostgresQL zu portieren, weil ich aufm Vista den SQlServer nicht zum Laufen bringe.)

Nun zu meiner ersten Frage: Ich würde mir gerne die Struktur ausgeben lassen. D.h. ich möchte ein PHp Script schreiben, mit dessen Hilfe man auf derm Server alle Tabllen und die angelegten Spalten einsehen kann. Ich muss dazusagen, dass noch keinerlei Datensätze in der Datenbank liegen…

[php]
$query = ‘SELECT * FROM “public”.“Stammdaten”;’;
$result = pg_query($query) or die('Abfrage fehlgeschlagen: ’ . pg_last_error());

// Ergebnisse in HTML ausgeben
echo “

\n”;
while ($line = pg_fetch_array($result, null, PGSQL_ASSOC)) {
echo “\t\n”;
foreach ($line as $col_value) {
echo “\t\t\n”;
}
echo “\t\n”;
}
echo “
$col_value
\n”;
[/php]Wie man an dem Code sehen kann liegen die Tabellen alle wie die Tabelle Stamdaten unter “public”.“Tabellenname”. Ich habe mal einen Pseudodatensatz in Public.Stammdaten eingegeben und dieser wird auch ausgegeben. Ich möchte aber vielmehr eine Übersicht über alle Tabbeln und deren Spalten auslesen lassen.

Bin für direkte Tipps sehr dankbar, aber natürlich auch für gute Dokumentationen PHP<>PostgresQL oder andere WWW-Tipps.

Beste Grüße
Micha

Möchtest du das als Übung schreiben oder brauchst du einfach nur ein Tool, dass dir die Struktur anzeigt?

Wenn letzteres: schau dir mal phpPgAdmin an.

Dazu bietet sich das information_schema an, hier z.B. PostgreSQL: Documentation: Manuals: PostgreSQL 8.3: columns, allgemein PostgreSQL: Documentation: Manuals: PostgreSQL 8.3: The Information Schema.

Andreas

Danke. Wie gesagt, ich benutze bzw. habe phpPgAdmin schon genutzt und kann mir dort auch die Übersicht aufrufen.

Ich will eben via PHp auch die Struktur der DB ausgeben, d.h. es sollen erst alle Tabellen auswählbar sein und dann zur ausgewählten Tabelle alle vorhandenen Spalten angezeigt werden, und ggf. später auch Type und ob es ein Pflichtfeld ist oder nicht usw…

@Andreas: Werde ich mir mal ansehen, danke.

Hab was in der Doku gefunden:
zum Befehl pg-dump

pg-dump -s

–schema-only
[-s]
Sichert nur das Schema (Definitionen), nicht die
Daten.

Kann mir jemand kurz sagen, wie ich den Befehl im PHP einzubinden habe? Bzw. liefert dies die Tabellennamen in meinem public-Schama? Und nur diese als Liste?

Grüße und Besten Dank.
Micha

Hab jetzt was gefunden, was bei mir im Terminal auch funktioniert, nur ich bekomme es im PHP Script mit pg_query nicht zum laufen:

SELECT relname   FROM pg_class  WHERE relname !~ '^(pg_|sql_)'    AND relkind = 'r';  -- using INFORMATION_SCHEMA:  SELECT table_name   FROM information_schema.tables  WHERE table_type = 'BASE TABLE'    AND table_schema NOT IN        ('pg_catalog', 'information_schema'); 
 

Wie muss ich den Code in PHp noch bearbeiten bzw. liegt es an den ‘…’-Formatierungen?

mod_che

Bringt PHP eine Fehlermeldung oder erhälst Du ein leeres result?

ein leeres resultat

ich denk mal an dieser php-Zeile ist was nicht OK.

$query2 = ‘SELECT table_name FROM information_schema.tables WHERE table_type = ‘‘BASE TABLE’’ AND table_schema NOT IN (’‘pg_catalog’‘, ‘‘information_schema’’);’;

wobei ich für " zwei einzelne ’ ’ eingegeben habe.

Wenn ich den pefehl im psql direkt eingeben, bekomme ich eine richtige ausgabe.

wobei ich für " zwei einzelne ’ ’ eingegeben habe.

Evtl. bereitet das die Probleme. Versuch mal mit ', also Escape die einfachen Anführungszeichen.

Hallo. Hab ich versucht, hat mich aber auch nicht weitergebracht.

Habe jetzt aber noch den Befehl

SELECT table_name FROM information_schema.tables WHERE table_schema = 'public' 

gefunden (PostgreSQL: Documentation: Manuals: PostgreSQL 8.0: Accessing a Database). Dadurch gibt mir psql alle meine Tabellennamen aus. Nun müsste es doch auch möglich sein, dies in PHP zur Erzeugung einer Liste zu benutzen oder?

Ich denke mir das so: Ich bräuchte eine Möglichkeit die Ausgabe der Tabellennamen ala Tabname[1], Tabname[2] gezielt zu ereichen, weil dann kann ich mit einer Schleife im PHP eine Liste anlegen lassen von 1 bis 10 laufen lassen und habe dann alle Tabellennamen in einer PHP-Auswahlliste, oder?

Weiss jemand, wie ich diese Funktionalität in PHP realisieren könnte?

mod_che

[color=#000000][color=#0000bb]SELECT table_schema, table_name FROM information_schema[/color][color=#007700].[/color][color=#0000bb]tables WHERE table_schema [/color][color=#007700]= [/color][color=#dd0000]'public'[/color][/color]

Die Implementierung einer Schleife oder eines Loops in PHP sollte einfach sein - oder?

Ja, bzw. ich würds glaube ich hinbekommen, meine Frage ging ja auch dahin, dass ich nicht verstehe, wie ich aus

postgres=# SELECT table_schema, table_name FROM information_schema.tables WHERE table_schema = ‘public’ postgres-# ;
table_schema | table_name
--------------±------------------
public | kuchen
public | brote
public | schoko
public | obst
public | gemuese
(5 Zeilen)

nun eine PHP-Auswahlbox erstellen kann. Wie kann ich nun zB ‘schoko’ in einer Variable speichern, also sozusagen a-l-l-e Tabellennamen nacheinander in einen Array legen, den ich dann mit Laufe-von-0-bis-4-Schleifchen benutzen kann. Seen?

Ich glaube, du möchtest dich mit der PHP Dokumentation auseinander setzen:

PHP: PostgreSQL - Manual
PHP: PDO - Manual

Danke ads, gute URLs und ich hab mich jetzt ehrlich ein paar Stunden mit dieser ganzen Sache beschäftigt.

Aber ich bekomme es nicht hin und ich denke mir doch wirklich, dass jemand hier im Forum das a) schon mal gemacht hat oder b) zumindest mal mit zwei oder drei Sätzchen sagen kann, wie es vom Prinzip her geht.

Also nochmal: Ich möchte ein PHP-Auswahlfeld (also so mit section option1 option2 /section) dynamisch generieren und zwar aus den Tabellennamen einer Postgres-DB. Ich benutze PHP > 5 und Postgres >8.2 auf einem Windows Vista, Apache und Postgres laufen und im psql funktioniert die Aussgabe der Tabellen auch, aber ich kann die Tabellennamen im PHP nicht einlesen bzw. ich finde den richtigen Befehl dafür nicht, weil alle pg_fetch_(XYZ)… usw… ja für Datensätze sind, ich aber die Tabellennamen haben will.
Dann habe ich mir die FAQ zum information_schema angesehen, daraus werde ich aber nicht schlau, ich weiss nicht, wie ich das benutzen kann. Für die Spaltennamen habe ich die Abfrage schon dynamisch hinbekommen, die läuft auch super, wenn man die Tabelle auswählt:


<?php $tabname = $_REQUEST['tabellenname']; ... $query2 = 'SELECT * FROM "public".'.$tabname.';'; $res = pg_query($query2) or die('Abfrage fehlgeschlagen: ' . pg_last_error()); $nf = pg_num_fields ($res); echo 'Tabellen-ID: '.$tabname.' '; ?>

<select name=“tablefile” size=“20” /*Auswahlfeld nlegen und formatieren */
style=“padding: 5px; width: 300px;”>

<?php for ($i = 0; $i < $nf; $i++) { echo ''.$i.' '.pg_field_name ($res, $i).''; // Namen der Spalten in Tabelle } echo ''; echo ' Anzahl der Felder: '.$nf.' '; // Anzahl der Spalten in Tabelle ?>

Deswegen nochmal ganz freundlich an alle die Bitte, mir zu helfen. Bitte! Und Danke für die Antworten und Linktipps usw., das hat mir schon sehr geholfen und ich weiss, ich sollte nochmal einige Grundlagen lesen… :wink:
Schönen Abend
mod_che

Args, du hast mindestens einen schwerwiegenden Bug in deinem Code, der jedem Angreifer die Türen öffnet.

Bitte, BITTE beschäftige dich zuerst mit PHP und wie man damit programmiert. Ausreichend Literatur zu diesem Thema gibt es.

Vorher bin ich nicht bereit ein Beispiel zu liefern weil du wahrscheinlich nicht verstehst wie das Beispiel komplett funktioniert.

OK; logisch die Info kommt per Post wieso dann Request nehmen, ist sicherlich etwas altmodisch bzw. unsicher, da hast Du sehr recht.

Weisst Du, ich will gar kein fertiges Beispiel, ich würde gerne nur wissen mit welchen 1,2, 3 Befeheln das möglich ist oder was ich mir genauer ansehen müsste.

Grüße
Michi

PHP: pg_query - Manual

Da ist unten sogar ein sehr gutes Beispiel mit dabei

Ach so, Du suchst das immer noch. Ich hab Dir vor eineinhalb Wochen schon gesagt, wie das geht.

Dann habe ich mir die FAQ zum information_schema angesehen, daraus werde ich aber nicht schlau, ich weiss nicht, wie ich das benutzen kann. Für die Spaltennamen habe ich die Abfrage schon dynamisch hinbekommen, die läuft auch super, wenn man die Tabelle auswählt:

Eine FAQ zum information_schema kenne ich nicht, wohl aber die offizielle Doku. Und wenn Du da mal reinschauen würdest, könntest Du erkennen, daß diese Tabellen dort exakt das enthalten, was Du brauchst,
um via schemata → tables → columns alle Infos Über Schemas, Tabellen und Spalten zu erfahren.

Was Dein PHP betrifft: mach Dich mal schlau, was SQL-Injection bedeutet, Links dazu hier:
Search results for injection on Delicious


Andreas

Wiederum Dankeschön für die Antworten, mit diesem Beispiel hat es dann endlich geklappt die Tabellennamen in eine selection in PHP zu überführen…

Jetzt mache ich mich an Session IDs.