Skip to main content

Zugriff von PHP5 und Debian auf MSSQL Server

This blog post might be outdated!
This blog post was published more than one year ago and might be outdated!
· 3 min read
Stephan Hochdörfer
Head of IT Business Operations

In einem aktuellen Projekt ist es notwendig, dass unsere Anwendung mit einem MSSQL Server zu kommuniziert. Grundsätzlich natürlich kein Problem wenn wir die Möglichkeit hätten auf dem Server per PHP Skript einen direkten Zugriff zu erhalten um von dort aus die Daten in unsere Postgres Datenbank zu pushen. Allerdings haben die Systemadministratoren des Kunden naturgemäß etwas dagegen. Es bleibt also nur der Direktzugriff per unixODBC / FreeTDS von einem der Debian-Server auf dem unsere Anwendung läuft. unixODBC ist eine Open Source Implementation der in der Windows-Welt populären ODBC API. Bei FreeTDS handelt es sich um die freie Implementation des TDS Protokolls, welches unter anderem auch vom Microsoft SQL Server genutzt wird.

Die Installation gestaltete sich als etwas umständlich, deshalb hier eine Erklärung der einzelnen Schritte die unternommen wurden. Vor der eigentlichen Installation war es notwendig die MSSQL Datenbank per ODBC zugreifbar zu machen. Ein Tutorial für die notwendige Konfiguration findet sich hier.

Installation der benötigten Pakete im Debian Style
apt-get install php5-odbc unixodbc tdsodbc

Nach der Installation findet man die unixODBC Konfigurationsdateien odbc.ini und odbcinst.ini in /etc. Die Konfigurationsdatei /etc/odbcinst.ini kann für die weiteren Schritte ignoriert werden. Es folgen die Anpassungen der Konfigurationsdatei /etc/odbc.ini:
[ODBC Data Sources]MyDatasource = MSSQL Server[MyDatasource]Driver = /usr/lib/odbc/libtdsodbc.soDescription = My custom DatasourceTrace = YesTraceFile = /tmp/sql.logServername = Win2008Database = WinDSN

[Default]
Driver = /usr/lib/odbc/libtdsodbc.so

Im folgenden PHP Code werden wir auf den Namen der Datasource "MyDatasource" referenzieren. Alle weiteren Angaben zum Server oder Port müssen in den Konfigurationsdateien der Anwendung nicht mehr angeben werden. Damit unixODBC bzw. FreeTDS den Server Win2008 finden kann muss in der Konfigurationsdatei von FreeTDS die Verbindungsdaten hinterlegt werden, dazu am Ende der Datei folgende Zeilen einfügen:
[Win2008]host = 192.168.2.230port = 1433

Ein Test der Verbindung kann mit dem von unixODBC mitgelieferten Tool isql erfolgen. Der Aufruf lautet wie folgt:

isql DSN username password

Bei korrekter Konfiguration sollte sich ein simpler Abfrageeditor öffnen mit dem Abfragen an die Datasource testen kann. Beim Auftreten von Fehlermeldungen müssen die gemachten Einstellungen nochmal überprüft werden, sonst wird der Zugriff auf die ODBC Schnittstelle auch über PHP fehlschlagen. Sollte die Verbindung nicht gleich funktionieren sollte man auf jeden Fall auch einmal die Firewall Einstellungen auf Windows-Seite prüfen und ggf. den nötigen Port (1433) öffnen.

Damit man mittels PHP auf die eben erstellte ODBC Verbindung zugreifen kann, muss das PHP ODBC Modul geladen werden. In der Ausgabe von phpinfo() läßt sich sehen ob das ODBC Modul geladen ist oder nicht. Unter Debian aktiviert man das ODBC Modul in dem man die Datei /etc/php5/conf.d/odbc.ini öffnet, der Inhalt sollte wie folgt aussehen:
# configuration for php ODBC moduleextension=odbc.so

Zum Testen der Verbindung aus PHP heraus kann dieses Beispielskript verwendet werden:

putenv("FREETDSCONF=/etc/freetds/freetds.conf");
putenv("ODBCINI=/etc/odbc.ini");

$dsn = "MyDatasource";
$user = "phpuser";
$pw = "phppwd";

$connect = odbc_connect($dsn, $user, $pw);
$query = "SELECT \* FROM artikel";
$result = odbc_exec($connect, $query);
while($ret = odbc_fetch\_array($result))
{
var_dump($ret);
}