5 Stimmen

MSSQL Stored Procedures über ODBC ausführen (und die Ergebnisse zurückbekommen) mit PHP

Ich bin gerade dabei, alle unsere PHP-Webanwendungen von unserem Windows-Produktions-Webserver auf eine neue Linux-Serverumgebung speziell für PHP-Anwendungen zu verlagern. Das Schwierige daran ist, dass einige der PHP-Anwendungen, die wir betreiben, MSSQL-Datenbanken verwenden und daher die gesamte DB-Konnektivität neu geschrieben werden muss, um unixODBC/FreeTDS zu verwenden, da PHP unter Linux keine mssql_connect() und die damit verbundenen Funktionen unterstützt.

Ich habe die Konnektivität in den Griff bekommen, und grundlegende Abfragen werden problemlos ausgeführt. Das Problem, das ich habe, ist die Ausführung von gespeicherten Prozeduren und die Replikation der mssql_init()/mssql_bind()/mssql_execute() Funktionalität über ODBC.

Der Problembereich, an dem ich arbeite, ist der folgende:

$sp = mssql_init('sp_Search', $this->_link);
mssql_bind($sp, '@search', $this->_searchString, SQLVARCHAR);
$results = mssql_execute($sp);

Ich habe ein Bündel über die verschiedenen ODBC-Funktionen und MSSQL-Funktionen gelesen. Ich habe versucht, die Funktionen odbc_prepare()/odbc_execute() zu verwenden, ohne Erfolg (ich erhalte immer HY000-Fehlercodes vom SQL-Server). Am ehesten bin ich folgendermaßen vorgegangen:

$results = odbc_exec($this->_link, "EXEC sp_Search @search='@this->_searchString'");

Das Ausführen dieser Abfrage ("EXEC sp_Search @search='blah'") über die MSSQL Management Console funktioniert perfekt, aber über PHP scheint es zu funktionieren, aber wenn ich versuche, die Zeilen aus der Ergebnismenge zu holen, erhalte ich die Fehlermeldung "No tuples available at this result index". Und odbc_next_result() gibt false zurück, egal was passiert.

Ich habe auch versucht, den Cursor für die Verbindung auf SQL_CUR_USE_ODBC zu setzen, aber auch das hat nicht geholfen. Hat jemand Erfahrung mit dieser Vorgehensweise? Ist es überhaupt möglich, oder ist diese Funktionalität ohne den nativen MSSQL-Treiber einfach nicht verfügbar?

Editar:

Nur um das klarzustellen, habe ich versucht, odbc_prepare() und odbc_execute() wie folgt zu verwenden:

$results = odbc_prepare($this->_link, "{CALL sp_Search(?)}");
$params = array($this->_searchString);
odbc_execute($results, $params);

Dies führt zu dem folgenden Fehler:

Warning: odbc_execute(): SQL error: Failed to fetch error message, SQL state HY000 in SQLExecute

3voto

Sean Halls Punkte 112

Hier ist eine objektorientierte Methode, die PDOs verwendet und etwas sicherer ist.

Bitte beachten Sie, dass die Syntax hier für SQL Server 2012 gilt. Der Hauptunterschied liegt in Ihrer SQL-Anweisung (Sie brauchen keine Klammern um die ?s und Sie verwenden EXEC statt CALL).

Außerdem setzt das $dbconn-Objekt in diesem Beispiel voraus, dass Sie eine ordnungsgemäß konfigurierte odbc.ini-Datei und eine gültige ODBC-Konfiguration haben (dies kann je nach Ihrer Distribution schwierig sein... Für den funktionierenden Code dieses Beispiels habe ich FreeTDS auf einer CentOS-Box installiert. Siehe https://serverfault.com/a/622088 für mehr.

$dbconn = new PDO("odbc:YOUR_DB", "YOUR_USER", "YOUR_PASS");

  // Set up some useful error reporting.
  $dbconn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

try {
    $sql = "EXEC [data_mart].[dbo].[your_stored_procedure] ?,?,?";
    $stmt = $dbconn->prepare($sql);
    $id = 1;
    $start_date = "2015-08-01"
    $end_date = "2015-08-02";
    $stmt->bindParam(1, $id);
    $stmt->bindParam(2, $start_date);
    $stmt->bindParam(3, $end_date);
    $stmt->execute();
    $results = $stmt->fetchAll();

    // Quick dump to show that it worked.
    var_dump($results);

} catch (PDOException $e) {
  echo 'An error occured: ' . $e->getMessage();
}

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