Stored Procedures sind eine sehr gute Funktion. Ein DBMS (Datenbank Management Systeme), welches diese Funktion mitbringt ist MS-SQL. Doch wie funktioniern die Stored Procedures im Zusammenspiel mit PHP?
Aufruf von Stored Procdures in PHP
Wie rufe ich ein Stored Procedure in MS-SQL mit PHP auf? Vorab die Beispieldefinition. Aufgerufen soll die Stored Procedure "tolleProzedur". Die S.P. nimmt folgende Parameter entgegen. Eine ID (Integer) und eine Attribut mit dem Namen "title", welches ein VARCHAR ist.
Den Scriptteil zur Verbindung zum MS-SQL Server und der Auswahl der Datenbank findet ihr in Listing 1. Diesen Teil benötigt ihr natürlich immer um Operationen auf der Datenbank durchzuführen.
Listing 1
Download Code!
// Aufbauen der Verbindung
$connection = mssql_connect('hostname', 'user name', 'passwort');
// Wahl der Datenbank
mssql_select_db('datenbankname', $connection);
Mir sind insgesamt drei Arten bekannt um in MS-SQL mit PHP ein Stored Procedure auszufüren.
Inline Aufruf Stored Procdures
Das erste seht ihr in Listing 2. Es wird so der mssql_execute Funktion übergeben.
Listing 2
Download Code!
$result = mssql_query("EXEC tolleProzedur 5, 'Toller Titel'", $connection);
Inline Aufruf Stored Procdures mit Named Parameters
Es funktioniert, aber es ist leider nicht so aussagekräftig, wie beispielsweise das Listing 3. Hier wird mit, ich nenne es, "Named Parameters" gearbeitet. Sehen können wir das an dem vorgestellten @-Zeichen, gefolgt vom Namen des Parameters.
Listing 3
Download Code!
$result = mssql_query("EXEC tolleProzedur @ID=5, @title='Toller Titel'", $connection);
Perpared Statement und Stored Procdures
Als dritte Möglichkeit, gibt es noch das ganze als Perpared Statement in MS-SQL auszuführen.
Ein Prepared Stament in MS-SQL mit PHP wird mit der mysq_bind() Funktion:
bool mssql_bind ( resource stmt, string param_name, mixed var, int type [, int is_output [, int is_null [, int maxlen]]])
gebaut. Unser Beispiel sieht als Prepared Statement so aus:
Listing
Download Code!
// Prepared Statement initalisieren
$bindRessourceID = mssql_init('tolleProzedur', $connection);
// Binden des Parameters ID
mssql_bind($bindRessourceID, '@ID', 5, SQLINT11, false);
// Binden des Parameters title
mssql_bind($bindRessourceID, '@title', 'Toller Titel', SQLINT11, false);
// Ausführen des Prepared Statements
$result = mssql_execute($bindRessourceID);
Der Vorteil der Lösung mit Prepared Statements ist, zum einen, die explizite Typisierung, die man vornehmen kann. Beispielsweise mit SQLINT und SQLVARCHAR.
Ein anderer Vorteil, der meiner Meinung nach noch viel gewichtiger ist, liegt eindeutig in der Sicherheit gegen SQL-Injektionen (SQL-Inkection). Als Vorsichtsmaßnahme, sollte trotzdem der User, der stark in seinen Rechten eingeschränkt werden.
Alle Rechte sollten auf das absolute Minimum reduziert werden.