[PHP] Select Menu

Helios co.

Lt. Commander
Registriert
März 2005
Beiträge
1.863
Hallo,ich habe folgenden code:

Code:
//Die beiden Werte, welche aus den Select-Menus übertragen werden
	$tabelle = $_POST['Tabelle'];
	$aktion = $_POST['Aktion'];
	
[B]	$sql = "SELECT * FROM '$tabelle';";[/B]
	
	$anfrage = @pg_query($sql);
	
	[B]$zeilenZahl = pg_num_rows($anfrage);
	$felderZahl = pg_num_fields($anfrage);
[/B]


D.h. ich lese einen Wert, der über ein Select-menu definiert wird aus
und möchte diesen Wert (der Tabellenname) in der Select-anweisung nutzen.

Das Problem ist nun, dass ich bei zeilenZahl und felderZahl eine Exception bekomme:
Warning: pg_num_rows(): supplied argument is not a valid PostgreSQL result resource in E:\EasyPHP 2.0b1\www\interface.php on line 23

Warning: pg_num_fields(): supplied argument is not a valid PostgreSQL result resource in E:\EasyPHP 2.0b1\www\interface.php on line 24

Woran iegt das?
Genau so bin ich vorgegangen wenn ich lediglich ein eingabefeld anstelle der select-menus genutzt habe: Und das hat gefunzt.

Thx für Hilfe
 
Hallo Helios co.,

was steht denn in den Variablen?
Und hast du schonmal dir das SQL Statement ausgeben lassen, und es in deinem SQL Mananger getest?

Das wären die ersten Ansätze um selber zu Debuggen ;)

Grüße

tewes
 
Hatte beides schon gemacht :)

Wenn ich in: $sql = "SELECT * FROM '$tabelle';";
die Variable $tabelle austausche durch einen Tabellennamen,so funzt das.

