PHP & Stored Procedures

Hallo

Ich habe mich dazu entschieden die Programmlogik in PLPGSQL zu schreiben und in PHP nur mehr die Funktionen aufzurufen - wurde mir empfohlen

Ich hab jetzt nicht die geringste Ahnung wie ich das machen soll :frowning:
Angenommen ich rufe die Funktion “SELECT insert_user(‘fooo’);” auf und der Name darf nur 2 Zeichen lang sein. Nun fliegt ein Error. Wie kann ich das am besten an PHP übergeben? Mit unterschiedlichen Error Strings? Z.b. NAME_TOO_LONG

Danke im Voraus
lg

RAISE EXCEPTION, in Deiner Procedure.

Andreas

Vielen Dank für die rasche Antwort.
Welche Funktionen verwendest du in PHP dafür? pg_result_error?
Wie rufst du die SQL Funktion auf? pg_query_params / pg_query / pg_send_query?
Finde die Features von pg_query_params genial - weiß aber nicht wie ich die Exception da abfangen soll

lg

Ich mach nicht so wirklich viel mit PHP, daher nur so viel: so wie alle anderen Funktionen sonst auch.

$result = pg_query($k) or die('Abfrage fehlgeschlagen: ’ . pg_last_error());

Andreas

Das kann ich einem User nicht zurückgeben - der Error ist zu “technisch” :slight_smile:
Da man Constraints leider nicht auswerten kann muss ich den Error wohl parsen oder im PHP getrennt checken :frowning:

lg

Hi damike,
du kannst Constraints zu einem gewissen Grade schon auswerten. Wenn ein Constraint beim Zugriff auf eine Tabelle innnerhalb deiner Funktion verletzt wird, dann fliegt eine Exception, die du behandeln kannst. Dabei stehen dir die Variablen SQLSTATE und SQLERRM zur Verfügung. Leider gibt es wohl keine Möglichkeit, den verletzten Constraint genau rauszukriegen, was z.B. bei zwei UNIQUE-Constraints innerhalb der Tabelle im Falle einer UNIQUE-Verletzung praktikabel wäre.

Du kannst deine Funktionen in vielen Fällen so gestalten, dass du eine planmäßgie Fehlerbehandlung vornimmst und wenn möglich einen geeigneten Fehlercode zurückgibst. Bei Funktionen, die z.B. integer-Typen zurückgeben, bietet sich es sich an, definitiv nicht genutzte Bereiche für Fehlercodes zu verwenden. Beispielsweise könnte es sein, dass du im Normalfall einen positiven Rückgabewert erwartest, negative aber nicht vorkommen. Dann könntest du negative Zahlen für Fehlercodes verwenden, die du dann in PHP auswertest.
Bei komplexeren Typen (z.B. Tabellenzeilen oder selbstgebastelte Typen) kannst du geeignete Felder nutzen im Information im Rückgabewert zu transportieren, während du nicht benötigte Felder NULL-setzt.

Ich persönlich halte übrigens die PHP-Funktion pg_query_params() für in den meisten Fällen besser geeignet, weil sie dir viel Arbeit abnimmt und zudem sicherer ist im Hinblick auf Attacken. Du kannst allerdings immer nur eine Query damit absetzen.

CU
Fröstel