MSSQL Zugriff unter Debian Etch mit unixODBC und FreeTDS
Wer von unixoiden Systemen auf Datenbanksysteme in der Windows Welt zugreifen wollte, hatte es bisher oft nicht leicht. PHP wollte mit ODBC Support häufig selbst kompiliert werden, Pakete für FreeTDS oder unixODBC waren auch nicht immer vorhanden und dann folgte nach die Konfiguration selbst. Unter Debian Etch ist dies alles kein Problem mehr.
Wer bereits einen Webserver + PHP installiert hat, muss nur noch folgende Pakete installieren:
aptitude install php5-odbc unixodbc tdsodbc
PHP4 Benutzer sollten hier natürlich analog das php4-odbc Paket installieren. Dieses bringt das von PHP benötigte ODBC Modul mit. unixODBC ist eine Open Source Implementation der unter Windows sehr populären ODBC API. Bei FreeTDS handelt es sich um die freie Implementation des TDS Protokolls, welches von Sybase ASE oder Microsoft SQL Server genutzt wird.
Nach der Installation findet man unterhalb von /etc die unixODBC Konfigurationsdateien odbc.ini und odbcinst.ini. In der odbcinst.ini muss nun die Verknüpfung zur FreeTDS Library angegeben werden. Somit könnte diese Datei wie folgt aussehen:
[FreeTDS] Description = MSSQL DB Driver = /usr/lib/odbc/libtdsodbc.so UsageCount = 1
Die benötigten Daten für die Datasources (DSN) können nun unter /etc/odbc.ini eingetragen werden.
[MeinMSSQLServer] Driver = FreeTDS Description = MSSQL Test Trace = Yes TraceFile = /tmp/sql.log ForceTrace = yes Server = 11.11.11.11 Port = 1433 Database = DatabaseName
MeinMSSQLServer ist in diesem Fall der Name der erzeugten DSN. Mit der Trace Option wird ein Logfile an der mit TraceFile angegebenen Position erstellt. Nun kann man bereits die Verbindung mit dem von unixODBC mitgelieferten Tool isql testen. Der Aufruf von isql ist denkbar einfach:
isql DSN username password
also z.B.:
isql MeinMSSQLServer sa geheim +---------------------------------------+ | Connected! | | | | sql-statement | | help [tablename] | | quit | | | +---------------------------------------+ SQL>
Schon erhält man einen simplen Abfrageeditor, in dem man Abfragen in der angegeben DSN ausführen kann. Sollte hier eine Fehlermeldung auftreten, müssen die gemachten Einstellungen nochmal überprüft werden. Ansonsten wird der Zugriff auf die ODBC Verbindung auch über PHP fehlschlagen.
Damit man mittels PHP auf die eben erstellte ODBC Verbindung zugreifen kann, muss vorher überprüft werden, ob das PHP ODBC Modul geladen wurde. Dieses erfährt man anhand der Datei /etc/php5/conf.d/odbc.ini mit dem Inhalt:
# configuration for php ODBC module extension=odbc.so
Ein Neustart des Webservers und schon ist der PHP ODBC Support aktiviert. Nun noch ein einfaches Testskript schreiben, welches die Verbindung testet. Dieses Beispielskript muss natürlich der jeweiligen Datenbankstruktur angepasst werden:
<?php
$connect = odbc_connect("MeinMSSQLServer", "sa", "geheim");
$query = "SELECT * FROM TestTabelle";
$result = odbc_exec($connect, $query);
while(odbc_fetch_row($result)) {
$field1 = odbc_result($result, 1);
$field2 = odbc_result($result, 2);
echo $field1;
echo $field2;
}
odbc_close($connect);
?>
Sollte nun eine Ausgabe der Daten aus der MSSQL Datenbank erscheinen, hat alles geklappt und man kann seine PHP Skripts problemlos auf einen Linuxserver umziehen lassen.
Links:
FreeTDS Userguide
FreeTDS Homepage
unixODBC Dokumentation
unixODBC Homepage
Related posts:
- Zeitsynchronisation unter Debian Etch mit chrony PCs speichern ihre Uhrzeit mithilfe eines kleinen Chips: der Realtime Clock (RTC). Häufig ist dies...
- Howto: monit unter Debian Etch Software kann Fehler haben und bedingt durch diese Fehler abstürzen. Wenn der Absturz schnell bemerkt...
- Bash Completion unter Debian Etch Die Autovervollständigung ist schon eine sehr hilfreiche Funktion der Bourne Again Shell. Um diese unter...
- Howto: MailScanner Tuning unter Debian Etch Ich nutze zum Aufspüren von Spam und Viren MailScanner in Verbindung mit Postfix auf unserem...
- Howto: Installation von Nessus 3 unter Debian Etch Wer nach einem guten Vulnerability Scanner für Linux sucht, kommt kaum am freien Scanner Nessus...



