scheissekonfiguriert.de


01. Dezember 2025

FreeTDS mit MSSQL und PHP

so, die Scheise lööft. War aber bisschen unwillig, und zwar:

$connectstring = 'DRIVER={FreeTDS};SERVERNAME=hop;DATABASE=PHOPL1';
$conn = odbc_connect($connectstring, $un, $up); // hinten user name, user pwd

1. Hürde:

Im connectstring muss der “Servername” verwendet werden (was eigentlich ein FreeTDS-Serveralias ist, der außer in deren Konfiguration keine Bedeutung hat). Gibt man im connectstring stattdessen den Parameter SERVER an, wird dort eine echte Serveradresse (host) erwartet.

2. Hürde:

Ich benutze sehr oft Spaltenaliase in Abfragen. Die wurden hier nur leider ignoriert. Also ein

select foo bar from mytable

lieferte php-seitig den Inhalt der Spalte foo unter dem originalen Spaltennamen “foo” zurück und nicht unter dem Namen “bar”. Das ist natürlich Kacke, wenn man sowas wie sum(foo) oder foo + huschke im select statement hat, weil es dann gar keinen Spaltennamen gibt. Auf Spalten der Ergebnismenge über deren Position im select zugreifen zu müssen ist nicht witzig. Stellte sich raus, das ist ein Bug, auf dem die php-Spacken seit 8 Jahren sitzen, obwohl sogar ein patch mitgeliefert wurde beim Bugreport: https://bugs.php.net/bug.php?id=75534. Immerhin steht dort auch ein universeller workaround, weswegen die wohl noch weitere 8 Jahre sitzen bleiben, man packt ans Ende eines beliebigen select statements eine ansonsten sinnlose Variablendeklaration:

select foo bar from mytable; declare undderhuberblästdietuba tinyint

und schon kriegt php auch die Spaltenaliase. Das ist doch einfach nur gaga ;-)

Ergänzung:

Teil 1 erschließt sich, wenn man zwei Stunden mehrmals die ansonsten ziemlich gute FreeTDS-Doku durchliest ;-) Die bewirkt an der Stelle scheissekonfiguriert, ist aber eigentlich ein Fall für scheissedokumentiert.de.

Teil 2 ist einfach ein ewig ungefixter php-Bug, der einen Bug von FreeTDS berücksichtigte. FreeTDS hat vor > 8 Jahren die Stelle auf ihrer Seite vervollständigt, ein DB-Server gibt immer die Metadaten eines prepared statements zurück, die muss man im API halt nur auch alle auslesen, wenn man sie haben will ;-).

(Jedes statement ist irgendwann vor seiner Ausführung ein prepared statement, entweder explizit/als separate Aktion “prepare” vom API oder sogar der Anwendung aus oder halt implizit durch den Server, aber übersetzen muss der das statement immer, und dann liegen dessen Metadaten vor, und die funkt er auch zurück.)

Aber die php-maintainer haben auf FreeTDSens Bugfix nicht reagiert, gehen immer noch davon aus, dass sie an der Stelle keine vollständigen Metadaten kriegen. Daran hängts hier.

Dass der workaround funktioniert, liegt garantiert daran, dass php bei Vorkommen von “declare” ein statement als Stored-Procedure-Code ansieht und dann genauer hinguckt und mehr Kontext ausliest - den es seit Ewigkeiten von FreeTDS auch bei normalen select statements kriegen könnte. Wetten? ;-)

Ich hab mal geguckt, scheissedokumentiert.de und scheissemaintained.de sind noch frei, das wären hübsche Schwesterseiten zu scheissekonfiguriert.de, da könnte man fein hin- und herverlinken.

(Danke Volker)


© 2013 — 2026 WofFS CC-BY-SA powered by Hakyll

lies weiter auf normalkaputt.de!