4 Stimmen

PHP ruft PostgreSQL-Funktion auf - Typproblem?

Ich habe eine Funktion in PostgreSQL / plpgsql mit folgender Signatur:

CREATE OR REPLACE FUNCTION user_login(TEXT, TEXT) RETURNS SETOF _get_session AS $$ ... $$

Wo _get_session eine Ansicht ist. Die Funktion funktioniert einwandfrei, wenn ich sie von phpPgAdmin aus aufrufe, aber wenn ich sie von PHP aus aufrufe, erhalte ich den folgenden Fehler:

Warnung: pg_query() [function.pg-query]: Abfrage fehlgeschlagen: FEHLER: Typ "session_ids" existiert nicht KONTEXT: Kompilierung der PL/pgSQL-Funktion "user_login" in der Nähe von Zeile 2 in /home/sites/blah.com/index.php Zeile 69

Der DECLARE-Abschnitt der Funktion enthält die folgenden Variablen:

oldSessionId session_ids := $1;
newSessionId session_ids := $2;

Der Domäne session_ids EXISTIERT, und andere Funktionen, die dieselbe Domäne verwenden, funktionieren, wenn sie aus demselben Skript heraus aufgerufen werden. Das PHP sieht wie folgt aus:

$query = "SELECT * FROM $dbschema.user_login('$session_old'::TEXT, '$session'::TEXT)";
$result = pg_query($login, $query);

Ich habe auch versucht, dies zu verwenden ::session_ids anstelle von ::TEXT beim Aufruf der Funktion, aber ich erhalte den gleichen Fehler.

Hilfe :o(

1voto

Frank Heikens Punkte 105033

Machen Sie Ihren Code einfach:

$query = "SELECT * FROM $dbschema.user_login($1, $2)";
$result = pg_query_params($login, $query, array($session_old, $session));

Jetzt sind Sie vor SQL-Injectionen geschützt.

Aber Ihre Funktion ist immer noch falsch, es gibt keinen Datentyp "session_ids". Ich denke, Sie möchten TEXT im DECLARE-Teil verwenden.

1voto

Joseph Punkte 1958

Wenn Ihre Abfrage mehrere Zeilen umfasst, sendet PHP sie höchstwahrscheinlich nicht als Teil derselben Transaktion. Wenn dies der Fall ist, haben Sie zwei Optionen.

Die erste Option besteht darin, alle Abfragen in einem einzigen Aufruf zu senden

pg_query("query1; query2; query3;");

Die zweite Option (und meiner Meinung nach die beste) besteht darin, Transaktionen zu verwenden. Dadurch können Sie die Aufrufe über mehrere Zeilen tätigen, obwohl wahrscheinlich das 'begin'-Statement mit der ersten Abfrage gesendet werden muss.

pg_query("begin; query1;");
pg_query("query2;");
pg_query("commit;");

Wenn ein Fehler auftritt, ersetzen Sie das commit durch ein rollback, und es wurden keine Änderungen an der Datenbank vorgenommen.

Bei der Arbeit mit Postgres ist dies tatsächlich eine gute Faustregel, der man folgen sollte.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X