Auch habe ich: $tabelle = $_POST['Tabelle'];
mittels echo($tabelle);
ausgeben lassen,wasdiegewünschten Tabellennamen in richtiger Form liefert.
(auch ein Vergleich der Art: $tabelle == "familie" funzt damit.

Mein anfänglicher Verdacht war, dass es ein cast-Problem ist.
Sprich dass ein String in der SQL-Anfrage erwartet wird aber '$tabelle' kein String ist.
(scheint mir aber inzwischen eigentlich abwegig )


Ich habe das Problem jetzt mittels Case-Abfrage und Vergleich umgangen, jedoch finde ich diese Lösung nicht sonderlich schön.
 
Vielleicht solltest du per URL nur ein ID übergeben und dann in deinem Script ein Array erstellen in dem die Tabellen Namen stehen. Damit verhinderst du zugleich noch SQL - Injections.

Grüße

tewes
 
Soweit ich SQL kenne, werden Tabellennamen nicht in Single Quotes angegeben. Entferne einfach mal die Anführungszeichen um die Variable $tabelle.
PHP:
$sql = "SELECT * FROM $tabelle;";
Falls Du den Tabellennamen maskieren willst (für den Fall, dass eine Tabelle auch den Namen eines reservierten Wortes haben kann) solltest Du Backticks ( ` ) benutzen:
PHP:
$sql = "SELECT * FROM `$tabelle`;";

Eine andere Idee wäre noch: Musst Du bei PostreSQL nicht vorher auch eine Datenbank auswählen? Das machst Du aber vermutlich schon an anderer Stelle.

EDIT: Übrigens solltest Du UNBEDINGT die Werte in $_POST genaustens überprüfen, bevor Du sie in einen SQL-Query einsetzt. In der momentanen Fassung eröffnet das ja Tür und Tor für XSS und SQL-Injection!
 
Zuletzt bearbeitet: (Hinweis)
Ich glaube dein Problem liegt daran das in der SQL-Abfrage die Variable $tabelle nicht durch ihren eigentlichen wer ersetzt wird, was auch erklärt warum es "funzt" wenn du einen tabellen-namen von hand eingibts

Meines erachtens müsste da so aussehen, damit deine Variable $tabelle wirklich durch denn eigentlichen Wert ersetzt wird, anders versucht du aus der Tabelle mit dem Namen $tabelle zu lesen.

PHP:
$sql = "SELECT * FROM ".$tabelle." ";

Auch eine Hilfreiche Methode um Fehler zu finden ist die Funktion: mysql_error() . Ich weiß leider nicht was für eine Datenbank du benutzt, aber mit MySQL-Datenbanken funktioniert folgender Code:
PHP:
$result = mysql_query($sql) OR die(mysql_error());
 
Zuletzt bearbeitet:
@ tewes

bin leider nur ein nube, könntest du mir ein Beispiel für deine Idee zeigen?

@Lord Alien & Prypjeat

klappt leider auch nicht: Derselbe Effekt :(

$result = mysql_query($sql) OR die(mysql_error());

Ich neutze PostgreSQL. Liefert diese Funktin SQL Fehler?
 
Helios co. schrieb:
Ich neutze PostgreSQL. Liefert diese Funktin SQL Fehler?

Ich würde sagen einfach ausprobieren ^^ Schreibe eine SQL-Abfrage mit einer Falschen Tabelle, dann müsste sowas kommen wie : Unknown Tabelle ...

Warum das immernoch nicht tut is mir sehr rätselhaft !! Aber mir ist doch noch was aufgefallen und zwar hab ich da immernoch " ' ", also anführungszeichen gemacht, also wie folgt:
PHP:
$sql = "SELECT * FROM ' ".$tabelle." ' ";

Bin mir nicht sicher ob es daran liegen kann, aber versuchen kostet ja nix ^^
 
Zuletzt bearbeitet:
Du hast ja eine Seite mit deiner Select Box. In den Option hast du das Attribute value. Da schreibst du ein Zahl rein die gleichzeit die ID ist. Diese ID übergibts du dann per POST oder Get an die nächste Seite.

Auf der Seite hast du dann ein Array in dem dann die Tabellen stehen mit dem dazugehörigen Index.
Dann kannst du ganz leicht schreiben:
PHP:
SELECT * FROM `".$tabels[$_GET['id]]."`

Weiss nicht ob das die richtige Syntax ist. Kenn nur MySQL ;)

Grüße

tewes
 
Mal eine ganz kuriose Idee: Lass mal das Semikolon am Ende der SQL-Anweisung weg. Das gehört laut Syntax zwar dazu, aber ich hatte auch mal ein Problem, wo er das Semikolon nicht haben wollte. Ohne ging es dann komischerweise:
PHP:
$sql = "SELECT * FROM $tabelle";
 
Hallo Helios co.,

nimm mal folgenden Code:

PHP:
//Die beiden Werte, welche aus den Select-Menus übertragen werden
	$tabelle = $_POST['Tabelle'];
	$aktion = $_POST['Aktion'];
	
	$sql = "SELECT * FROM '$tabelle';";
	
	echo "Query: " . $sql . "\n<br/>";
	$anfrage = pg_query($sql) or die(pg_last_error());
	
	[B]$zeilenZahl = pg_num_rows($anfrage);
	$felderZahl = pg_num_fields($anfrage);[/CODE]

Ich hab vor dem pq_query das "@" entfernt um die unterdrückte Fehlermeldung anzuzeigen.
Desweitern "or die(pg_last_error())" hinzugefügt um im Fehlerfall eine brauchbare Fehlermeldung zu erhalten.

Für die Zeit der Debugging (was wir hier gerade machen) hab ich auch den "echo" hinzugefügt, damit du siehst was du an die Datenbank schickst.

Aber ich geben meinen Vorredner recht, du solltest NIEMALS User-Eingaben ungeprüft ausführen, verarbeiten oder weitergeben.
Ein schon genanntes Mapping-Array wäre angebracht, sofern die Tabellen "fest" genug sind.
Wenn sie variabel sind, würde ich vorher eine Plausibilitätsprüfung machen bzw die Funktion pg_query_params verwenden.

Gruß
Nox
 
Zurück
Oben