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:
[sourcecode language="css"]aptitude install php5-odbc unixodbc tdsodbc[/sourcecode]
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:
[sourcecode language="css"][FreeTDS]
Description = MSSQL DB
Driver = /usr/lib/odbc/libtdsodbc.so
UsageCount = 1[/sourcecode]
Die benötigten Daten für die Datasources (DSN) können nun unter /etc/odbc.ini eingetragen werden.
[sourcecode language="css"][MeinMSSQLServer]
Driver = FreeTDS
Description = MSSQL Test
Trace = Yes
TraceFile = /tmp/sql.log
ForceTrace = yes
Server = 11.11.11.11
Port = 1433
Database = DatabaseName[/sourcecode]
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:
[sourcecode language="css"]isql DSN username password[/sourcecode]
also z.B.:
[sourcecode language="css"]isql MeinMSSQLServer sa geheim
+—————————————+
| Connected! |
| |
| sql-statement |
| help [tablename] |
| quit |
| |
+—————————————+
SQL>[/sourcecode]
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:
[sourcecode language="css"]# configuration for php ODBC module
extension=odbc.so[/sourcecode]
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:
[sourcecode language="css"]<?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);
?>[/sourcecode]
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



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
Alex
Hallo,
erst einmal danke für dieses klasse tut. nur leider habe ich unterhalb von /etc keine datei namens odbcinst.ini. diese datei finde ich nur unterhalb von /usr/share/tdsobc/. Ich habe hier dann dei anpassungen vorgenommen, doch wenn ich dann mittel ISQL eine abfrage abschicken möchte, erhalte ich die fehlermeldung: could not SQLConnect.
Hast du eventuell eine idee?
Getestet unter Debian 6
Danke und viele Grüße,
alex