SQL Select-Befehle mit PHP zu MS SQL Server via unixODBC und freeTDS
sind fehlerhaft unter 64 Bit (openSUSE 10.2 und 11.1) und sind korrekt
unter 32 Bit (openSUSE 10.2 und 11.1).
Die Aufgabe:
PHP auf openSUSE 10.2 x86_64 soll Verbindung zu MS SQL Server 2000 aufnehmen.
Die Installation:
openSUSE 10.2 x86_64 ist eine Standardinstallation, keine GUI, nur Textmodus.
Dann openSUSE RPMs:
apache2 (v2.2.3)
apache2_mod_php5 (v5.2.0-10)
unixODBC gibts als openSUSE RPM aber libtdsodbc.so fehlt.
Deswegen selbst kompiliert (v2.2.14).
./configure --enable-gui=no
make
make install
Environmentvariable LD_LIBRARY_PATH gesetzt in /etc/profile.local.
LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:/usr/local/lib
export LD_LIBRARY_PATH
freeTDS selbst kompiliert (v0.82).
./configure --with-tdsver=8.0
make
make install
tds.driver Datei mit:
[FreeTDS]
Description = v0.82 with protocol v8.0
Driver = /usr/local/lib/libtdsodbc.so
Treiber installieren:
odbcinst -i -d -f tds.driver
tds.datasource-Datei mit:
[MSSQLServer]
Driver = FreeTDS
Description = Datenbank
Trace = No
Server = IP des SQL Servers
Port = 1433
Database = Datenbank
Installieren:
odbcinst -i -s -f tds.datasource
odbcinst -j liefert:
unixODBC 2.2.14
DRIVERS............: /usr/local/etc/odbcinst.ini
SYSTEM DATA SOURCES: /usr/local/etc/odbc.ini
FILE DATA SOURCES..: /usr/local/etc/ODBCDataSources
USER DATA SOURCES..: /root/.odbc.ini
SQLULEN Size.......: 8
SQLLEN Size........: 8
SQLSETPOSIROW Size.: 8
Verbindung zum SQL-Server auf der Konsole:
isql -v MSSQLServer user password
+---------------------------------------+
| Connected! |
| |
| sql-statement |
| help [tablename] |
| quit |
| |
+---------------------------------------+
select-Befehle hier sind ok.
Auch: Die Logs von unixODBC und freeTDS zeigen, dass alle Daten ankommen.
Bis hierher scheint es also ok zu sein.
Nun PHP.
Das php5-odbc-RPM von openSUSE installiert odbc.so.
odbc.so als Extension in php.ini eingetragen.
Apache restart: PHP-Skript bekommt keine Verbindung zum SQL-Server.
Also odbc.so neu kompiliert.
php5-devel und autoconf installiert.
openSUSE-RPM php.src (v5.2.0-10) installiert.
Bekomme php5-5.2.0.tar.bz2.
Auspacken.
Nach Unterordner ext/odbc.
phpize
./configure --with-unixODBC=shared,/usr/local
make
Im Unterordner modules ist nun odbc.so.
Nach /usr/lib64/php5/extensions kopiert.
Eintrag in der /etc/phph5/apache2/php.ini:
extension = odbc.so
apache restart.
2 PHP-Skripte geschrieben, siehe unten:
Skript1: select auf Tabelle mit 1 Datensatz: Liefert nichts.
Skript2: select auf Tabelle mit 10389 Datensätze: Liefert 10283 Datensätze.
D.h. die Ausgabe ist fehlerhaft.
PHP liefert keinen ehler.
Das gleiche Vorgehen auf openSUSE x86_32:
Skript1: select auf Tabelle mit 1 Datensatz: Liefert 1 Datensatz.
Skript2: select auf Tabelle mit 10389 Datensätze: Liefert 10389 Datensätze.
D.h. die Ausgabe ist korrekt.
Fazit:
32 Bit scheint ok zu sein.
64 Bit scheint bis zu unixODBC und freeTDS ok zu sein.
PHP ist nicht mehr ok.
Das gleiche Verhalten bei PHP 5.2.6 auf openSUSE 11.1.
32 Bit scheint ok zu sein.
64 Bit scheint bis zu unixODBC und freeTDS ok zu sein.
PHP ist nicht mehr ok.
Hat jemand eine Idee?
Vielen Dank.
----------------------------
Hier sind die PHP-Skripte.
Nur die Tabellen im select Befehl unterscheiden sich.
PHP-Code:
error_reporting(E_ALL);
$dsn="Driver=FreeTDS;TDS_Version=8.0;Server=IP_to_SQL_Server;Port=1433;Database=database_to_connect;UID=user;PWD=password";
$connect = odbc_connect($dsn, "user", "password");
print "Connect: $connect";
$query = "SELECT * FROM table";
$result = odbc_exec($connect, $query);
while(odbc_fetch_row($result)) {
$field1 = odbc_result($result, 1);
$field2 = odbc_result($result, 2);
$field3 = odbc_result($result, 3);
$field4 = odbc_result($result, 4);
print("$field1 $field2 $field3 $field4\n");
print "<hr>";
}
odbc_close($connect);