Cyborax
Hallo,
zuerst einmal muss ich ein Großes Lob zu diesem Tutorial ausprechen! Es ist die Einzige am Stück verfasste Anleitung wie man genau das Problem löst was ich habe.
Ich möchte nämlich eine Access-Datenbank (test.mdb) welche auf einem Windowsserver (testserver) liegt mit einem anderen vorhandenen Debian Webserver öffnen und auslesen.
Da ich das ganze erstmal ausprobieren wollte habe ich mir auf meinem lokalen pc (windoofXP) einen Webserver installiert und das mal mit dem WindowsODBC-treibern usw ausprobiert. hat wunderbar geklappt.
Naja anschließend habe ich dein schönes Tutorial auf unserem Debian Webserver angewendet. Habe also erstmal odbcphp5 nachinstalliert weil der Server mir bei dem Versuch odbc_connect() zu benutzen immer den Fehler gebracht hat, dass die Funktion nicht vorhanden sei. Dann noch eben in die odbc.ini
1. # configuration for php ODBC module
2. extension=odbc.so
Und schon kahm dieser Fehler nicht mehr. Nun bekam ich den Fehler:
Warning: odbc_connect() [function.odbc-connect]: SQL error: [unixODBC][Driver Manager]Data source name not found, and no default driver specified, SQL state IM002
Also hab ich im /etc/odbcinst.ini
[myODBC]
Description = MSSQL DB
Driver = /usr/lib/odbc/libtdsodbc.so
UsageCount = 1 // Braucht man das?
das hier reingeschrieben und getestet.
Hier mal mein PHP-Script das ich zur Abfrage benuzte:
< ?$tabelle1 = "AB_12_08";
$tabelle2 = "ABWES_DEF";
$tabelle3 = "PERSONAL";
$uid = "";
$pwd = "";
$odbc ="SELECT t1.kenn_nr,t3.name,t1.von,t1.bis,t2.name,t2.nr FROM (($tabelle1 AS t1 INNER JOIN $tabelle2 AS t2 ON t2.nr = t1.art-3)INNER JOIN $tabelle3 AS t3 ON t3.pers_nr = t1.kenn_nr)";
$conn = odbc_connect('DRIVER={myODBC}; DBQ=////WindowsServer//test.mdb',$uid,$pwd)
or die ("Fehler beim Datenbankaufruf");
$result = odbc_exec($conn, $odbc);
$i=1;
while ($row = odbc_fetch_row($result, $i)){
echo odbc_result($result,1)." | ";
echo odbc_result($result,2)." | ";
echo substr(odbc_result($result,3),0,10)." | ";
echo substr(odbc_result($result,4),0,10)." | ";
echo odbc_result($result,5)." | ";
echo odbc_result($result,6)." |
";
$i++;
}
?>
Naja und nun bekomm ich den Fehler:
Warning: odbc_exec() [function.odbc-exec]: SQL error: [unixODBC][MySQL][ODBC 3.51 Driver][mysqld-5.0.51a-15]No database selected, SQL state 3D000
Ich vermute, dass ich entweder den Falschen Treiber benutze oder irgendwas mit dem (DBQ=////WindowsServer//test.mdb) Datenbankpfad nicht stimmt aber auch wenn ich es mit dem lokalen Pfad ( /var/www/htdocs/test/test.mdb) geht es nicht.
Wo liegt da nun der Fehler? Ich würde mich über eine Antwort sehr freuen.
Gruß Cyborax
Thoralf
@Cyborax
in der odbc.ini hast du doch schon die Datenbank ausgewählt? Oder hast du keine odbc.ini angelegt? Schau dir doch das Tutorial noch einmal an, hier ist auch ein entsprechender php schnippsel. Dein odbc_connect ist zwar laut php.net korrekt aber nicht für diesen Treiber. Bei diesem Treiber benötigst du lediglich die DSN (odbc.ini) und in der DSN legst du die entsprechende Datenbank fest. Für jede Datenbank benötigst du also eine DSN welche du alle in die odbc.ini reinschreiben kannst.
Den schnippsel “‘DRIVER={myODBC}; DBQ=////WindowsServer//test.mdb’” kannst du getrost vergessen. statt dessen halt einfach die DSN eintragen.
Grüße Thoralf
Thoralf
noch eine kleine anmerkung, was mir grad beim nochmaligen lesen aufgefallen ist….. du versuchst ja auf eine access datenbank zuzugreifen. demnach läuft bei dir kein SQL Server sondern “nur” ein Datenbankfile.
Schau dir hierzu mal http://www.freetds.org/userguide/dsnless.htm an. Hier kannst du nachlsene wie eine Verbindung ohne DSN machbar ist. Weis jetzt aber nicht ob dies überhaupt auf access files möglich ist.
Flo
Hi, ich bin auch schwer überzeugt von der Howto
Die Abfrage von der CLI klappt ohne Probleme.
Nur wenn ich per PHP loslege, bekomme ich immer leere Resultate (also eine Seite mit komplett leerem HTML-Quelltext ausgeworfen)
Es gibt keine Fehlermeldung.
Irgendwer eine Idee was ich falsch mache?
Grüße,
Flo